如果你的应用之前使用http协议进行网络请求,那么这篇文章就是专门为你写的。
为什么写这篇文章?
今天公司同事找我,说我写的下载库出问题了,What?我写的代码会有问题?这一套代码都用了好几年了,经历过好几个公司了,你说有问题?开玩笑!拿过来一调试,好家伙,真给我报异常了。然后搜索一波,发现是Android P之后Google默认使用了TLS保护,赶快写出来和大家分享一波。
现象
在下载http开头的链接文本时,报:
java.io.IOException: Cleartext HTTP traffic to npic.getremark.com not permitted
结果
下载不成功,报bug,我能怎么办?改呗。
解决方案
这里提供三种解决方案:
- 第一种 偷懒型解决办法:因为是Android P之后才会有这种情况,所以我们将targetSdkVersion降到28以下就可以了。当然,最简单快捷的方案。除非急着上线就可以这么干。
- 第二种 甩锅型解决办法:让后台将http修改为https,对,不是咱们的锅,凭啥让我改,你们改。
- 第三种 老实巴交型:后台又不改,又不让改到28以下,好吧,只能自己改了,不过改这种东西,至少得要个两天工期(两分钟搞定)。
好了,直接讲第三种解决方案,具体步骤如下:
- 在res的xml文件夹下面创建一个名为aserbao_downloader_config.xml的文件。(名字随意)
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
<base-config cleartextTrafficPermitted="true" />//允许连接到任意不安全的域
</network-security-config>
- 在AndroidManifest.xml文件中的application节点下,添加android:networkSecurityConfig="@xml/aserbao_downloader_config"即可。
好了,再运行一下,完美解决问题。
扩充内容
上面的创建文件内有注释叫做允许连接到任意不安全的域,那么如果想允许特定域咋整呢?不急,刚好官方文档有说,搬过来,比如想只支持aserbao.com这个域名进行明文链接,那么咱们可以这么写:
<network-security-config>
<domain-config cleartextTrafficPermitted =“true”>
<domain includeSubdomains =“true”> aserbao.com </ domain>
</ domain-config>
</ network-security-config>
好了,就写这么多吧,写多了怕消化不了,刚好8点整,不能在写了,看我的全职去了。
网友评论