【问题标题】:Error with URLsession delegate functionURLsession 委托函数出错
【发布时间】:2015-06-26 09:11:37
【问题描述】:

我正在尝试与 URLSession 委托建立 ssl 连接,这是我收到的错误消息:

Objective-C 方法 'URLSession:didReceiveChallenge:completionHandler:' 提供​​的方法 'URLSession(:didReceiveChallenge:completionHandler:)' 与可选要求方法 'URLSession(:didReceiveChallenge:completionHandler:)' 冲突在协议'NSURLSessionDelegate'中

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

        let serverTrust: SecTrustRef = challenge.protectionSpace.serverTrust!
        let serverCert: SecCertificateRef = SecTrustGetCertificateAtIndex(serverTrust, 0).takeUnretainedValue()
        let serverKey: NSData = SecCertificateCopyData(serverCert).takeRetainedValue()

        let bundle: NSBundle = NSBundle.mainBundle()
        let mainbun = bundle.pathForResource("ca", ofType: "der")
        let key: NSData = NSData(contentsOfFile: mainbun!)!
     //   let turntocert: SecCertificateRef =
      //  SecCertificateCreateWithData(kCFAllocatorDefault, key).takeRetainedValue()

        if serverKey == key {

            let credential = NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!)

            challenge.sender!.useCredential(credential, forAuthenticationChallenge: challenge)

            completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential,credential)

        }

        else{

            challenge.sender!.cancelAuthenticationChallenge(challenge)
            completionHandler(NSURLSessionAuthChallengeDisposition.CancelAuthenticationChallenge, nil)

        }
}

func URLSession(session: NSURLSession, task: NSURLSessionTask, willPerformHTTPRedirection response: NSHTTPURLResponse, newRequest request: NSURLRequest, completionHandler: (NSURLRequest!) -> Void) {
    var newRequest : NSURLRequest? = request
    print(newRequest?.description);
    completionHandler(newRequest)
}

【问题讨论】:

    标签: ios swift cocoa-touch swift2 xcode7


    【解决方案1】:

    您现在使用 Swift 2 吗?更新到 Swift 2 时,我开始收到此错误。

    我可以通过将其更改为:

    func URLSession(session: NSURLSession, 
                    task: NSURLSessionTask, 
                    didReceiveChallenge challenge: NSURLAuthenticationChallenge,  
                    completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) 
                    -> Void) {
                // your code
    }
    

    【讨论】:

      【解决方案2】:

      正确的方法签名是:

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

      其中 NSURLCredential 参数必须是可选的(可选值后带有问号 (?))。

      apple documentation

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-09-30
        • 1970-01-01
        • 1970-01-01
        • 2017-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多