Question

Je suis en train d'obtenir un petit client twitter course et je suis tombé sur un problème lors du test des appels API qui nécessitent une authentification.

Mon mot de passe a des caractères spéciaux, donc lorsque je tente d'utiliser le code suivant ne fonctionne pas.

NSString *post = [NSString stringWithFormat:@"status=%@", [status stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];

NSString *postLength = [NSString stringWithFormat:@"%d", [postData length]];

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease];
NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@:%@@%@/statuses/update.json", username, password, TwitterHostname]];
[request setURL:url];
[request setHTTPMethod:@"POST"];
[request setValue:postLength forHTTPHeaderField:@"Content-Length"];
[request setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];
[request setHTTPBody:postData];

NSURLResponse *response;
NSError *error;
[NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

J'ai commencé à regarder dans base64 et mettre l'authentification dans les en-têtes. J'ai trouvé poste Dave Dribin sur sa mise en œuvre base64, et il semblait logique. Cependant, lorsque j'ai essayé d'utiliser le compilateur a commencé à se plaindre de la façon dont il n'a pas pu trouver les bibliothèques OpenSSL. Donc, je lis que je devais créer un lien dans la bibliothèque de libcrypto, mais il ne semble pas exister pour l'iphone.

J'ai lu aussi des gens qui disent que Apple ne permettra pas à des applications qui utilisent les bibliothèques Crypto qui n'a pas de sens pour moi.

Alors maintenant, je suis un peu coincé et confus. Quelle est la meilleure façon d'obtenir l'authentification de base dans mon application?

Vive

Était-ce utile?

La solution

Deux choses. Tout d'abord, 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 probablement besoin 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 si malgré la complexité supplémentaire vaut la peine même sans la capacité de faire l'authentification.

Autres conseils

Vous pouvez directement ASLO écrire télécharger le nom d'utilisateur et mot de passe dans l'URL principale https: // nom d'utilisateur: mot de passe @ yourURL .com /

Tout d'abord vous devez appeler fichier NSURLConnection délégué: -

  • (booléen) connexion: (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");
        }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top