应用程序传输安全 Xcode 7 beta 6

Posted

技术标签:

【中文标题】应用程序传输安全 Xcode 7 beta 6【英文标题】:App Transport Security Xcode 7 beta 6 【发布时间】:2015-12-02 08:07:18 【问题描述】:

我目前正在开发 Xcode 7 beta 6。我正在尝试向http://mySubdomain.herokuapp.com 发送“删除”请求

我收到的错误是:

App Transport Security 已阻止明文 HTTP (http://) 资源加载,因为它不安全。可以通过应用的 Info.plist 文件配置临时例外。 进行 API 调用时出错:错误域=NSURLErrorDomain 代码=-1022 无法加载资源,因为应用传输安全策略要求使用安全连接。 NSLocalizedDescription=无法加载资源,因为应用传输安全策略要求使用安全连接。,NSUnderlyingError=0x796f7ef0 Error Domain=kCFErrorDomainCFNetwork Code=-1022 "(null)"

在我的实际 API 调用中,我使用“https”而不是“http”,这实际上适用于我的 POST 请求。但是DELETE请求会抛出上述错误。

我在这里看到了涉及 pList 文件的解决方案,但没有一个对我有用。我在下面列出了我的尝试。

第一次尝试:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

第二次尝试:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>herokuapp.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSRequiresCertificateTransparency</key>
            <false/>
        </dict>
    </dict>
</dict>

最后,我什至像这样把所有这些临时密钥放进去:

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>herokuapp.com</key>
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryIncludesSubdomains</key>
                <true/>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSExceptionMinimumTLSVersion</key>
                <string>TLSv1.2</string>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.2</string>
                <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryThirdPartyExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSTemporaryThirdPartyExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSThirdPartyExceptionMinimumTLSVersion</key>
                <string>TLSv1.2</string>
                <key>NSTemporaryThirdPartyExceptionMinimumTLSVersion</key>
                <string>TLSv1.2</string>
                <key>NSRequiresCertificateTransparency</key>
                <false/>
                <key>NSTemporaryRequiresCertificateTransparency</key>
                <false/>
            </dict>
        </dict>
    </dict>

一切都没有运气!我总是得到同样的错误。 DELETE 请求的格式正确,因为当我从 Postman 手动执行时,我得到了所需的结果。

这是我实际的 API 调用方法的样子,以防万一这里可能出现问题:

class func makeDELETEALLRequest(completion: (error:Bool) -> Void) 
        let session = NSURLSession.sharedSession()
        let url = NSURL(string:"https://mysubdomain.herokuapp.com/42kh24kh2kj2g24/clean")
        let request = NSMutableURLRequest(URL: url!)
        request.HTTPMethod = "DELETE"

        let task = session.dataTaskWithRequest(request)  (data, response, error) -> Void in

            if (error != nil) 
                print("Error making API call: \(error!)")
                completion(error: true)
             else 
                let HTTPResponse = response as! NSHTTPURLResponse
                let statusCode = HTTPResponse.statusCode
                if (statusCode == 200)
                    print("Successfully deleted!")
                    completion(error: false)
                 else 
                    print("Different status code: \(statusCode)")
                    completion(error: true)
                
            
        
        task.resume()
    

我再次使用 Xcode 7 beta 6

关于我选择的答案 我选择正确的答案对我来说是正确的,因为我对项目中的错误 pList 文件进行了所有这些更改,而该答案是唯一解决这种可能性的答案。其他答案提供的解决方案没有错,因此遇到此问题的任何其他人都应该尝试一下,因为它们是有效的。我希望这对遇到类似问题的人有所帮助。

【问题讨论】:

检查 Web URL 可接受性的指南是可用的medium.com/@Mrugraj/app-transport-security-b7910c4fc70f。这可能有助于理解未来 第一次尝试在我的情况下工作,我觉得它有帮助,所以我对你竖起大拇指 【参考方案1】:

感谢您尝试将以下内容添加到您的 plist 文件中:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

...您可能想尝试更改您的线路:

let url = NSURL(string:"https://mysubdomain.herokuapp.com/42kh24kh2kj2g24/clean")

到:

let url = NSURL(string:"http://mysubdomain.herokuapp.com/42kh24kh2kj2g24/clean")

如果您尝试过此操作,我们深表歉意。当您认为自己已经用尽所有途径时,我可以理解这是多么令人沮丧。

但是,当我在 Xcode 7 上运行我的应用程序以便我可以测试我们的应用程序时,一开始就出现了“应用程序传输安全”问题。我们正在使用基于 Oracle 的 Web 服务,现在开始为基于 SSL 的 HTTP 配置数字证书为时已晚。所以,上面添加到我的 plist 文件中就可以了。感谢您说您已经尝试过。但是,只是为了帮助其他人,它确实对我有用。它需要,因为我没有立即在我们的 Oracle 机器上启用 SSL 的方法。

【讨论】:

【参考方案2】:

我已经通过在 info.plist 中添加一些键来解决它。因为我正在将目标 C 用于某些本机应用程序。

我遵循的步骤是:

    打开了我的项目info.plist 文件

    添加了一个名为 NSAppTransportSecurity 的密钥作为 Dictionary

    添加了一个名为NSAllowsArbitraryLoads 的子键为Boolean,并将其值设置为YES,如下图所示。

清理项目,现在一切都像以前一样运行良好。

参考链接:

    https://***.com/a/32631185/2905967

    https://***.com/a/32609970

【讨论】:

【参考方案3】:

我已解决为 plist 文件。 1. 添加NSAppTransportSecurity : Dictionary. 2.添加子键NSAllowsArbitraryLoadsBoolean : YES

效果很好。

【讨论】:

很适合我【参考方案4】:

在升级到 xCode 7.0 后,我也无法覆盖 App Transport Security,并尝试了相同类型的解决方案,但均无济于事。离开它一段时间后,我注意到我对“MyAppName 测试”的支持文件下的 Info.plist 进行了更改,而不是项目本身中的更改。我项目中的 Supporting Files 文件夹没有展开,所以我什至没有注意到其中的 Info.plist。

我敢肯定,这是典型的业余错误,但它们在 Project Navigator 中仅相隔几行,这让我很沮丧,直到我注意到了区别。以为我会提到它以防您遇到同样的问题。

【讨论】:

【参考方案5】:

在 Xcode 8 和 Xcode 9 中

    打开我的项目 info.plist 文件 将名为 AppTransportSecurity 的键添加为字典。 添加一个名为 AllowsArbitraryLoads 的子键作为布尔值并将其值设置为 YES,如下图所示。

【讨论】:

以上是关于应用程序传输安全 Xcode 7 beta 6的主要内容,如果未能解决你的问题,请参考以下文章

我的空 swift 应用程序在部署目标 7.1 的 xcode6-beta 上崩溃

Xcode 7 beta (5 & 6) 看不到某些 VC 的 IBOutlets

XCode 7 beta 6 UI 测试 - 无法选择列表中的元素

升级到 Xcode 6 Beta 7 现在得到:文件 info.plist 无法打开,因为没有这样的文件

尽管将 info.plist 更改为 NSAppTransport Security 为 NO Xcode 7.2 iOS 9.2,但应用程序传输安全错误

将 Xcode 6 beta 6 更新到 beta 7 后出现“可选错误”