开发者社区 问答 正文

采用ATS的默认配置,httpdns 在iOS9平台上报错,在iOS10及以上系统没有问题

采用ATS的默认配置,httpdns 在iOS9平台上报错,在iOS10及以上系统没有问题

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)"}}

展开
收起
1001694723371122 2019-04-25 11:39:11 667 分享 版权
阿里云 AI 助理回答

问题分析

根据您提供的错误信息,Error Domain=NSURLErrorDomain Code=-1022 表明在 iOS 9 平台上,由于 App Transport Security (ATS) 的默认配置限制了非 HTTPS 请求,导致 HTTPDNS 的请求失败。而在 iOS 10 及以上系统中没有问题,可能是因为 ATS 的行为或系统的兼容性有所调整。

HTTPDNS 使用 IP 直连的方式发送网络请求,理论上不依赖域名解析,因此不受 ATS 的直接影响。然而,如果 HTTPDNS 返回的 IP 地址被用于构建 HTTP 请求(而非 HTTPS),则会触发 ATS 的限制。


解决方案

1. 临时解决方案:关闭 ATS 限制

如果您需要快速解决该问题,可以通过修改 Info.plist 文件来关闭 ATS 的限制。具体步骤如下:

  • Info.plist 文件中添加以下字段:

    <key>NSAppTransportSecurity</key>
    <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
    </dict>
    
  • 说明:此配置允许 App 发送任意的 HTTP 请求,绕过 ATS 的限制。但请注意,这种方式会降低应用的安全性,建议仅在调试阶段使用。


2. 推荐解决方案:为特定域名配置 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 安全性。


3. 优化 HTTPDNS 配置

为了进一步提升兼容性和安全性,您可以对 HTTPDNS 的配置进行优化:

  • 启用 HTTPS 请求:确保 HTTPDNS 的解析请求通过 HTTPS 方式发送。

    [httpdns setHTTPSRequestEnabled:YES];
    
    • 说明:此设置可以避免 HTTPDNS 的解析请求因 ATS 限制而失败。
  • 设置持久化缓存:开启本地缓存功能,减少对网络解析的依赖。

    [httpdns setPersistentCacheIPEnabled:YES];
    
    • 说明:此功能可以在 App 启动时复用上次缓存的 IP,提高解析效率。
  • 允许使用过期 IP:当域名的 IP 配置较为稳定时,可以启用此功能。

    [httpdns setReuseExpiredIPEnabled:YES];
    
    • 说明:此功能可以在无法及时获取最新解析结果时,使用已过期的 IP,避免请求失败。

4. 检查证书验证逻辑

如果您的应用在使用 HTTPDNS 时涉及自建证书,可能会触发证书验证失败的问题。请参考以下解决方案:

  • 在证书验证回调中处理异常情况:
    if (result == kSecTrustResultRecoverableTrustFailure) {
      CFDataRef errDataRef = SecTrustCopyExceptions(serverTrust);
      SecTrustSetExceptions(serverTrust, errDataRef);
      SecTrustEvaluate(serverTrust, &trustResult);
    }
    
    • 说明:此代码片段可以处理自建证书的验证问题,避免因证书无效导致的请求失败。

5. 升级 Xcode 和 SDK

确保您使用的 Xcode 版本和 HTTPDNS SDK 是最新的。旧版本可能存在兼容性问题,尤其是在 iOS 9 系统上。

  • 最低要求:Xcode 7.0 及以上版本。
  • 建议操作:升级到最新版本的 HTTPDNS SDK,并检查是否启用了鉴权接口。

总结与注意事项

  • 重要提醒:关闭 ATS 或配置异常时,请务必评估安全风险,避免敏感数据泄露。
  • 推荐实践:优先使用 HTTPS 请求,并结合 HTTPDNS 的优化配置,确保兼容性和性能。
  • 调试建议:在开发阶段启用日志功能,便于排查问题:
    [httpdns setLogEnabled:YES];
    

通过上述方法,您可以有效解决 HTTPDNS 在 iOS 9 平台上的报错问题,同时保持应用的安全性和稳定性。您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答