2016-04-13 2 views
0

I Berechtigungslogik über WebView haben es geschafft:Wie Server-Response-Code für jede Anforderung in WebView bekommen

  • Benutzer klicken Sie auf Login-Button in app
  • I WebView öffnen mit Lade Login Homepage (durch URL-Adresse geöffnet)
  • Benutzer ihre Benutzernamen und ein Kennwort eingeben> auf Login-Button auf
  • nächste Seite wird in WebView geöffneten Seite klicken - Zugang Bestätigungsseite
  • Benutzer hat auf authorise Zugriffstaste autorisieren klicken auf der Homepage
  • danach redirect_uri URL
  • ich diese redirect_uri in Anfrage zu fangen und in der Nähe WebView

ich prüfe alle Anfragen (um zu fangen redirect_uri) in WebView Delegatmethode in WebView zu öffnen versucht werden shouldStartLoadWithRequest:.

Frage: Wie kann ich die Serverantwort für jede Anforderung für in WebView geöffnete Seite verwalten?

Der Punkt ist, dass wir einige Probleme mit Auth-Server haben und von Zeit zu Zeit zeigt es Fehlerseiten. Ich möchte solche Seiten fangen und WebView für solche Fälle schließen.

Antwort

1

gefunden die Lösung über WKWebView. Ich habe es auf die gleiche Weise wie UIWebView in meinem Projekt gearbeitet.

Und dann benutze ich eigentlich zwei Methoden aus WKNavigationDelegate Protokoll:

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler 

und

- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler 

Beispiel Code:

erste Methode ist, aktuelle Anforderung zu prüfen, ob tatsächlich ist unsere redirect_uri dass wir damit umgehen sollten:

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { 
    NSLog(@"request: %@", navigationAction.request); 

    // check whether this request should be stopped - if this is redirect_uri (like user is already authorized) 
    if (...) { 
     self.webView.navigationDelegate = nil; 

     // do what is needed to send authorization data back 
     self.completionBlock(...); 

     // close current view controller 
     [self dismissViewControllerAnimated:YES completion:nil]; 

     // stop executing current request 
     decisionHandler(WKNavigationActionPolicyCancel); 

    } else { 
     // otherwise allow current request 
     decisionHandler(WKNavigationActionPolicyAllow); 
    } 
} 

zweite Methode ist Antwort vom Server zu analysieren, und hier können wir den Statuscode, um alle Fehler

- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler { 
    NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response; 

    // filter the responses, in order to verify only the response from specific domain 
    if ([[NSString stringWithFormat:[[response URL] absoluteString]] containsString:@"some.domain.com/"]) { 

     NSInteger statusCode = [response statusCode]; 

     // check what is the status code 
     if (statusCode == 200 || 
      statusCode == 301 || 
      statusCode == 302) { 

      // allow response as everything is ok 
      decisionHandler(WKNavigationResponsePolicyAllow); 

     } else { 
      // handle the error (e.g. any of 4xx or any others) 

      self.webView.navigationDelegate = nil; 

      // send needed info back 
      self.completionBlock(...); 

      // close current view controller 
      [self dismissViewControllerAnimated:YES completion:nil]; 

      // stop current response 
      decisionHandler(WKNavigationResponsePolicyCancel); 
     } 

    } else { 
     // current response is not from our domain, so allow it 
     decisionHandler(WKNavigationResponsePolicyAllow); 
    } 
} 
+1

Sind Sie sicher, dass diese Methode aufgerufen wird, wenn der Antwortstatuscode 301 oder 302 ist? Ich versuche das und erhalte nie diese Codes – FelixSFD

+0

Diese HTTP-Statuscodes bedeuten, dass Anfrage an eine andere URL umgeleitet wurde. Sie erhalten sie in seltenen Fällen (es hängt vom Server selbst ab). In den meisten Fällen erhalten Sie den Statuscode 200 –

+0

für mich war es sehr wichtig, 4xx oder 5xx Fehler zu fangen als Autorisierungsserver kann sehr oft bei meinem Projekt sein)) –

0

Implementieren unter Delegatmethode zu behandeln überprüfen könnte Arbeit für Sie sein.

- (void)webViewDidFinishLoad:(UIWebView *)webView { 
    NSCachedURLResponse *urlResponse = [[NSURLCache sharedURLCache] cachedResponseForRequest:webView.request]; 
    NSHTTPURLResponse *httpResponse = (NSHTTPURLResponse*) urlResponse.response; 
    NSInteger statusCode = httpResponse.statusCode; 
    NSLog(@"%@",statusCode); 
} 
+0

'decidePolicyForNavigationResponse' funktioniert besser, da ich Serverfehler abfangen kann, bevor sie auf dem Bildschirm angezeigt werden und benutzerfreundlichere Nachrichten anzeigen –

Verwandte Themen