针对NSURLConnection的SynchronousRequest的DidReceiveAuthenticationChallenge

时间:2015-03-09 05:20:23

标签: ios objective-c nsurlconnection

我使用NSURLConnection的sendSynchronousRequest与服务器通信。我想处理使用连接委托可以实现的身份验证,但不会为同步请求调用委托。

NSData *data = [NSURLConnection sendSynchronousRequest:UrlRequest returningResponse:&response error:&error];

        dispatch_async(dispatch_get_main_queue(), ^{

            if(!error)
            {

             // Do something
             }
            else
             {
              // Handle error
             }

         });

但是我想过使用

异步发送所有请求
[NSURLConnection connectionWithRequest:menuRequest delegate:self];

但是我在同一个类中有多个连接,并且每个连接的成功和错误都用于执行不同的任务。如果我使用异步请求错误并且代理人听到成功,那对于所有请求都是相同的class,我无法找出哪个请求失败以及哪个请求成功。我有两个问题

  1. 如果有办法为同步请求实施https。
  2. 如何在异步请求的同一个类中的多个连接中找到哪个连接失败或成功。

1 个答案:

答案 0 :(得分:1)

您可以通过不同方式实现这一目标。

  1. 您可以将信用卡放入网址,例如https://username:password@domain.tld/api/user.json

  2. 您可以在同步连接呼叫之前添加将您的信用添加到NSURLCredentialStorage

  3. 您可以使用以下代码来实现。

    - (NSData *)sendSynchronousRequest:(NSURLRequest *)request returningResponse:(NSURLResponse *__strong*)response error:(NSError *__strong*)error
    {
       _finishedLoading=NO;
       _receivedData=[NSMutableData new];
       _error=error;
       _response=response;
    
       NSURLConnection*con=[NSURLConnection initWithRequest:request
                       delegate:self
               startImmediately:NO];
       [con start];
    
       return _receivedData;
    }
    
    
    - (BOOL)connection:(NSURLConnection *)connection  canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
       return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
    }
    
    - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
    {
        //handle the challenge
    }
    
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
    {
       *_response=response;
    }
    
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
    {
       [_receivedData appendData:data];
    }
    
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
    {
       *_error=error;
    
    }
    
     - (void)connectionDidFinishLoading:(NSURLConnection *)connection
    {
    
    }