Ich habe gerade meinen Code zu Swift 2.0 aktualisiert, um mit Xcode 7 zu arbeiten. Meine App führt NSURLAuthenticationMethodServerTrust
und NSURLAuthenticationMethodClientCertificate
Authentifizierung.Server-Authentifizierung in Swift 2.0 & XCode 7 gebrochen
Das Problem ist NSURLAuthenticationMethodServerTrust
Authentifizierung funktioniert nicht mehr auf meinem Simulator - funktioniert aber immer noch auf meinem Testgerät mit iOS 8.3. Neben meinem alten Projekt, das nicht Swift 2.0 ist, funktioniert auch noch.
Fehler: NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
Fehler von NSURLSession Introduction:
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]
Ich bin Targeting noch iOS 8.0 für die Bereitstellung.
Dies ist, wie ich die Authentifizierung Herausforderung (mit einem selbstsignierten Zertifikat) behandeln:
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);
}
Danke. Nur ein (wahrscheinlich naheliegender Kommentar - für relative newbs wie mich) - setze dies an den unteren Rand der Datei und achte darauf, dass die letzten beiden Zeilen, und, danach noch vorhanden sind. Meine ersten Versuche, es an die Spitze zu legen, verschmutzten die XML-Formatierung (Sie erhalten eine Fehlermeldung, dass "Info.plist nicht im richtigen Format ist", wenn Sie es falsch platzieren). – user3741598