Android 9.0强制使用https,会阻塞http请求,如
Android 9.0强制使用https,会阻塞http请求,如果app使用的第三方sdk有http,将全部被阻塞。
出现UnknownServiceException: CLEARTEXT communication to localhost not permitted by network security policy或者IOException java.io.IOException: Cleartext HTTP traffic to * not permitted
就说明,你需要去兼容了。最简单的兼容方式是在AndroidManifest文件的application设置android:usesCleartextTraffic="true"。这是第一种方式。
可以参考stackoverflow的回答
以及Android P - CLEARTEXT communication not permitted by network security policy
第二种方式:网络安全性配置
在AndroidManifest文件的application节点配置android:networkSecurityConfig="@xml/network_security_config"
xml中的配置具体的配置。
可以参考我的配置
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<!--默认配置,明文通信,使用系统证书-->
<base-config cleartextTrafficPermitted="true">
<trust-anchors>
<!--trust system while release only-->
<certificates src="system" />
</trust-anchors>
</base-config>
<!--自己服务器,使用https,将所有域名添加到此-->
<domain-config cleartextTrafficPermitted="false">
<domain includeSubdomains="true">xxx.xxx.com</domain>
<!--<trust-anchors>-->
<!--<certificates src="@raw/my_proxy_ssl_proxying_certificate" />-->
<!--</trust-anchors>-->
</domain-config>
<!--debug模式,可以使用用户自己安装的正式,比如charles抓包安装的证书,这个配置只在 android:debuggable 为 "true" 时将应用的重写,IDE 和构建工具生成的非发布版本通常属于此情况-->
<debug-overrides>
<!-- Trust user added CAs while debuggable only -->
<trust-anchors>
<certificates src="system" />
<certificates src="user" />
</trust-anchors>
</debug-overrides>
</network-security-config>
第二种方式才是最好的方式,具体参考官方文档security-config
还有就是如果在请求https的时候抛出javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found. 请检查手机是不是设置了代理。android7.0之后不特殊处理,是无法抓取https。
把android官方文档放这里,可以自己查阅通过https和SSL确保安全(https://developer.android.com/training/articles/security-ssl?hl=zh-cn)