在UIWebView中从一个链接打开iOS6苹果地图应用程序

5
如果我在网页中显示一个指向地图的链接。
<a href="http://maps.apple.com/?q=Pricketts+Hill+Southampton+Hampshire+SO32+2JW&ll=50.913127,-1.191398">Location</a>

当在标准的iPhone Safari浏览器中点击时,它会打开本机iOS6 Apple Maps应用程序。当我在我的应用程序中使用UIWebView显示相同的网页,然后点击链接时,我的代理方法

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

被称为,并且参数是:
url=http://maps.apple.com/?q=Pricketts+Hill+Southampton+Hampshire+SO32+2JW&ll=50.913127,-1.191398
navigationType=UIWebViewNavigationTypeLinkClicked

如果委托方法返回YES表示UIWebView应该继续打开链接,则会立即触发对委托的新调用,这次参数是:
url=http://maps.google.com/?q=Pricketts+Hill+Southampton+Hampshire+SO32+2JW&ll=50.913127,-1.191398 
navigationType=UIWebViewNavigationTypeLinkClicked

当我返回YES时,可以预见的是会在我的UIWebView中打开maps.google.com网页。但实际上我想要启动iOS6的苹果地图应用程序。我可以尝试使用CLGeocoder从URL创建一个MKMapItem,类似于如何在iOS 6中使用特定地址启动iOS地图应用程序?,但CLGeocoder似乎只接受纯文本而不是带有所有常规注释的URL,这需要进行详细的解析。如果我与Mobile Safari处理URL的方式不同,那么我可能会看到不同的地图结果,具体取决于我是通过UIWebView还是Safari从相同的初始链接到达Maps应用程序。 有没有一种方法可以让UIWebView从链接中打开iOS6的苹果地图应用程序而无需解析和地理编码URL? 顺便说一下,在我的代理方法被调用以处理maps.google.com url之后,它会被调用两次,并带有以下参数:
url=about:blank 
navigationType=UIWebViewNavigationTypeOther

并且最终对显示没有影响。你知道这是什么意思吗?
1个回答

4
是的,可以通过UIWebview将maps.apple.com链接打开到Maps应用程序中。不要直接让UIWebview打开链接,而是传递给操作系统来处理。在 webView: shouldStartLoadWithRequest: navigationType: 方法中,我特别处理了地图链接:
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 sharedApplication]openURL:url];
    return NO;
}

这将在iOS6中打开苹果地图应用程序。在iOS5中,它将在Safari中打开Google地图网页。我会查找iOS5系统,并在那里以不同的方式处理URL。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接