小编典典

App Transport Security Xcode 7测试版6

swift

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

我收到的错误是:

由于不安全,App Transport
Security阻止了明文HTTP(http://)资源加载。可以通过应用程序的Info.plist文件配置临时异常。
进行API调用时出错:Error Domain = 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文件进行了所有这些更改,并且该答案是唯一解决可能性的方法。其他答案提供的解决方案没有错,因此遇到此问题的其他任何人都应该尝试一下,因为它们是有效的。希望这对遇到类似问题的人有所帮助。


阅读 213

收藏
2020-07-07

共1个答案

小编典典

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

我敢肯定,这是典型的业余错误,但是在Project
Navigator中只有两行之隔,直到我注意到两者之间的区别,这让我感到沮丧。以为我会提到它,以防万一您遇到同样的问题。

2020-07-07