但很多時候你就會去做那些你不該做的事。比方說,你要寫一個 iOS 上的 Client,而 API Server 也還在開發中,接下來所有的 API 都會使用 HTTPS,但是還沒有花錢去買憑證,所以就先隨便產生了一個東西檔著先,而如果你使用 NSURLSession 試圖建立不安全的 HTTPS 連線的話,NSURLSession 就拒絕連線並且回傳 Error 物件。但是這種狀況下,你還是要先想辦法把連線建立起來,才有辦法在 Server 還在開發中的狀況下也寫點 Client Side 的程式。
首先我們必須要建立自己的 NSURLSession 物件,這樣才能夠在建立物件的時候,把 delegate 物件傳進去。NSURLSession 的 delegate 是一個唯讀的屬性,只能在建立 instance 的時候傳遞進去;所以,我們也不能改變 [NSURLSession sharedSession] 的 delegate 屬性。
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
URLSession = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:operationQueue];
接著實作一個 delegate method
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler
{
#warning This allows insecure SSL. We need to remove this from release builds.
NSURLProtectionSpace * protectionSpace = challenge.protectionSpace;
if ([protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
SecTrustRef serverTrust = protectionSpace.serverTrust;
completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust: serverTrust]);
}
else {
completionHandler(NSURLSessionAuthChallengePerformDefaultHandling, nil);
}
}
千萬記得在 Release 軟體的時候把這段拿掉。
資料來源:http://api.logdown.com/posts/168699/using-nsurlsession-allows-the-use-of-less-secure-ssl-online
2016年10 月 posted by admin in
程式&軟體 and have
No Comments
Place your comment