Android P之后关于网络的小知识点

如果你的应用之前使用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点整,不能在写了,看我的全职去了。

参考链接

推荐阅读更多精彩内容