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:
- 打开项目的
Info.plist
文件。 - 添加
NSAppTransportSecurity
类型为Dictionary
。 - 在
NSAppTransportSecurity
下添加NSAllowsArbitraryLoads
类型为Boolean
,并将值设置为YES
。
配置如下图所示:
<!-- Info.plist 文件配置 -->
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
方法二:针对性解除 ATS 限制
全面禁用 ATS 虽然方便,但不推荐,特别是要提交到 App Store 的应用可能会被拒绝。为此,可以只对特定的域名禁用 ATS 限制。
- 打开项目的
Info.plist
文件。 - 添加
NSAppTransportSecurity
类型为Dictionary
。 - 在
NSAppTransportSecurity
下添加NSExceptionDomains
类型为Dictionary
。 - 在
NSExceptionDomains
下添加需要例外处理的域名(如example.com
),类型为Dictionary
。 - 在域名对应的 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>
示例讲解
假设我们有一个应用需要访问 http://example.com
,我们可以按以下步骤进行配置:
- 在 Xcode 中打开项目的
Info.plist
。 - 右键选择
Info.plist
中的空白区域,选择Add Row
。 - 输入
NSAppTransportSecurity
并将其类型设置为Dictionary
。 - 在
NSAppTransportSecurity
下添加NSExceptionDomains
类型为Dictionary
。 - 在
NSExceptionDomains
下添加访问的域名example.com
,类型为Dictionary
。 - 在域名对应的 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 迁移。这样不但能符合苹果的安全要求,还能增强用户的信任感。
注意事项
- 逐步更新:即使项目现在使用 HTTP 协议,也应该计划逐步迁移到 HTTPS,确保数据传输的安全性。
- 审核标准:在提交到 App Store 时,苹果会严格审查 ATS 配置,确保应用符合安全标准。全面禁用 ATS 可能导致应用被拒绝,建议对特定域名禁用 ATS。
- 用户数据保护:无论是 HTTP 还是 HTTPS,都应该做好数据的加密和保护,尤其是在处理敏感信息时。
结语
在应用开发中,建议尽可能使用 HTTPS 以提升数据传输的安全性;如果暂时无法切换到 HTTPS,可以通过合理配置 Info.plist
来临时禁用 ATS,确保项目正常运行。希望这篇文章能帮助到你,更好地应对 Xcode 7 及以上版本对于网络请求的新要求。