httpdns_ios_demo[272:26192] error: Error Domain=NSURLErrorDomain Code=-1022 "The resource could not be loaded because the App Transport Security policy requires the use of a secure connection." UserInfo={NSErrorFailingURLStringKey=http://210.192.117.229/, NSErrorFailingURLKey=http://210.192.117.229/, NSLocalizedDescription=The resource could not be loaded because the App Transport Security policy requires the use of a secure connection., NSUnderlyingError=0x165e36e0 {Error Domain=kCFErrorDomainCFNetwork Code=-1022 "(null)"}}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您提供的错误信息,Error Domain=NSURLErrorDomain Code=-1022
表明在 iOS 9 平台上,由于 App Transport Security (ATS) 的默认配置限制了非 HTTPS 请求,导致 HTTPDNS 的请求失败。而在 iOS 10 及以上系统中没有问题,可能是因为 ATS 的行为或系统的兼容性有所调整。
HTTPDNS 使用 IP 直连的方式发送网络请求,理论上不依赖域名解析,因此不受 ATS 的直接影响。然而,如果 HTTPDNS 返回的 IP 地址被用于构建 HTTP 请求(而非 HTTPS),则会触发 ATS 的限制。
如果您需要快速解决该问题,可以通过修改 Info.plist
文件来关闭 ATS 的限制。具体步骤如下:
在 Info.plist
文件中添加以下字段:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
说明:此配置允许 App 发送任意的 HTTP 请求,绕过 ATS 的限制。但请注意,这种方式会降低应用的安全性,建议仅在调试阶段使用。
如果您的应用需要同时支持 HTTPS 和 HTTPDNS 的 IP 直连,可以为特定的 IP 或域名配置 ATS 异常。具体步骤如下:
在 Info.plist
文件中添加以下字段:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>210.192.117.229</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
</dict>
</dict>
</dict>
说明:此配置允许指定的 IP 地址(如 210.192.117.229
)通过非 HTTPS 的方式访问,同时保留其他请求的 ATS 安全性。
为了进一步提升兼容性和安全性,您可以对 HTTPDNS 的配置进行优化:
启用 HTTPS 请求:确保 HTTPDNS 的解析请求通过 HTTPS 方式发送。
[httpdns setHTTPSRequestEnabled:YES];
设置持久化缓存:开启本地缓存功能,减少对网络解析的依赖。
[httpdns setPersistentCacheIPEnabled:YES];
允许使用过期 IP:当域名的 IP 配置较为稳定时,可以启用此功能。
[httpdns setReuseExpiredIPEnabled:YES];
如果您的应用在使用 HTTPDNS 时涉及自建证书,可能会触发证书验证失败的问题。请参考以下解决方案:
if (result == kSecTrustResultRecoverableTrustFailure) {
CFDataRef errDataRef = SecTrustCopyExceptions(serverTrust);
SecTrustSetExceptions(serverTrust, errDataRef);
SecTrustEvaluate(serverTrust, &trustResult);
}
确保您使用的 Xcode 版本和 HTTPDNS SDK 是最新的。旧版本可能存在兼容性问题,尤其是在 iOS 9 系统上。
[httpdns setLogEnabled:YES];
通过上述方法,您可以有效解决 HTTPDNS 在 iOS 9 平台上的报错问题,同时保持应用的安全性和稳定性。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。