在 Xcode 9.2 中禁用应用程序传输安全?

Disable App Transport Security in Xcode 9.2?

我无法在 Xcode 9.2 中禁用应用程序传输安全 (ATS)。当 运行 像这样针对我的本地服务器环境构建时,我(多年来)一直在禁用 ATS:

<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 "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,这是我不想要的。

这是超级基础项目的 link,它在 Xcode 9.1 中有效,但在 9.2 (https://github.com/chrismanderson/ats-sample) 中失败。

我也试过为本地 store.dev 域禁用 ATS,同样,它适用于 Xcode 9.1,但不适用于 9.2。

我最初并没有把它放在一起,但我认为发生的事情是 iOS 11,Apple 支持 HSTS. I believe that support for HSTS preload lists, in combination with Google recently adding the .dev TLD to the HSTS preload list,很可能导致 iOS 尝试强制您使用 https,这是失败的(我错过了您正在尝试使用 .dev 本地域进行测试,这确实是这里的关键要素)。

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

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

在 XCode 屏幕左侧的导航器中,单击您的主项目文件,其中存储了所有文件和文件夹。单击“信息”选项卡。在 "Custom iOS Target Properties" 下,您曾经看到一个用于更改 App Transport Security Settings (ATS) 的选项。它没有明确说明,但仍然可用。

当您将鼠标悬停在选项上时,您应该会在一个小圆圈中看到 +。点击它。 XCode 将提示您创建一个 "Application Category"。在出现的列表中,向上滚动并 select "App Transport Security Settings"。

点击那个选项。创建后,它会提示您更改 BOOL 值(默认值应为 "NO")。在最右边,您应该看到一组向上和向下箭头。单击此处将 BOOL 更改为是。