【发布时间】: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。这可能有助于理解未来
-
第一次尝试在我的情况下工作,我觉得它有帮助,所以我对你竖起大拇指