2013-02-15 9 views
7

Ho impostato AFNetworking ma non accetta URL https. Come posso ottenere AFNEtworking per connettersi tramite SSL.Come posso consentire la connessione https utilizzando AFNetworking?

Ho il codice seguente:

NSMutableURLRequest *apiRequest = 
[self multipartFormRequestWithMethod:@"POST" 
           path: pathstr 
          parameters: params 
      constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) 
      { 
       //TODO: attach file if needed 
      }]; 



AFJSONRequestOperation* operation = [[AFJSONRequestOperation alloc] initWithRequest: apiRequest]; 
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    //success! 
    completionBlock(responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    //failure :(

    NSLog(@"%@", error); 
    completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"error"]); 
}]; 

[operation start]; 
+1

Quale errore è riportato nel registro? Inoltre, il certificato del server è valido? – nioq

risposta

6

Ciò, ovviamente, funziona solo se si dispone di un cert non auto-firmato o si aggiunge:

#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ al file PCH. Se si utilizza baccelli di cacao per questo è probabile che sia necessario sottoclasse AFHTTPRequestOperation e implementare:

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 
{ 
    if ([[protectionSpace authenticationMethod] isEqualToString:NSURLAuthenticationMethodServerTrust]) { 

     if ([self bypassSslCertValidation:protectionSpace]) 
      return YES; 
     else 
      return [super connection:connection canAuthenticateAgainstProtectionSpace:protectionSpace]; 

    } 
    return [super connection:connection canAuthenticateAgainstProtectionSpace:protectionSpace]; 

} 

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { 
     if ([self bypassSslCertValidation:challenge.protectionSpace]) { 
      [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 
      return; 
     } 
     else 
      return [super connection:connection didReceiveAuthenticationChallenge:challenge]; 
     return; 
    } 
} 

- (BOOL) bypassSslCertValidation:(NSURLProtectionSpace *) protectionSpace 
{ 
    if (ENVIRONMENT_TYPE == DEV_ENV || ENVIRONMENT_TYPE == STAGING_ENV) { 
     return YES; 
    } 
    return NO; 
} 

Poi dire AFNEtworking per utilizzare la nuova sottoclasse:

AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@""]]; 
[client registerHTTPOperationClass:[YourSubClassHTTPRequestOperation class]]; 

Non è la cosa più facile da fare in il mondo e ignorare tecnicamente l'autofirmato non lo sta facendo funzionare, ma se si utilizzano certificati SLL standard è probabile che funzionerà correttamente, ricordarsi di rimuovere questo codice o renderlo disponibile solo durante il debug se si prevede di rilasciare.

Aggiunta alla risposta perché i commenti hanno limiti di caratteri!

Poche scelte guardando l'operazione headers

di ritorno che può essere aggiunto manualmente alla coda:

- (AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)urlRequest 

O passano nelle vostre operazioni sottoclasse personalizzata a questo:

- (void)enqueueHTTPRequestOperation:(AFHTTPRequestOperation *)operation; 
+1

C'è un modo più semplice per farlo? – Jasmine

+0

Sfortunatamente non che ho trovato, l'ho appena implementato ieri per il mio sviluppo locale SSL, si può anche arrivare al punto di dire a quale host ignorare SSL. Ho sentito da qualche parte che hanno aggiunto SSL Pinning, mi piacerebbe trovare Google per questo. – Holyprin

+0

Dove posso comunicare a AfNetworking l'implementazione della sottoclasse AFHTTPClient? Come cambio il mio codeabove per farlo ... Grazie! – Jasmine

2

Prova questo codice.

NSMutableURLRequest *apiRequest = 
[self multipartFormRequestWithMethod:@"POST" 
           path: pathstr 
          parameters: params 
      constructingBodyWithBlock: ^(id <AFMultipartFormData>formData) 
      { 
       //TODO: attach file if needed 
      }]; 



AFJSONRequestOperation* operation = [[AFJSONRequestOperation alloc] initWithRequest: apiRequest]; 
[operation setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
    //success! 
    completionBlock(responseObject); 
} failure:^(AFHTTPRequestOperation *operation, NSError *error) { 
    //failure :(

    NSLog(@"%@", error); 
    completionBlock([NSDictionary dictionaryWithObject:[error localizedDescription] forKey:@"error"]); 
}]; 
operation.securityPolicy.allowInvalidCertificates = YES; 
[operation start]; 
+0

Ciò consentirà di utilizzare la connessione https ma non sarà una connessione sicura. Significa che devi configurare securityPolicy con i tuoi certificati * .cer dal tuo servizio web per avere una connessione sicura. –

14
operation.securityPolicy.allowInvalidCertificates = YES; 

Questo codice è molto importante. Se non lo aggiungi, riceverai un errore.

+0

Questo è perfetto e più pulito. – Jirapong

0

Se AFNetworking è sottoclasse disabilitato sull'esecuzione superclasse poi semplicemente messo nel codice come: http // foo // bar e impostare questa bool

Problemi correlati