【发布时间】:2018-05-20 18:27:13
【问题描述】:
我无法在 Xcode 9.2 中禁用 App Transport Security (ATS)。在针对我的本地服务器环境运行构建时,我一直(多年来)禁用 ATS,如下所示:
Transport security has blocked a cleartext HTTP
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
在 Xcode 9.2 中,一个简单的请求(以 http 模式针对本地 Rails 应用程序运行):
let session = URLSession(configuration: .default)
let url = URL(string: "http://store.dev/api/products.json")!
let task = session.dataTask(with: url) { data, response, error in
print(data)
print(response)
print(error)
}
task.resume()
失败并显示错误消息
Error Domain=NSURLErrorDomain Code=-1200 “发生 SSL 错误,无法与服务器建立安全连接。” UserInfo={_kCFStreamErrorCodeKey=-9802, NSLocalizedRecoverySuggestion=您是否仍要连接到服务器?, NSUnderlyingError=0x60c00024afb0 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802}}, NSLocalizedDescription=发生 SSL 错误,无法与服务器建立安全连接。, NSErrorFailingURLKey=https://store.dev/api/products.json, NSErrorFailingURLStringKey=https://store.dev/api/products.json, _kCFStreamErrorDomainKey=3}
这个完全相同的请求(同样的项目也是如此)在 Xcode 9.1 上成功。
在这两种情况下,我都针对 iOS 11.1 部署目标进行构建。您可以看到 Xcode 正在将 url 从 http 更改为 https,这是我不想要的。
这是一个在 Xcode 9.1 中工作但在 9.2 中失败的超级基本项目的链接 (https://github.com/chrismanderson/ats-sample)。
我还尝试仅针对本地 store.dev 域禁用 ATS,同样,它适用于 Xcode 9.1,但不适用于 9.2。
【问题讨论】:
-
它在 11.x 模拟器中似乎无法正常工作。也许现在尝试在 iOS 10 模拟器上运行。不过,这肯定需要为其提交雷达。 forums.developer.apple.com/thread/93298
-
刚刚看到您使用的是 .dev 域。正在 Twitter 上阅读有关 Google 现在对所有 .dev 流量强制执行 HTTPS 的 HSTS 预加载。有关详细信息,请参阅下面的答案。
标签: ios ssl app-transport-security xcode9.2