2010-11-23 14 views
4

J'ai une classe appelée BackendConnector qui utilise un NSURLConnection pour appeler un SoapWebservice qui est https. J'ai trouvé beaucoup de messages et j'ai essayé d'implémenter les méthodes de délégués concernant l'authentification, mais ils ne seront pas appelés et après 6 heures dans google je ne comprends pas ce que j'ai fait de mal. Quelqu'un peut-il me donner un indice pourquoi ces 2 méthodes de délégué ne seront pas appelées? J'ai mis un point d'arrêt dans chacun d'entre eux, j'ai commencé mon application avec XCode dans le simulateur mais j'ai quand même l'erreur et les points d'arrêt ne sont pas touchés.NSURLConnection Delegate Les méthodes ne seront pas appelées ... ne peuvent pas comprendre et lire beaucoup de messages

BackendConnector.m 

#import "BackendConnector.h" 

@implementation BackendConnector 

@synthesize dataPoint, chartDataPoints; 

- (NSMutableArray *)GetWebserviceData 
{ 
    NSMutableData *myMutableData; 
    chartDataPoints = [[NSMutableArray alloc] init]; 

    [self createWebserviceAndGetResponse: &myMutableData]; 

    if (myMutableData != NULL) 
    { 
     NSString *theXml = [[NSString alloc]initWithBytes:[myMutableData mutableBytes] length:[myMutableData length] encoding:NSUTF8StringEncoding]; 

     NSLog(@"doc = %@", theXml); 

     arrayCount = 0; 
     [self parseResponse: myMutableData]; 
    } 
    else 
    { 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" 
                 message:@"There is no Data returned from Webservice!" 
                 delegate:nil 
               cancelButtonTitle:@"OK" 
               otherButtonTitles: nil]; 
     [alert show]; 
     [alert release]; 
} 

    return NULL; 
    //return chartDataPoints; 
} 

- (void) createWebserviceAndGetResponse: (NSMutableData **) myMutableData_p 
{ 
    NSMutableString *sRequest = [[NSMutableString alloc]init]; 

    [sRequest appendString:@"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ser=\"http://service.ReportWebservice.xyz.com/\">"]; 
    [sRequest appendString:@"<soapenv:Header/>"]; 
    [sRequest appendString:@"<soapenv:Body>"]; 
    [sRequest appendString:@"<ser:getReport>"]; 
    [sRequest appendString:@"<arg0>User/arg0>"]; 
    [sRequest appendString:@"<arg1>password</arg1>"]; 
    [sRequest appendString:@"</ser:getReport>"]; 
    [sRequest appendString:@"</soapenv:Body>"]; 
    [sRequest appendString:@"</soapenv:Envelope>"]; 

    NSURL *myWebserverURL = [NSURL URLWithString:@"https://xyz.com/services/report"]; 

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:myWebserverURL]; 
    NSLog(@"request: %@", request); 

    [request addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
    [request addValue:@"" forHTTPHeaderField:@"SOAPAction"]; 

    NSString *contentLengthStr = [NSString stringWithFormat:@"%d", [sRequest length]]; 

    [request addValue:contentLengthStr forHTTPHeaderField:@"Content-Length"]; 
    [request setHTTPMethod:@"POST"]; 
    [request setHTTPBody:[sRequest dataUsingEncoding:NSUTF8StringEncoding]]; 

    NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

    if(conn) 
    { 
     *myMutableData_p=[[NSMutableData data] retain]; 
    } 

    [NSURLConnection connectionWithRequest:request delegate:self]; 

    NSError *WSerror; 
    NSURLResponse *WSresponse; 

    *myMutableData_p = [NSURLConnection sendSynchronousRequest:request returningResponse:&WSresponse error:&WSerror]; 
} 

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace { 
    return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]; 
} 

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 
    [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 
    [challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge]; 
} 
@end 

L'erreur est:

Error Domain=NSURLErrorDomain Code=-1202 "The certificate for this server is invalid. You might be connecting to a server that is pretending to be “xyz.com” which could put your confidential information at risk." UserInfo=0x8161600 {NSErrorFailingURLStringKey=https://xyz.com/services/report, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, NSErrorFailingURLKey=https://xyz.com/services/report, NSLocalizedDescription=The certificate for this server is invalid. You might be connecting to a server that is pretending to be “xyz.com” which could put your confidential information at risk., NSUnderlyingError=0x8134cb0 "The certificate for this server is invalid. You might be connecting to a server that is pretending to be “xyz.com” which could put your confidential information at risk.", NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x6d86020>} 

Merci beaucoup

twickl

Répondre

6

Je ne serai pas en mesure de répondre pourquoi ces méthodes ne sont pas avoir tiré, je exactement les mêmes méthodes et ils sont appelés lors de l'utilisation de HTTPS, mais je me demande pourquoi vous n'appliquez pas le reste des méthodes de délégué NSURLConnection? Tels que -didReceiveResponse etc.

Je pense aussi que votre connexion lance effectivement à

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 

Vous ne devriez pas avoir [NSURLConnection connectionWithRequest:request delegate:self]; et enfin vous commencez et établir une autre NSURLConnection synchrone et le stockage dans ce qui devrait être NSMutableData.

Essayez d'utiliser uniquement votre première NSUrlConnection *conn (et assurez-vous de libérer correctement plus tard), puis configurer vos données dans la méthode déléguée -didReceiveResponse, et vous pouvez réellement définir ou ajouter les données dans la méthode déléguée -didReceiveData.

+0

Tu as raison ... maintenant il fonctionne. Utilisez l'instance correcte et unique et les méthodes déléguées sont appelées! – CaptnCrash