前言:
使用后端本地ip地址时,网络请求正常,更换为公网服务器地址后,接口报错:
ERROR Request failed: [TypeError: Network request failed]
原因:
• iOS 默认限制非 HTTPS 请求,所以如果公网地址使用的是 HTTP 而不是 HTTPS,iOS 可能会阻止请求。
• 如果你的服务器使用 HTTP,可能需要在 Info.plist 中临时允许非加密请求,但建议迁移到 HTTPS。
解决:
在Info文件添加以下代码,将81.152.193.120
替换为你的公网服务器地址:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
<key>NSAllowsLocalNetworking</key>
<true/>
<key>NSExceptionDomains</key>
<dict>
<key>81.152.193.120</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
<key>localhost</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
NSAllowsArbitraryLoads:
将 NSAllowsArbitraryLoads 设置为 true,临时允许应用程序在全局范围内使用非 HTTPS 连接。iOS 默认要求使用 HTTPS,启用此项绕过了这一限制。
NSAllowsLocalNetworking:
允许应用访问局域网内的设备和资源(如 localhost 或内网 IP 地址)
NSExceptionDomains:
通过 NSExceptionDomains 字段,你可以为特定的域名(包括 IP 地址)设置例外规则
NSIncludesSubdomains:
设为 true 后,允许对该域及其所有子域的非 HTTPS 请求。例如,如果 112.150.155.145 有子域名 subdomain.112.150.155.145,它也会被允许。
NSExceptionAllowsInsecureHTTPLoads 和 NSTemporaryExceptionAllowsInsecureHTTPLoads:
这两项临时允许对指定域名的非 HTTPS 请求。在安全性上,建议将这些配置作为临时解决方案,因为苹果鼓励所有流量使用 HTTPS 加密。
NSTemporaryExceptionMinimumTLSVersion:
设置了最低的 TLS 版本(如 TLSv1.1),允许对特定的 HTTPS 连接使用较低版本的 TLS,这可以确保一些较旧的服务器或配置不被拒绝访问。
总结:
通过 Info.plist 中这些配置,iOS 可以绕过默认的 HTTPS 安全要求,使应用程序可以在特定的域名或 IP 地址上使用 HTTP 请求。如果公网服务器支持 HTTPS,建议将这些配置移除并使用 HTTPS 以提升安全性。