gpt4 book ai didi

swift - NSURLConnection 到 NSURLSession

转载 作者:行者123 更新时间:2023-11-30 10:04:14 25 4
gpt4 key购买 nike

我是 Swift 和 NSURLConnection 和 NSURLSession 的新手。我有这段代码,可以加载网页并且可以工作。但我收到这个警告,指出 NSURLConnection 在 iOS 9.0 中已被弃用,我必须使用 NSURLSession。

这是我的代码:

var authenticated:Bool = false
var urlConnection:NSURLConnection!

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
if !authenticated {
self.authenticated = false
self.urlConnection = NSURLConnection(request: request, delegate: self)!
urlConnection.start()
return false
}
return true
}

// We use this method is to accept an untrusted site which unfortunately we need to do, as our PVM servers are self signed.
func connection(connection: NSURLConnection, canAuthenticateAgainstProtectionSpace protectionSpace: NSURLProtectionSpace) -> Bool {
return (protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust)
}

func connection(connection: NSURLConnection, didReceiveAuthenticationChallenge challenge: NSURLAuthenticationChallenge) {
if challenge.previousFailureCount == 0 {
self.authenticated = true
let credential: NSURLCredential = NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!
)
challenge.sender!.useCredential(credential, forAuthenticationChallenge: challenge)
}
else {
challenge.sender!.cancelAuthenticationChallenge(challenge)
}
}

func connection(connection: NSURLConnection, didReceiveResponse response: NSURLResponse) {
// remake a webview call now that authentication has passed ok.
self.authenticated = true
web.loadRequest(request)
// Cancel the URL connection otherwise we double up (webview + url connection, same url = no good!)
urlConnection.cancel()
}

这有效。现在我想将其“转换”为 NSURLSession,但我似乎无法管理。有人可以帮我解决这个问题吗?我很确定对于编码能力很强的人来说这并不是那么困难。

我曾多次尝试更改为 NSURLSession,但每次都会遇到此错误:NSURLSession/NSURLConnection HTTP 加载失败(kCFStreamErrorDomainSSL,-9813)。有了 NSURLConnection 问题就解决了。

这是我使用 NSURLSession 时的尝试之一:

var authenticated:Bool = false
var urlSession:NSURLSession!
var urlSessionConfig:NSURLSessionConfiguration!

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
if !authenticated {
self.authenticated = false
self.urlSessionConfig = NSURLSessionConfiguration.defaultSessionConfiguration()
self.urlSession = NSURLSession(configuration: self.urlSessionConfig, delegate: self, delegateQueue:NSOperationQueue.mainQueue())

let task = self.urlSession.dataTaskWithRequest(request){

(myData, myResponse, myError) -> Void in

if(myError == nil){

if(self.authenticated){
self.web.loadRequest(request)
}

}

}
task.resume()
return false
}
return true
}


func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) {

if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust){

if(challenge.protectionSpace.host == "mydomain.org"){
self.authenticated = true
let credential = NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!)
completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential,credential);

}
}
}

最佳答案

不必使用 NSURLSession。考虑到 NSURLConnection 的使用范围,它很可能会一直处于半支持状态,直到时间结束。

话虽如此,我只会说一次,所以请仔细听。在任何情况下,都不要公开发布此代码的任何一个书面版本。自签名证书是可以的,只要你检查得当。这段代码并没有这样做,这使得它们并不比 HTTP 更好

  • 如果必须对数据保密,请使用真实证书或添加代码来正确验证自签名证书。
  • 如果保密一点也不重要,就使用 HTTP。

本文档介绍了如何通过添加对特定证书的信任来正确实现修改后的 TLS 链验证:

https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/NetworkingTopics/Articles/OverridingSSLChainValidationCorrectly.html

顺便说一句,您没有在其他保护空间或其他主机名中做任何有挑战性的事情。如果您从不调用完成处理程序,那么请求任何其他类型身份验证的任务将永远悬而未决,等待您决定如何处理身份验证请求。这可能不是您想要的,尽管我怀疑它会导致您的问题,除非您位于代理后面。您的 NSURLConnection 代码在单个保护空间内接受了挑战,因此它可能不会遇到该问题(那么多)。

话虽如此,我不明白为什么会因该错误代码而失败,除非证书除了自签名之外还有其他问题。哦,方法声明中缺少下划线。我认为这不再重要,但我不确定。确保您的委托(delegate)方法确实被调用。

您还可以尝试将CFNETWORK_DIAGNOSTICS环境变量设置为1(或更大),看看是否可以提供任何进一步的见解。

关于swift - NSURLConnection 到 NSURLSession,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36935686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com