Flutter打包APK成功后向API发送请求失败如何解决?
问题原因
- Android 9(API Level 28)及以上系统默认禁止明文HTTP请求,你调用的接口是
http开头的内网地址,属于明文请求类型,Debug模式下默认开启了明文请求权限不会触发拦截,Release打包后就会被系统拦截导致请求无法发出。 - 打包时未在Android配置文件中声明网络权限,导致Release版应用没有网络访问权限。
解决方法
步骤1:添加网络权限
打开Android项目路径下的android/app/src/main/AndroidManifest.xml,在<manifest>根标签内、<application>标签外添加网络权限声明:
<uses-permission android:name="android.permission.INTERNET" />
步骤2:配置明文请求权限
以下两种方案二选一即可:
方案A:全局允许明文请求(仅推荐测试阶段使用)
修改上述AndroidManifest.xml,在<application>标签中新增android:usesCleartextTraffic="true"属性:
<application android:label="你的应用名称" android:name="${applicationName}" android:icon="@mipmap/ic_launcher" <!-- 新增此行配置 --> android:usesCleartextTraffic="true">
方案B:仅允许指定域名的明文请求(安全性更高,推荐正式环境使用)
- 在
android/app/src/main/res目录下新建xml文件夹,在该文件夹内新建network_security_config.xml文件,写入如下配置:
<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <!-- 此处填写你要允许访问的内网IP或域名 --> <domain includeSubdomains="true">192.168.1.9</domain> </domain-config> </network-security-config>
- 回到
AndroidManifest.xml的<application>标签,添加网络安全配置引用:
<application android:label="你的应用名称" android:name="${applicationName}" android:icon="@mipmap/ic_launcher" <!-- 新增此行配置 --> android:networkSecurityConfig="@xml/network_security_config">
iOS端适配(如果需要打iOS包)
iOS系统默认同样禁止明文HTTP请求,需要在ios/Runner/Info.plist的<dict>标签内添加如下配置:
<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
所有配置修改完成后,重新打包APK即可生效。
内容的提问来源于stack exchange,提问作者Proud
相关产品推荐
相关产品推荐

