que iphone ios uiwebview mobile-safari

iphone - que - ¿Forzar un enlace WebView para iniciar Safari?



uiwebview que es (5)

Tengo un UIWebView incrustado en una aplicación de iPhone mía. Deseo poder tener ciertos enlaces dentro de esa vista web abiertos en la aplicación Mobile Safari completa (es decir, no en mi versión incrustada).

¿Existe una manera simple de estructurar algunos de mis hrefs para forzar esto, en lugar de abrir cada enlace dentro de mi vista web incrustada?

Gracias.


Así es como lo resolvimos, agrégalo a tu archivo ViewController.m:

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. first.delegate = (id)self; [first loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://my.FellowshipNWA.org?publicapp"]]]; } // Add section below so that external links & PDFs will open in Safari.app - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if (navigationType == UIWebViewNavigationTypeOther) { NSString *checkURL = @"http://my.fellowshipnwa.org/?givenowsafari"; NSString *reqURL = request.URL.absoluteString; if ([reqURL isEqualToString:checkURL]) { [[UIApplication sharedApplication] openURL:request.URL]; return false; } else { return true; } } return true; }


No lo he intentado, pero creo que puede implementar el método UIWebViewDelegate

webView:shouldStartLoadWithRequest:navigationType

que se llamará cada vez que se haga clic en un enlace en UIWebView. En ese método, solo necesita determinar si el enlace hecho clic debería dar como resultado el inicio de Safari o no y usar openURL si fuera necesario.

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { // Check if this was a click event and then some other criteria for determining if you want to launch Safari. if (navigationType == UIWebViewNavigationTypeLinkClicked && [Some other criteria]) { [[UIApplication sharedApplication] openURL:request.URL]; // Return false to indicate to the UIWebView to not navigate to the linked target return false; } // Return true so that the UIWebView loads the link target return true; }

No olvide que debe establecer su propiedad de delegado UIWebView en una instancia de la clase que implementa UIWebViewDelegate.


Ok, lo tengo. Tal vez no sea la solución perfecta, pero puedes hacerlo así:

Solo en su WebViewController.m :

agregue la línea webView.delegate = self; al procedimiento viewDidLoad :

- (void)viewDidLoad { webView.delegate = self; .... your code .... }

Luego puede agregar como se describe arriba en algún lugar en el archivo Controller.m siguiente función booleana resultante:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { if (navigationType == UIWebViewNavigationTypeLinkClicked) { [[UIApplication sharedApplication] openURL:request.URL]; return false; } return true; }


Para ampliar lo que dijo Randy, esto es lo que uso en mi aplicación para hacer que cada URL http: //, https: // y mailto: // se abra en las aplicaciones externas de Safari o Correo:

-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; { NSURL *requestURL =[ [ request URL ] retain ]; if ( ( [ [ requestURL scheme ] isEqualToString: @"http" ] || [ [ requestURL scheme ] isEqualToString: @"https" ] || [ [ requestURL scheme ] isEqualToString: @"mailto" ]) && ( navigationType == UIWebViewNavigationTypeLinkClicked ) ) { return ![ [ UIApplication sharedApplication ] openURL: [ requestURL autorelease ] ]; } [ requestURL release ]; return YES; }

Como dice Randy, querrás implementar esto dentro de la clase que configures para ser el delegado de UIWebView. Para que solo las URL seleccionadas inicien Safari, puede cambiar su esquema de http: // a safari: //, o algo similar, y solo cancelar esas URL en el sistema (después de reemplazar el esquema de URL personalizado con http: //) .

Lo hago dentro de mi documentación de ayuda interna, que es el HTML que se muestra en UIWebView, para que no tenga problemas en el proceso de revisión al tener un navegador web de propósito general incrustado en mi aplicación.


Versión rápida de la respuesta de Brad Larson:

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool { var url: NSURL = request.URL! var isExternalLink: Bool = url.scheme == "http" || url.scheme == "https" || url.scheme == "mailto" if (isExternalLink && navigationType == UIWebViewNavigationType.LinkClicked) { return !UIApplication.sharedApplication().openURL(request.URL!) } else { return true } }