iOS应用网络权限配置及NativeScript-Vue应用iOS网络故障排查
iOS从9.0版本开始引入了App Transport Security(ATS) 机制,默认强制应用使用HTTPS加密连接,同时需要明确声明网络权限。具体配置步骤如下:
配置ATS规则:
如果你需要访问HTTP资源(比如你的案例里的AWS域名),必须在项目的App_Resources/iOS/Info.plist文件中添加ATS例外配置。有两种方式:- 全局允许所有HTTP请求(不推荐,可能影响App Store审核):
在Info.plist的<dict>标签内插入:<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict> - 仅允许特定域名的HTTP请求(推荐,更安全):
针对你的目标域名asdfasdf.compute.amazonaws.com,添加精准例外:<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>asdfasdf.compute.amazonaws.com</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key> <true/> </dict> </dict> </dict>
- 全局允许所有HTTP请求(不推荐,可能影响App Store审核):
添加网络权限描述:
iOS 10及以后,需要在Info.plist中添加NSNetworkUsageDescription,说明应用需要网络权限的原因,避免审核被拒:<key>NSNetworkUsageDescription</key> <string>需要访问互联网获取应用数据</string>
你遇到的Error: Request failed with status code null是典型的ATS限制导致的——Android没有强制ATS规则,所以能正常访问,但iOS默认阻止了HTTP请求。按下面的步骤修复:
添加ATS例外配置:
按照上面的方法,在App_Resources/iOS/Info.plist中添加针对asdfasdf.compute.amazonaws.com的ATS例外(优先选精准域名的方式)。清理项目缓存并重新构建:
NativeScript有时候会缓存旧的配置,导致新的Info.plist不生效。执行以下命令彻底清理后重新运行:tns clean tns run ios --clean验证服务器可达性:
在iOS模拟器的Safari中输入http://asdfasdf.compute.amazonaws.com/name/,确认能正常返回数据。如果Safari也打不开,那可能是服务器本身的问题,或者模拟器的网络设置异常(虽然你说没代理,但可以检查下模拟器是否连接了正常的Wi-Fi)。可选:调整axios配置:
你的axios代码本身没问题,但如果API需要携带Cookie等凭证,可以尝试添加withCredentials: true:const api = axios.create({ baseURL: 'http://asdfasdf.compute.amazonaws.com', timeout: 2000, withCredentials: true });
完成这些步骤后,你的应用应该就能在iOS模拟器和真机上正常连接互联网了。
内容的提问来源于stack exchange,提问作者yukashima huksay

