Android高版本http网络请求失败的Cordova配置处理
参考此文追加说明及处理方案:Android P http网络请求失败
问题出现的原因是因为Android高版本(Android 6.0)以上默认使用TLS保护用户信息,详见以下文档: Transport Layer Security
摘录关键信息如下:
Android致力于保证其用户、设备和数据的安全。我们保证数据安全的一种方式是通过保护所有进入或离开使用TLS技术的Android设备数据。正如我们在Android P开发人员预览版中所宣布的那样,我们通过默认阻止Android P应用使用未加密连接通信来进一步提升安全性。 这是我们多年来为保护Android用户所做的各种更改。为了防止意外的未加密连接,我们在Android Marshmallow(安卓6.0)中引入了android:usesCleartextTraffic 这样一个manifest属性。在Android Nougat(安卓7.0)中,我们通过创建网络安全配置(Network Security Config)功能扩展了该属性,该功能允许应用程序警告开发者在没有加密的情况下发送网络流量。在Android Nougat(安卓7.0)和Oreo(安卓8.0)中,我们仍然允许明文连接。
简单地说,在Android高版本对非加密的明文传输有要求,也即默认启用了TLS保护,使得该应用无法进行http网络请求,而https则不会受影响,同样地,如果应用嵌套了webview也会受这限制。
针对这种情况,有以下解决方案:
- 使用https。条件允许的话,建议使用,以增强安全性。
- Android编译的targetSdkVersion改为27以下。因为是高版本才出现的,那可以降维处理;
- 在AnroidManifest.xml中的application添加设置项:
<application android:usesCleartextTraffic="true">
- 添加网络安全配置。在res的xml目录下,新建一个network_security_config.xml文件(名称随便取):
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />
</network-security-config>
然后在AnroidManifest.xml中的application添加指向该文件的设置项:
android:networkSecurityConfig="@xml/network_security_config"
其中,第1、2种方案都是有条件要求的,而第4种是第3种的扩展使用。对于我们一般使用来说,其实也不需要用到特别的安全策略。
综合考量,第3种方案个人认为会好点,Cordova配合其使用也很简单:
在config.xml文件中,在 <platform name="android"/>
节点内添加配置项即可:
<edit-config file="AndroidManifest.xml" mode="merge"
target="/manifest/application">
<activity android:usesCleartextTraffic="true" />
</edit-config>
这样Cordova build的时候就会把上面配置合并到AnroidManifest.xml中。
- 图书管理系统【部署开发环境、解决分类、图书、前台页面模块】
- 图书管理系统【用户、购买、订单模块、添加权限】
- 04-02.总结switch,for,while,do。while跳转语句
- 图书管理系统【总结】
- JDBC【PreparedStatment、批处理、处理二进制、自动主键、调用存储过程、函数】
- JDBC【事务、元数据、改造JDBC工具类】
- JDBC【数据库连接池、DbUtils框架、分页】
- HTTP常见面试题
- Java基础-18(01)总结Map,HashMap,HashMap与Hashtable区别,Collections工具类
- 一个oracle查询引起的bug (r4笔记第59天)
- Java基础-18(02)总结Map,HashMap,HashMap与Hashtable区别,Collections工具类
- 特殊的物化视图刷新 (r4笔记第77天)
- 通过单例模式模拟RAC连接 (r4笔记第76天)
- 网站上的验证码是怎么产生的?
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ReconSpider:一款功能强大的高级OSINT框架
- Python 3.9来了!这十个新特性值得关注
- IRFuzz:一款基于YARA规则的文档文件扫描工具
- 内网渗透测试研究:从NTDS.dit获取域散列值
- 腾讯云大禹高防IP之客户端获取真实IP
- 终极解密输入网址按回车到底发生了什么
- Kafka核心原理的秘密,藏在这 17 张图中
- 国庆肝了8天整整2W字的数据库知识点
- MySQL事务与MVCC如何实现的隔离级别
- 1.5w字,30图带你彻底掌握 AQS!
- 原创 | codeforces 1419D2,有趣的思维题
- 如何实现四元数的运算
- 最牛一篇布隆过滤器详解
- 编写一个IDEA插件之:开发环境准备那些坑
- 编写一个IDEA插件之:使用PSI分析Java代码