2010-04-21 9 views
4

Je suis un peu nouveau à l'objectif-C mais j'ai rencontré un problème que je ne peux pas résoudre, surtout parce que je ne suis pas sûr d'implémenter correctement la solution.Objective-C SSL Synchronous Connection

J'essaie de me connecter en utilisant une connexion synchrone à un site https avec un certificat auto-signé. Je reçois le

erreur Domaine = code NSURLErrorDomain = -1202 « certificat de serveur non sécurisé »

Erreur que j'ai vu des solutions à ce forum. La solution que j'ai trouvée était d'ajouter:

- (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]; 

} 

au NSURLDelegate pour accepter tous les certificats. Lorsque je me connecte au site en utilisant juste un:

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://examplesite.com/"] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0]; 
    NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

Cela fonctionne très bien et je vois le défi être accepté. Cependant, lorsque j'essaie de me connecter à l'aide de la connexion synchrone, j'obtiens toujours l'erreur et je ne vois pas les fonctions de défi lancées lorsque je mets la connexion.

Comment puis-je obtenir la connexion synchrone pour utiliser les méthodes de challenge? Est-ce quelque chose à voir avec le délégué: faire partie de URLConnection? J'ai aussi la journalisation pour envoyer/recevoir des données dans le NSURLDelegate qui est appelé par ma fonction de connexion mais pas par la fonction synchrone.

Ce que je me sers pour la partie synchrone:

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL: [NSURL URLWithString:@"https://examplesite.com/"]]; 
     [request setHTTPMethod: @"POST"]; 
     [request setHTTPBody: [[NSString stringWithString:@"username=mike"] dataUsingEncoding: NSUTF8StringEncoding]]; 
     dataReply = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
     NSLog(@"%@", error); 
     stringReply = [[NSString alloc] initWithData:dataReply encoding:NSUTF8StringEncoding]; 
     NSLog(@"%@", stringReply); 
     [stringReply release]; 
     NSLog(@"Done"); 

Comme je l'ai mentionné, je suis un peu nouveau pour objectif C pour être gentil :)

Merci pour toute aide. Mike

+0

Avez-vous fini par convertir votre demande en asynchrone? Je suis confronté au même problème et j'ai des cauchemars de devoir convertir mon code. – kmehta

Répondre

7

Selon les documents Apple (URL Loading System Programming Guide), la méthode NSURLRequest synchrone n'est pas recommandée car «car elle présente des limitations sévères». Il semblerait que le manque de capacité à contrôler quels certificats sont acceptables est l'une de ces limitations.

Et oui, vous avez raison, c'est le delegate:self sur le programme d'installation NSURLConnection qui provoque l'appel de vos méthodes déléguées. Étant donné que l'appel sendSynchronousRequest: synchrone simple (ou simpliste) ne permet pas de spécifier un délégué, ces méthodes de délégué ne sont pas utilisées.

+0

Où puis-je appeler le délégué: auto à partir d'une demande synchrone? – Pria

+2

@Pria - c'est le point: lorsque vous utilisez une requête synchrone, il n'y a pas moyen de spécifier un objet délégué. Une requête asynchrone ressemble à: '[[NSURLConnection alloc] initWithRequest: le délégué theRequest: self]' et un appel synchrone est comme '[NSURLConnection sendSynchronousRequest: requête returnResponse: & erreur de réponse: & error]'. Notez qu'il n'y a pas de paramètre 'delegate:' dans la méthode '-sendSynchronousRequest: returnResponse: error:'. Bottom line: si vous avez besoin de la personnalisation qu'un NSURLDelegate peut donner, vous devez utiliser la requête asynchrone. –

+0

merci beaucoup ..! – Pria