Właśnie zaktualizowałem swój kod do Swift 2.0, aby działał z Xcode 7. Moja aplikacja wykonuje uwierzytelnienie NSURLAuthenticationMethodServerTrust
i NSURLAuthenticationMethodClientCertificate
.Uwierzytelnianie serwera w Swift 2.0 i XCode 7 zerwane
Problem polega na tym, że uwierzytelnianie przestało działać na moim symulatorze - ale nadal działa na moim urządzeniu testowym z iOS 8.3. Poza tym mój stary projekt, który nie jest Swiftem 2.0, również działa.
Błąd: NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
Błąd pobierane z NSURLSession:
Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo=0x7fcf75053070 {NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x7fcf73700d00>, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorCodeKey=-9802, NSUnderlyingError=0x7fcf735284b0 "The operation couldn’t be completed. (kCFErrorDomainCFNetwork error -1200.)", NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSErrorFailingURLKey=https://mywebapi/dosomething, NSErrorFailingURLStringKey=https://mywebapi/dosomething, _kCFStreamErrorDomainKey=3} [GetOneTimeTokenController.swift:76]
ja wciąż kierowania iOS 8.0 do wdrożenia.
ten sposób obsłużyć wyzwanie uwierzytelnienia (przy użyciu certyfikatu z podpisem własnym):
if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodClientCertificate {
let urlCredential:NSURLCredential = NSURLCredential(
identity: identityAndTrust.identityRef,
certificates: identityAndTrust.certArray as [AnyObject],
persistence: NSURLCredentialPersistence.ForSession);
completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, urlCredential);
} else if challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust {
completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, NSURLCredential(trust: challenge.protectionSpace.serverTrust!));
} else {
challenge.sender?.continueWithoutCredentialForAuthenticationChallenge(challenge)
Logger.sharedInstance.logMessage("Unexpected Authentication Challange", .Error);
}
Dzięki. Po prostu (prawdopodobnie oczywisty komentarz - w przypadku względnych newbów, takich jak ja) - umieść to na dole pliku, uważając, aby po nim zachować dwie ostatnie linie: i . Moje pierwsze próby umieszczenia go w pobliży zakłóciły formatowanie XML (otrzymasz komunikat o błędzie "Info.plist w niewłaściwym formacie", jeśli umieścisz go niepoprawnie). – user3741598