Domanda

Sto cercando di ottenere un piccolo client Twitter corsa e mi sono imbattuto in un problema durante il test chiamate API che richiedono l'autenticazione.

La mia password ha i caratteri speciali in esso, in modo che quando cerco di utilizzare il seguente codice non funziona.

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

Ho iniziato a guardare in Base64 e mettendo l'autenticazione nelle intestazioni. Ho trovato dopo di Dave Dribin sulla sua implementazione Base64, e sembrava avere un senso. Tuttavia quando ho provato ad usarlo il compilatore ha iniziato a lamentarsi come non riusciva a trovare le librerie OpenSSL. Così ho letto che avevo bisogno di linkare la libreria libcrypto, ma non sembra esistere per iPhone.

Ho anche letto la gente dicendo che Apple non permetterà applicazioni che utilizzano le librerie di crittografia, che non ha senso per me.

Così ora sono un pò bloccato e confuso. Qual è il modo più semplice per ottenere l'autenticazione di base nella mia app?

Saluti

È stato utile?

Soluzione

Due cose. In primo luogo è necessario utilizzare i metodi asincroni piuttosto che il metodo sincrono / 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'autenticazione è gestito mediante l'attuazione di questo metodo nella delegato:

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

E probabilmente anche necessario implementare questi metodi troppo:

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

Utilizzando il metodo asincrono tende a dare una migliore esperienza utente in ogni caso quindi, nonostante la complessità in più vale la pena di fare anche senza la capacità di fare l'autenticazione.

Altri suggerimenti

È possibile direttamente giardini.L scrivere scaricare il nome utente e la password in URL principale cioè https: // nomeutente: password @ yourURL .com /

Prima di tutto è necessario chiamare il file NSURLConnection Delegato: -

  • (BOOL) Collegamento: (NSURLConnection *) Collegamento canAuthenticateAgainstProtectionSpace: (NSURLProtectionSpace *) protectionSpace

    {

    ritorno SI; }

e quindi chiamare - connessione (void): (NSURLConnection *) Collegamento didReceiveAuthenticationChallenge: (NSURLAuthenticationChallenge *) sfida

{
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");
        }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top