2015-09-14 131 views
0

我想在Swift 2.0 Alamofire库中调试SSL问题。我使用的是自定义的Alamofire经理建立这样一个自定义ServerTrustPolicy:查找完成声明处理程序

static let manager: Manager = { 
    let serverTrustPolicies: [String: ServerTrustPolicy] = [ 
     "localhost": .PinCertificates(
      certificates: ServerTrustPolicy.certificatesInBundle(), 
      validateCertificateChain: false, 
      validateHost: false 
     ) 
//  "localhost": .DisableEvaluation 
    ] 

    let configuration = NSURLSessionConfiguration.defaultSessionConfiguration() 
    configuration.HTTPAdditionalHeaders = Alamofire.Manager.defaultHTTPHeaders 

    return Alamofire.Manager(configuration: configuration, 
    serverTrustPolicyManager: ServerTrustPolicyManager(policies: serverTrustPolicies)) 
}() 

我都尝试,.PinCertificates.DisableEvaluation。无论把我同样的错误

Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." 
UserInfo={ 
    NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x60c00004d980>, 
    NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, 
    _kCFStreamErrorDomainKey=3, 
    _kCFStreamErrorCodeKey=-9802, 
    NSErrorPeerCertificateChainKey=<CFArray 0x6060001498a0 [0x10bb3c7b0]>{ 
    type = immutable, count = 1, values = (
    0 : <cert(0x61600006ed80) s: localhost i: localhost> 
    )}, 
    NSUnderlyingError=0x6040000ad750 { 
    Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" 
    UserInfo={ 
     _kCFStreamPropertySSLClientCertificateState=0, 
     kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x60c00004d980>, 
     _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, 
     _kCFStreamErrorDomainKey=3, 
     _kCFStreamErrorCodeKey=-9802, 
     kCFStreamPropertySSLPeerCertificates=<CFArray 0x6060001498a0 [0x10bb3c7b0]>{ 
     type = immutable, count = 1, values = (
      0 : <cert(0x61600006ed80) s: localhost i: localhost> 
     )} 
    } 
    }, 
    NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., 
    NSErrorFailingURLKey=https://localhost:3000/auth/requestToken?auth_appId=d018ccd505db2cb1d5aacabb03fc2f3a, 
    NSErrorFailingURLStringKey=https://localhost:3000/auth/requestToken?auth_appId=d018ccd505db2cb1d5aacabb03fc2f3a, 
    NSErrorClientCertificateStateKey=0 
} 

我试图做使用curl

curl --cacert ./ca.pem https://localhost:3000 

我把范围缩小到从其中completionHandler是beeing称为单一的方法,它的工作就好了请求。直到关闭被称为一切正常,所以我想知道这个completionHandler实际上做了什么。

public func URLSession(
    session: NSURLSession, 
    didReceiveChallenge challenge: NSURLAuthenticationChallenge, 
    completionHandler: ((NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void)) 
{ 
    // some other stuff but 
    // everything fine so far 

    completionHandler(disposition, credential) 
} 

我觉得URLSession方法从调度队列或类似的东西叫。

所以我的问题:我如何找到作为completionHandler参数传递给URLSession方法的闭包?

+0

你应该能够进入关闭状态。或者只是检查这个方法被调用的地方。 –

+0

你的问题不是很清楚。你在使用自定义的'ServerTrustPolicy'吗? Alamofire默认使用Apple的默认服务器信任评估。如果你可以更具体一些,帮助起来会容易得多。 – cnoon

+0

我用更多信息更新了我的问题:) – iMoritz

回答

0

-我假设你的问题不是这个特定的方法,但completionHandler如何在Swift工作。

-在这里,在一个closure,后者又可以作为CallbackcompletionHandler

-Swift回调被closuredelegates处理。

-让我清楚的一个小例子混乱,

问题:

假设我要调用的方法,所以我会调用该方法,并在得到响应后,我需要在屏幕或控制台上显示结果。

解决方案:

  • 方法被调用:

internal func sumUp(valOne: Int, valTwo: Int, completionHandler: (sum: Int)-> Void) { let add = valOne + valTwo completionHandler(sum: add) }

  • 调用代码:

sumUp{

 (sum) -> Void in 
     print(sum) // OR print it in display 

}

-调用方法sumUp会做两个整数总结的工作,然后返回总和completionHandler其暴露于caller