2009-06-14 8 views
13

J'essaie d'avoir un petit client twitter en cours d'exécution et j'ai rencontré un problème lors du test des appels API nécessitant une authentification.Authentification HTTP de base sur l'iPhone

Mon mot de passe contient des caractères spéciaux, donc lorsque j'essaie d'utiliser le code suivant, cela ne fonctionne pas. J'ai commencé à chercher dans base64 et à mettre l'authentification dans les en-têtes. J'ai trouvé Dave Dribin's sur son implémentation en base64, et cela semblait logique. Cependant, quand j'ai essayé de l'utiliser, le compilateur a commencé à se plaindre de la façon dont il ne pouvait pas trouver les bibliothèques openssl. J'ai donc lu que j'avais besoin d'un lien dans la bibliothèque libcrypto, mais cela ne semble pas exister pour l'iphone.

J'ai aussi lu des gens qui disaient qu'Apple n'autorise pas les applications qui utilisent des bibliothèques crypto, ce qui n'a pas de sens pour moi.

Alors maintenant, je suis un peu coincé et confus. Quel est le moyen le plus simple d'obtenir une authentification de base dans mon application?

Salutations

Répondre

15

Deux choses. Premièrement, vous devez utiliser les méthodes async plutôt que la méthode synchrone/classe.

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:req] 
                   cachePolicy:NSURLRequestUseProtocolCachePolicy 
                  timeoutInterval:30.0]; 

// create the connection with the request 
// and start loading the data 
NSURLConnection *theConnection=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; 

L'authentification est gérée par l'application de cette méthode dans votre délégué:

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge; 

Et vous aurez besoin probablement aussi de mettre en œuvre ces méthodes aussi:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data; 
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error; 
- (void)connectionDidFinishLoading:(NSURLConnection *)connection; 

En utilisant la méthode async tend à donner une meilleure expérience utilisateur de toute façon, même si la complexité supplémentaire vaut la peine de le faire même sans la possibilité de faire l'authentification.

+0

J'ai changé l'appel sendSynchronous à initWithRequest: délégué de la demande: auto et puis configurez le didReceiveAuthenticationChallenge dans le délégué, mais rien n'est appelé. J'ai essayé d'autres méthodes de délégué NSURLConnection et elles ne fonctionnaient pas non plus. Des idées? – Meroon

+0

J'ai compris pourquoi les méthodes des délégués ne fonctionnaient pas. J'appelais initWithRequest d'une méthode de classe qui ne fonctionnera pas. Merci pour l'aide. – Meroon

+0

Désolé, réponse inutilement laconique (mais heureux que vous y êtes arrivé à la fin).Je l'ai développé. J'espère que c'est un peu plus utile maintenant. –

0

Vous pouvez directement ASLO écrire télécharger le nom d'utilisateur & mot de passe dans l'URL principale à savoir https://username:[email protected]/

d'abord tout ce que vous devez appeler NSURLConnection fichier délégué: -

  • connexion

    (booléen): (NSURLConnection *) connexion canAuthenticateAgainstProtectionSpace: (NSURLProtectionSpace *) protectionSpace

    {

    return YES; }

puis appelez - (void) connexion: (NSURLConnection *) connexion didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *) défi

{ 
if ([challenge previousFailureCount] == 0) 
     { 
      NSURLCredential *newCredential; 

      newCredential = [NSURLCredential credentialWithUser:@"username" 
                 password:@"password" 
                persistence:NSURLCredentialPersistenceForSession]; 
      NSLog(@"NEwCred:- %@ %@", newCredential, newCredential); 
      [[challenge sender] useCredential:newCredential forAuthenticationChallenge:challenge]; 
     } 
     else 
     { 
      [[challenge sender] cancelAuthenticationChallenge:challenge]; 
      NSLog (@"failed authentication"); 
     } 
} 
Questions connexes