2013-01-10 8 views
10

Se un utente tenta di caricare una pagina Web https in Mobile Safari e il controllo di convalida del certificato del server fallisce (è scaduto, revocato, autofirmato ecc.) Viene presentato un messaggio di avviso all'utente e viene chiesto se desidera per continuare o no.Qualcuno ha trovato un modo per caricare le pagine HTTPS con un certificato server non valido utilizzando UIWebView?

Analogamente NSURLConnection offre la possibilità per l'implementatore di decidere in primo luogo come controllare il certificato e quindi decidere come procedere se fallisce, quindi anche in questa situazione sarebbe possibile visualizzare un avviso all'utente e offrire loro possibilità di continuare a caricare la pagina oppure no.

Tuttavia sembra durante il caricamento di una pagina https in UIWebView che fallisce un certificato controllare il comportamento è solo per non riuscire a caricare la pagina - didFailLoadWithError: viene chiamato con kCFURLErrorServerCertificateUntrusted tuttavia nulla viene visualizzato all'utente.

Questo è incoerente - sicuramente il comportamento di UIWebView dovrebbe comportarsi in modo simile a Safari per essere coerente all'interno di iPhone stesso? È anche un daft che NSURLConnection consente una totale flessibilità con questo NSURLRequest ancora: setAllowsAnyHTTPSCertificate è privato.

Esiste comunque un comportamento coerente con Safari, è possibile personalizzare questo comportamento predefinito in modo simile a NSURLConnection?

Acclamazioni

P.S. Per favore astenetevi dal partecipare a discussioni laterali paternalistiche sul perché qualcuno dovrebbe volerlo fare, grazie mille.

risposta

14

ho scoperto come fare questo:

1) Quando la pagina viene caricata sarà fallire, quindi aggiungere qualcosa come la seguente al didFailLoadWithError:

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 
    if ([error.domain isEqualToString: NSURLErrorDomain]) 
    { 
     if (error.code == kCFURLErrorServerCertificateHasBadDate  || 
      error.code == kCFURLErrorServerCertificateUntrusted   || 
      error.code == kCFURLErrorServerCertificateHasUnknownRoot || 
      error.code == kCFURLErrorServerCertificateNotYetValid) 
     { 
     display dialog to user telling them what happened and if they want to proceed 

2) Se l'utente vuole caricare la pagina, allora avete bisogno di connettersi utilizzando un NSURLConnection:

NSURLRequest *requestObj = [NSURLRequest requestWithURL:self.currentURL  cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0]; 
self.loadingUnvalidatedHTTPSPage = YES; 
[self.webView loadRequest:requestObj]; 

3) quindi apportare questa modifica shouldStartLoadWithRequest

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    if (self.loadingUnvalidatedHTTPSPage) 
    { 
     self.connection = [[NSURLConnection alloc] initWithRequest:request delegate:self]; 
     [self.connection start]; 
     return NO; 
    } 

4) Implementare la NSURLConnectionDelegate come:

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    SecTrustRef trust = challenge.protectionSpace.serverTrust; 
    NSURLCredential *cred; 
    cred = [NSURLCredential credentialForTrust:trust]; 
    [challenge.sender useCredential:cred forAuthenticationChallenge:challenge]; 
} 


- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response; 
{ 
    NSURLRequest *requestObj = [NSURLRequest requestWithURL:self.currentURL cachePolicy:NSURLRequestReturnCacheDataElseLoad timeoutInterval:10.0]; 
    self.loadingUnvalidatedHTTPSPage = NO; 
    [self.webView loadRequest: requestObj]; 
    [self.connection cancel]; 
} 

Tutto sembra funzionare correttamente.

+0

risolto il mio problema. Grazie! –

Problemi correlati