2013-04-13 19 views
9

Sono andato a utilizzare UIWebView per visualizzare il contenuto dinamico, invece di farlo in modo nativo utilizzando elementi dell'interfaccia utente. È possibile attivare le funzioni di app native semplicemente premendo i link all'interno di UIWebView? Esempio: colpire un collegamento che poi cambia visualizzazione corrente?Un UIWebView può interagire (comunicare) con l'app?

risposta

23

Sì, è possibile. Nel codice HTML, si scrive un JS per caricare un URL con uno schema falso come

window.location = "request_for_action://anything/that/is/a/valid/url/can/go/here"; 

Poi, nel codice di iOS, assegnare un delegato per la vostra WebView, e nel vostro delegato, gestire

webView:shouldLoadWithRequest:navigationType 

con qualcosa come

if([request.URL.scheme isEqualToString: @"request_for_action"]) 
{ 
    // parse your custom URL to extract parameter, use URL parts or query string as you like 
    return NO; // return NO, so webView won't actually try to load this fake request 
} 

-

Solo una parte, si può fare il contrario, lasciare che iOS co de richiamare alcuni codici JS nel tuo html per utilizzando

NSString* returnValue = [self.webView stringByEvaluatingJavaScriptFromString: "someJSFunction()"]; 
9

Sì! Quando l'utente preme un collegamento, ne viene a conoscenza nel delegato della vista Web e può quindi eseguire tutto ciò che desidera. Roba potente può essere fatto in questo modo.

Il delegato della vista Web viene inviato webView:shouldStartLoadWithRequest:navigationType:. Analizzi cosa è successo e rispondi come desideri. Per evitare che la visualizzazione Web provi a seguire il collegamento (che potrebbe essere completamente falso, dopotutto), basta restituire NO.

In questo esempio dall'app TidBITS News, ho un collegamento nella pagina Web che utilizza uno schema play: completamente inventato. Rilevo che nel delegato and play:

- (BOOL)webView:(UIWebView *)webView 
     shouldStartLoadWithRequest:(NSURLRequest *)r 
     navigationType:(UIWebViewNavigationType)nt { 
    if ([r.URL.scheme isEqualToString: @"play"]) { 
     [self doPlay:nil]; 
     return NO; 
    } 
    if (nt == UIWebViewNavigationTypeLinkClicked) { 
     [[UIApplication sharedApplication] openURL:r.URL]; 
     return NO; 
    } 
    return YES; 
} 
+0

Sembra esattamente quello che ho bisogno di realizzare. Ma non riesco a capire dove metto questo metodo? Grazie per la risposta descrittiva, a proposito! –

+0

Lo metti dovunque è il delegato di UIWebView! – matt

+0

Alwesome, funziona! :) Un'altra domanda: perché quando faccio clic sul link con schema URL predefinito, l'app reindirizza a Safari e tenta di aprirlo? –

2

Implementare il metodo webView:shouldStartLoadWithRequest:navigationType:UIWebViewDelegate.

Gestire navigationType e la richiesta in base alle esigenze.

+0

Ho impostato il delegato e implementato i metodi dei delegati di uiwebview. Ma nessuno dei miei metodi delegati viene chiamato quando clicco su alcuni contenuti di uiwebview. Non c'è callback. Cosa dovrebbe essere fatto? – iPhoneDeveloper

+0

@iPhoneDeveloper Dovresti pubblicare la tua domanda con tutti i dettagli rilevanti. – rmaddy

Problemi correlati