2015-04-22 100 views
1

我有一個http連接的方法,這工作正常,直到我試圖有一個無效的ssl證書的服務器。 由於我使用NSURLConnection方法需要改變,以通過身份驗證挑戰

[NSURLConnection sendSynchronousRequest:returningResponse:error] 

沒有機會使用NSURLConnection委託方法通過認證的挑戰。

現在,我需要儘快更改我的服務呼叫代碼。 我的方法返回從連接接收到的數據,這是主要的問題,我不能輕易地礦改爲 NSURLConnectioninitWithRequest:delegate:

我的服務調用方法如下;

-(id)serviceCall:(NSString*)str withURL:(NSString*)serviceUrl withIdentifier:(NSString*)type 
{ 
    globalURL = [[NSURL alloc] initWithString:serviceUrl]; 
    shouldAllowSelfSignedCert = YES; 

// if(ISDEBUG) NSLog(@"%@",serviceUrl); 

    NSMutableDictionary* json; 
    NSURLResponse* response; 
    NSData* responseData = [NSMutableData data]; 

    NSError* error = nil; 
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:globalURL]; 
    [request setHTTPMethod:@"POST"]; 
    [request setHTTPBody: [str dataUsingEncoding: NSUTF8StringEncoding]]; 
    NSString* msgLength = [[NSString alloc] initWithFormat:@"%lu", (unsigned long)[str length]]; 
    [request addValue:@"text/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
    [request addValue:msgLength forHTTPHeaderField:@"Content-Length"]; 
    request.timeoutInterval = 180; 

    responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 


    if([type isEqualToString:@"image"]) 
    { 
     if(ISDEBUG) NSLog(@"%@",responseData); 
     return responseData; 
    } 
    else 
    { 
     if(error) 
     { 
      UIAlertView *message = [[UIAlertView alloc] initWithTitle:NO_WS_CONNECTION message:@"" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 

      if(ISDEBUG) NSLog(@"%@",error); 
     } 
     else 
     { 
      if(responseData !=nil) 
      { 
      json = [NSJSONSerialization 
        JSONObjectWithData:responseData 

        options:kNilOptions 
        error:&error]; 
      } 
      else 
      { 

      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:NO_WS_CONNECTION delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]; 
      [alert show]; 
      } 
     } 

    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding]; 

     if(ISDEBUG) NSLog(@"%@",responseString);  
    } 

    return json; 
} 

我希望我清楚。

你有什麼建議嗎?

謝謝。

回答

2

你應該有一個很好的理由做到這一點,所以,我會盡力幫助你,而不改變流程。

嘗試將請求包裝到可以使用initWithRequest:delegate:實現請求的類中,並使該類使用塊返回響應。

你會碰到這樣的:

[YourRequestClass requestWithURL:serviceURL callback:^(NSData *yourData, NSError *error){ 

}]; 

好吧,在這一點上,你有一個新的工具,使異步請求,使認證挑戰的東西給你,並返回一個塊的結果。

現在,你可以簡單地使用dispatch_semaphore來阻止你的線程,直到請求返回的響應....

-(id)serviceCall:(NSString*)str withURL:(NSString*)serviceUrl withIdentifier:(NSString*)type { 

    __block NSData *myData = nil; 

    dispatch_semaphore_t sem = dispatch_semaphore_create(0); 

    [YourRequestClass requestWithURL:serviceUrl callback:^(NSData *yourData, NSError *error){ 
     //ignoring error (this is an example !) 
     myData = yourData; 
     dispatch_semaphore_signal(sem); 
    }]; 

    dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); 

    //Use myData and make yourObject here! 

    return yourObject; 
} 

請注意,這只是一個例子,我只是想給你指點正確的方式...我沒有測試這個代碼,但我相信它應該按預期工作!

+0

或者,您可以將密碼添加到用戶的鑰匙串中,並且默認情況下同步URL請求將使用這些憑據。就這一點而言,從長遠來看,轉向異步風格絕對是正確的做法。 – dgatwood

相關問題