1. 程式人生 > >NSUrlSession NSUrlConnection 連自簽的 https 憑證解法

NSUrlSession NSUrlConnection 連自簽的 https 憑證解法

遇到ios 連自簽憑會出錯,訊息:

Error Domain=NSURLErrorDomain Code=-1202 “The certificate for this server is invalid. You might be connecting to a server that is pretending to be “your-domain-name-here” which could put your confidential information at risk.”

首先是 info.plist 要增加下面的 setting:

<key>NSAppTransportSecurity</key>
<dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>

在  .h 檔加入Delegate

Add this Two Delegate NSURLSessionDelegate, NSURLSessionDataDelegate

例如:

@interface ViewController : UIViewController <NSURLSessionDelegate, NSURLSessionDataDelegate>

-(void)viewDidLoad 
{ [super viewDidLoad]; [self sendHTTPPost]; } -(void) sendHTTPPost { NSURLSessionConfiguration *defaultConfigObject = [NSURLSessionConfiguration defaultSessionConfiguration]; NSURLSession *defaultSession = [NSURLSession sessionWithConfiguration: defaultConfigObject delegate
: self delegateQueue: [NSOperationQueue mainQueue]]; NSURL * url = [NSURL URLWithString:@"http://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo"]; NSMutableURLRequest * urlRequest = [NSMutableURLRequest requestWithURL:url]; [urlRequest setHTTPMethod:@"POST"]; NSURLSessionDataTask * dataTask = [defaultSession dataTaskWithRequest:urlRequest]; [dataTask resume]; } - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)response completionHandler:(void (^)(NSURLSessionResponseDisposition disposition))completionHandler { NSLog(@"### handler 1"); completionHandler(NSURLSessionResponseAllow); } - (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data { NSError *error; NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; NSLog(@" dict=>> %@",dict); } - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error { if(error == nil) { NSLog(@"Download is Succesfull"); } else NSLog(@"Error %@",[error userInfo]); }

重點是下面這段:

– (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential *))completionHandler{

if([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]){

NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];

completionHandler(NSURLSessionAuthChallengeUseCredential,credential);

}

}

目前這樣子是不去判斷 host 裡的字串,全都允許。