Xcode 7 App Transport Security has blocked a cleartext HTTP 报错解决办法

在 iOS 9 引入的 Xcode 7 及更高版本中,苹果加强了应用程序对数据传输安全性的要求。新特性 App Transport Security (ATS) 默认强制要求所有的网络请求使用 HTTPS 协议,以保护用户数据的完整性和安全性。在开发过程中,如果需要发送 HTTP 请求,将会遇到类似以下的报错:

“App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app’s Info.plist file”

为什么使用 HTTPS

HTTPS (HyperText Transfer Protocol Secure) 是基于 HTTP 协议的安全扩展版本,其通过 SSL/TLS 协议加密数据传输,确保数据在客户端和服务器之间传输过程中的安全性。主要优势包括:

  • 数据加密:防止数据在传输过程中被劫持或篡改。
  • 身份验证:确保客户端和服务器的身份都是可信的。
  • 数据完整性:防止数据在传输过程中被篡改。

然而,在实际开发过程中,由于历史原因或其他限制,有些项目仍然需要使用 HTTP 协议传输数据。为了兼顾安全性和实际需求,苹果允许开发者在 Info.plist 文件中配置临时例外。

解除 ATS 限制的配置方法

方法一:全面禁用 ATS

如果项目中所有的网络请求都需要使用 HTTP 协议,可以按照以下步骤全面禁用 ATS:

  1. 打开项目的 Info.plist 文件。
  2. 添加 NSAppTransportSecurity 类型为 Dictionary
  3. NSAppTransportSecurity 下添加 NSAllowsArbitraryLoads 类型为 Boolean,并将值设置为 YES

配置如下图所示:

<!-- Info.plist 文件配置 -->
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

方法二:针对性解除 ATS 限制

全面禁用 ATS 虽然方便,但不推荐,特别是要提交到 App Store 的应用可能会被拒绝。为此,可以只对特定的域名禁用 ATS 限制。

  1. 打开项目的 Info.plist 文件。
  2. 添加 NSAppTransportSecurity 类型为 Dictionary
  3. NSAppTransportSecurity 下添加 NSExceptionDomains 类型为 Dictionary
  4. NSExceptionDomains 下添加需要例外处理的域名(如 example.com),类型为 Dictionary
  5. 在域名对应的 Dictionary 下添加 NSIncludesSubdomains 类型为 Boolean,并将值设置为 YES
  6. 添加 NSExceptionAllowsInsecureHTTPLoads 类型为 Boolean,并将值设置为 YES

配置如下图所示:

<!-- Info.plist 文件配置 -->
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

示例讲解

假设我们有一个应用需要访问 http://example.com,我们可以按以下步骤进行配置:

  1. 在 Xcode 中打开项目的 Info.plist
  2. 右键选择Info.plist中的空白区域,选择 Add Row
  3. 输入 NSAppTransportSecurity 并将其类型设置为 Dictionary
  4. NSAppTransportSecurity 下添加 NSExceptionDomains 类型为 Dictionary
  5. NSExceptionDomains 下添加访问的域名 example.com,类型为 Dictionary
  6. 在域名对应的 Dictionary 下依次添加:
    • NSIncludesSubdomains 类型 Boolean,值 YES
    • NSExceptionAllowsInsecureHTTPLoads 类型 Boolean,值 YES

最终配置如下:

<!-- Info.plist 文件配置 -->
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

分析底层逻辑及注意事项

ATS 的工作机制

ATS 的工作机制主要是基于 SSL/TLS 协议,通过配置安全策略,确保所有网络请求使用 HTTPS 加密传输。如果使用 HTTP 请求,系统会自动拦截并拒绝该请求,除非在 Info.plist 中配置了对应的例外规则。

苹果建议和最佳实践

苹果建议开发者尽量使用 HTTPS 协议,以确保用户数据安全并提升应用的整体安全性。如果由于技术限制或者其它原因暂时无法全面切换到 HTTPS,可以临时配置例外,但在未来的开发和更新中,逐步向 HTTPS 迁移。这样不但能符合苹果的安全要求,还能增强用户的信任感。

注意事项

  1. 逐步更新:即使项目现在使用 HTTP 协议,也应该计划逐步迁移到 HTTPS,确保数据传输的安全性。
  2. 审核标准:在提交到 App Store 时,苹果会严格审查 ATS 配置,确保应用符合安全标准。全面禁用 ATS 可能导致应用被拒绝,建议对特定域名禁用 ATS。
  3. 用户数据保护:无论是 HTTP 还是 HTTPS,都应该做好数据的加密和保护,尤其是在处理敏感信息时。

结语

在应用开发中,建议尽可能使用 HTTPS 以提升数据传输的安全性;如果暂时无法切换到 HTTPS,可以通过合理配置 Info.plist 来临时禁用 ATS,确保项目正常运行。希望这篇文章能帮助到你,更好地应对 Xcode 7 及以上版本对于网络请求的新要求。

posted @ 2015-08-21 01:43  Mr.陳  阅读(38112)  评论(1编辑  收藏  举报