背景
最近由于IOS需要HTTPS的协议,公司所有的HTTP协议全部改成HTTPS了,可是本地的DEBUG测试环境。是自己创建的HTTPS证书。不是被认证机构认证的。而IOS通信中的NSURLConnection如果是不被认证的证书,会通信失败。这里为了,兼容DEBUG环境下,需要在DEBUG环境忽略相关的URL接口,需要在通信的时候,实现NSURLConnectionDelegate,需要实现几个方法,如下:
- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace { return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]; } - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) if ([trustedHosts containsObject:challenge.protectionSpace.host]) [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; } - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{ NSInteger responseCode = [(NSHTTPURLResponse *)response statusCode]; NSLog(@"response length=%lld statecode%ld", [response expectedContentLength],(long)responseCode); } - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{ if (mData == nil) { mData = [[NSMutableData alloc] initWithData:data]; } else { [mData appendData:data]; } NSString* aStr=[[NSString alloc ]initWithData:mData encoding:NSUTF8StringEncoding]; NSLog(@"response connection%@",aStr); NSLog(@"response connection"); } - (void)connectionDidFinishLoading:(NSURLConnection *)connection{ NSLog(@"connectionDidFinishLoading connection"); if(mData!=nil){ [mData release]; mData = nil; } } - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{ NSLog(@"connection didFailWithError:%@",error); }
这里作下说明:trustedHosts是一个NSArray,可以初始下一下:trustedHosts = [[NSArray alloc] initWithObjects:@”10.10.10.160”, nil];,其中的地址就是需要忽略证书的域名或者IP
我这里写了一个简单的测试例子,源码下载:http://www.nikoer.com/data/NSURLConnectionTest.zip
简单调用:[[ErayInterface getInstance] connnect:@”https://10.10.10.160:8080/off/user_charge“];