Skip to content

release 版本 apk 无法发起 axios 请求

鱼骨编程 2024-02-13基础React Native探索 609 个字 3 分钟

最近在开发阶段,你可能会发现一个奇怪的问题,在部分高系统版本的手机上 release 包无法正常获取数据,但是 debug 模式下却可以。这实际上是 Android 对于不安全的 http 请求的限制,在开发过程中,后端提供给我们的接口往往是内网 ip,并且没有使用证书进行加密。为了能够在 release 包中正常的发起 http 请求,我们只需要在配置文件中添加一定的配置即可:

Android:

AndroidManifest.xml 文件中:

  1. 确保添加了使用网络的权限
xml
<uses-permission android:name="android.permission.INTERNET" />
  1. 在 application 标签中设置如下属性:
xml
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开头的后端地址!!!

  1. 如果要在原生代码中使用废弃 HttpClient 发 http 请求,则需要添加如下标签:
xml
<uses-library android:name="org.apache.http.legacy" android:required="false"/>

这在 Android 开发者文档中也有提及。

注意:AndroidManifest.xml 文件有 release 和 debug 版本的区别,分别在以下的位置:

image-20240406020307142image-20240406020325749

iOS:

iOS 中也有对于不安全的 http 请求的限制,我们只要保证在 info.plist 文件中添加如下键值对即可:

xml
<key>NSAppTransportSecurity</key>
<dict>
	<key>NSAllowsArbitraryLoads</key>
	<true/>
	<key>NSExceptionDomains</key>
	<dict>
		<key>localhost</key>
		<dict>
			<key>NSExceptionAllowsInsecureHTTPLoads</key>
			<true/>
		</dict>
	</dict>
</dict>