在Xcode 9.2中禁用App Transport Security?

我无法在Xcode 9.2中禁用App Transport Security(ATS)。 我(多年来)在针对我的本地服务器环境运行构建时禁用了ATS。

NSAppTransportSecurity  NSAllowsArbitraryLoads   

在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 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={_kCFStreamErrorCodeKey=-9802, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, NSUnderlyingError=0x60c00024afb0 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802}}, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., 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。

我最初并没有将它整合在一起,但我认为正在发生的事情是,在iOS 11中,Apple正在支持HSTS 。 我相信支持HSTS预加载列表,结合Google最近将.dev TLD添加到HSTS预加载列表 ,可能会导致iOS尝试强制您使用https,这是失败的(我错过了您尝试使用一个.dev本地域进行测试,这真的是这里的关键元素)。

我认为您唯一的解决方案是将本地测试域更改为.dev域以外的域。 如果您这样做,您应该能够连接,并且它不会尝试强制您在本地开发环境中进行https。

简而言之,Google已获得.dev顶级域名的权利,并且最近将其添加到HSTS预加载列表中,以强制与.dev域名进行的所有通信都是安全的。 在支持HSTS预加载列表的设备上,这会导致所有流量通过HTTPS重定向,这将导致不支持HTTPS的服务器出错。

在XCode屏幕左侧的导航器上,单击主项目文件,其中存储了所有文件和文件夹。 单击“信息”选项卡。 在“自定义iOS目标属性”下,您曾经看到一个用于更改应用程序传输安全设置(ATS)的选项。 它没有明确说明,但仍然可用。

当您将鼠标hover在选项上时,您应该在小圆圈中看到+ 。 点击它。 XCode将提示您创建“应用程序类别”。 在出现的列表中,向上滚动并选择“App Transport Security Settings”。

单击该选项。 一旦创建它,​​它应该提示您更改BOOL值(默认值应为“NO”)。 在最右边,你应该看到一组向上和向下箭头。 单击此按钮可将BOOL更改为yes。