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
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()"];
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;
}
Implementare il metodo webView:shouldStartLoadWithRequest:navigationType:
UIWebViewDelegate
.
Gestire navigationType e la richiesta in base alle esigenze.
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
@iPhoneDeveloper Dovresti pubblicare la tua domanda con tutti i dettagli rilevanti. – rmaddy
Sembra esattamente quello che ho bisogno di realizzare. Ma non riesco a capire dove metto questo metodo? Grazie per la risposta descrittiva, a proposito! –
Lo metti dovunque è il delegato di UIWebView! – matt
Alwesome, funziona! :) Un'altra domanda: perché quando faccio clic sul link con schema URL predefinito, l'app reindirizza a Safari e tenta di aprirlo? –