NSURLConnection同步,异步与SSL

 原文地址:http://qzc770707.blog.163.com/blog/static/3408275320105249566560/
通常在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,其他的不通过就行了!!!


 

你可能感兴趣的:(apple,网络,ssl,url,iPhone,domain)