查找完成声明处理程序
问题描述:
我想在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
方法的闭包?
答
-我假设你的问题不是这个特定的方法,但completionHandler
如何在Swift
工作。
-在这里,在一个closure
,后者又可以作为Callback
的completionHandler
。
-在Swift
回调被closure
和delegates
处理。
-让我清楚的一个小例子混乱,
问题:
假设我要调用的方法,所以我会调用该方法,并在得到响应后,我需要在屏幕或控制台上显示结果。
解决方案:
- 方法被调用:
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
。
你应该能够进入关闭状态。或者只是检查这个方法被调用的地方。 –
你的问题不是很清楚。你在使用自定义的'ServerTrustPolicy'吗? Alamofire默认使用Apple的默认服务器信任评估。如果你可以更具体一些,帮助起来会容易得多。 – cnoon
我用更多信息更新了我的问题:) – iMoritz