Abra la aplicación iOS6 Apple Maps desde un enlace en un UIWebView

Si muestro un enlace a un map en una página web

<a href="http://maps.apple.com/?q=Pricketts+Hill+Southampton+Hampshire+SO32+2JW&ll=50.913127,-1.191398">Location</a> 

abre la aplicación Apple Maps iOS6 nativa cuando se hace clic en el browser iPhone Safari estándar. Cuando muestro la misma página web en una UIWebView dentro de mi aplicación y luego hago clic en el enlace, mi método de delegado

 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { 

se llama y los parameters son

 url=http://maps.apple.com/?q=Pricketts+Hill+Southampton+Hampshire+SO32+2JW&ll=50.913127,-1.191398 navigationType=UIWebViewNavigationTypeLinkClicked 

Si el método delegado devuelve YES para indicar que UIWebView debe continuar y abrir el enlace, se activa de inmediato una nueva llamada al delegado, y esta vez los parameters son

 url=http://maps.google.com/?q=Pricketts+Hill+Southampton+Hampshire+SO32+2JW&ll=50.913127,-1.191398 navigationType=UIWebViewNavigationTypeLinkClicked 

y devolver YES a esto, como es de esperar, da como resultado la apertura de la página web maps.google.com en mi UIWebView. Pero realmente quería que se lanzara la aplicación iOS6 Apple Maps. Podría probar un CLGeocoder para crear un MKMapItem desde la URL, siguiendo las líneas de Cómo iniciar la aplicación iOS Maps con una dirección específica en iOS 6? , pero CLGeocoder parece querer un text plano y no una url con todas sus annotations convencionales, un trabajo de análisis bastante detallado. Y si analizo la URL de forma diferente a la forma en que lo hace el safari mobile, es posible que vea resultados diferentes según si llegué a la aplicación Maps a través de mi UIWebView o Safari desde el mismo enlace inicial.

¿Hay alguna forma de get un UIWebView para abrir la aplicación iOS6 Apple Maps desde un enlace sin tener que analizar y luego geocodificar la URL?

Como un aparte, después de que se llama a mi método de delegado con la url maps.google.com, se llama dos veces con estos parameters:

 url=about:blank navigationType=UIWebViewNavigationTypeOther 

y que finalmente no tiene ningún efecto en la pantalla. ¿Alguna idea de qué se trata?

Sí, hay una forma de abrir un enlace maps.apple.com en la aplicación Maps desde una UIWebview. No hagas que el UIWebview abra el enlace directamente, sino que lo pasas al sistema operativo para resolverlo. En webView: shouldStartLoadWithRequest: navigationType: busco el enlace de maps y lo trato especialmente:

 if (([url.scheme isEqualToString:@"http"] || [url.scheme isEqualToString:@"https"]) && [url.host isEqualToString:@"maps.apple.com"]) { //it's an apple maps app request NSLog(@"Attempting Apple Maps app open"); [[UIApplication shanetworkingApplication]openURL:url]; return NO; } 

Y eso abre la aplicación Apple Maps en iOS6. En iOS5, se abrirá la página web de Google Maps en Safari. Buscaré sistemas iOS5 y trataré la URL de manera diferente allí también.