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

如果delegate方法返回YES指示UIWebView应该继续打开链接,则立即触发对delegate的新调用,此时参数为

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

回到YES这个,可以预见的是,maps.google.com 网页会在我的 UIWebView 中打开。但我确实希望启动 iOS6 Apple Maps 应用程序。我可以尝试从 URLCLGeocoder创建一个MKMapItem,按照如何在 iOS 6 中使用特定地址启动 iOS 地图应用程序?,但CLGeocoder似乎想要纯文本而不是带有所有常规注释的 url,这是一项非常详细的解析工作。如果我解析 URL 的方式与 Mobile safari 的解析方式不同,那么我可能会看到不同的地图结果,具体取决于我是通过 UIWebView 还是 Safari 从相同的初始链接到达 Maps 应用程序。

有没有办法让 UIWebView 从链接打开 iOS6 Apple Maps 应用程序,而无需解析然后对 URL 进行地理编码?

顺便说一句,在使用 maps.google.com url 调用我的委托方法后,它会使用以下参数调用两次:

url=about:blank 
navigationType=UIWebViewNavigationTypeOther

并且最终对显示没有影响。知道那是什么吗?

4

1 回答 1

4

是的,有一种方法可以从 UIWebview 打开到 Maps 应用程序的 maps.apple.com 链接。不要让 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 中打开 Apple Maps 应用程序。在 iOS5 中,它将在 Safari 中打开谷歌地图网页。我将寻找 iOS5 系统并在那里以不同的方式处理 URL。

于 2013-01-26T09:29:54.777 回答