2015-09-14 134 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