release 版本 apk 无法发起 axios 请求
最近在开发阶段,你可能会发现一个奇怪的问题,在部分高系统版本的手机上 release 包无法正常获取数据,但是 debug 模式下却可以。这实际上是 Android 对于不安全的 http 请求的限制,在开发过程中,后端提供给我们的接口往往是内网 ip,并且没有使用证书进行加密。为了能够在 release 包中正常的发起 http 请求,我们只需要在配置文件中添加一定的配置即可:
Android:
AndroidManifest.xml 文件中:
- 确保添加了使用网络的权限
<uses-permission android:name="android.permission.INTERNET" />
- 在 application 标签中设置如下属性:
android:usesCleartextTraffic="true"
注意:这里是最容易漏掉的!!!超级大坑!
android:usesCleartextTraffic="true"的含义:
在 Android 应用开发中,
android:usesCleartextTraffic="true"
是一个用于 AndroidManifest.xml 文件中<application>
或<activity>
元素的属性。这个属性的作用是指示应用允许使用明文传输的网络流量,即非加密的流量。在 Android 9(API 级别 28)及更高版本中,默认情况下,Android 系统禁止应用使用明文传输的网络通信,这是为了提高应用的安全性。如果你的应用需要与服务器进行非加密的通信,你需要在 AndroidManifest.xml 文件中使用
android:usesCleartextTraffic="true"
属性,以允许应用发送和接收明文网络流量。但需要注意的是,开启明文传输可能会带来安全风险,因为它使得网络通信中的数据容易受到窃听和中间人攻击。因此,在可能的情况下,最好使用加密的通信协议(如 HTTPS)来保护网络通信的安全性。
说白了:就是允许我们前端调用http开头的后端地址!!!
- 如果要在原生代码中使用废弃 HttpClient 发 http 请求,则需要添加如下标签:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
这在 Android 开发者文档中也有提及。
注意:AndroidManifest.xml 文件有 release 和 debug 版本的区别,分别在以下的位置:
iOS:
iOS 中也有对于不安全的 http 请求的限制,我们只要保证在 info.plist 文件中添加如下键值对即可:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>localhost</key>
<dict>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>