- 通常在IPhone里用网络访问会用到NSURLConnection来做url链接请求,下面简单介绍一下:
- 1、同步请求
- NSURL *url=[[NSURL alloc]initWithString:urlString];
- NSMutableURLRequest *request=[[NSMutableURLRequest alloc]init];
- NSError *err=nil;
- NSData *data=[NSURLConnection sendSynchronousRequest:request
- returningResponse:nil
- error:&err];
- if(data==nil)
- {
- //if([err code])
- NSLog(@"Code:%d,domain:%@,localizedDesc:%@",[err code],
- [err domain],[err localizedDescription]);
- }
- else
- {
- }
- 这种情况,通过一个静态方法,请求request,这种情况下,会一直阻塞,等到返回结果,简单易用
- 2、异步请求
- NSURL *url=[[NSURL alloc]initWithString:urlString];
- NSMutableURLRequest *request=[[NSMutableURLRequest alloc]init];
- NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
- [url release];
- [request release];
- if(connection)
- {
- receivedData = [[NSMutableData data] retain];
- NSLog(@"intial done!");
- }
- else
- {
- NSLog(@"sorry");
- }
- 通过一个delegate来做数据的下载以及Request的接受等等消息,此处delegate:self,所以需要本类实现一些方法,并且定义receivedData做数据的接受
- 基本上要实现下面节歌方法
- - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
- {
- NSLog(@"get the whole response");
- [receivedData setLength:0];
- }
- - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
- {
- NSLog(@"get some data");
- [receivedData appendData:data];
- }
- - (void)connectionDidFinishLoading:(NSURLConnection *)connection
- {
- [connection release];
- }
- -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
- {
- [connection release];
- NSLog(@"Connection failed! Error - %@ %@",
- [error localizedDescription],
- [[error userInfo] objectForKey:NSErrorFailingURLStringKey]);
- }
- 基本上这样就搞定了!!!
- 但是异步模式下带来了一个新的问题,很多情况下,网络请求不在主线程,或者界面等待网络结果,不在主线程的时候,调用线程如果生命周期over,下面这些可能都没有调用到,导致得不到想要得效果,所以需要在NSURLConnection请求后面加点东西来阻塞
- while(!finished) {
- [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
- }
- 好了,现在我们看看SSL的问题,在NSURLConnnection本来有方法可以跳过ssl检查,可惜被apple无情的私有了,所以同步的数据请求肯定不行了,看看文档,只能通过异步delegate的方式了
- - (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];
- }
- 第一个方法会根据你的URL来判断是否需要做认证
- 第二个方法是认证的过程,if ([trustedHosts containsObject:challenge.protectionSpace.host]),这行代码注释掉,就可以自动所有SSL通过,否则,你可以加一些Trust的hosts,其他的不通过就行了!!!
NSURLConnection详解
最新推荐文章于 2022-03-10 17:04:32 发布