打开电话:从UIWebView的链接

我search和search,但我似乎无法find解决这个问题。

出于某种原因,我不能让'tel:'链接在UIWebView中工作。 点击链接时,出现“无法显示URL”信息。 点击Safari浏览器中的同一个链接可以很好地工作,并拨打该号码。

这个问题从iOS 5开始。这些链接在iOS 4.2和4.3中完美运行。

我不确定其他信息可能有用,所以请让我知道,如果我需要澄清。

谢谢!

编辑:

这里是使用的实际代码…

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { NSURL *url = request.URL; if ([url.scheme isEqualToString:@"tel"]) { return YES; } if (![url.scheme isEqualToString:@"http"] && ![url.scheme isEqualToString:@"https"]) { if ([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url]; return NO; // Let OS handle this url } } [NSThread detachNewThreadSelector:@selector(startBusy) toTarget:self withObject:nil]; return YES; } 

如果我拿出第一个if语句,那么这个号码就会立即被拨打,而且没有确认。 我真的很喜欢它通过提供一个警报function的方式,让你select打“电话”或“取消”之前拨号码。

如果以HTML链接的forms启动,tel URLscheme将显示为:

 <a href="tel:1-408-555-5555">1-408-555-5555</a> 

如果您从本地URLstring启动(意味着您在Objective-C中编写了这个代码,并且没有通过WebView提供它),那么您的URLstring应该如下所示:

 tel:1-408-555-5555 

注意:这仅适用于安装了电话应用程序的iOS设备(仅限于iPhone )。 iPad和iPod Touch设备将显示警告消息。

注2:确保您传递的电话号码不包含空格或其他特殊字符(如*和#)。

代码反馈

根据你的代码,事情现在有点清楚了。 当你在shouldStartLoadWithRequest方法中留下第一个if语句(在这里你返回YES )时,你评论了什么也没有发生。 这正是您应该看到的行为,因为您的应用程序不是电话应用程序。 只有电话应用程序可以处理tel: URLscheme。 通过返回YES ,你告诉操作系统,你的应用程序将处理电话,但它不能。 当条件被移除时,你会得到调用,因为下一个检查if ([[UIApplication sharedApplication] canOpenURL:url])允许sharedApplication (在这种情况下是Phone应用程序)启动呼叫的方块if ([[UIApplication sharedApplication] canOpenURL:url])

事情如何工作,你想要什么

操作系统不会处理为您显示呼叫/取消警报对话框。 那取决于你。 它出现在Safari中,因为Safari应用程序的shouldStartLoadWithRequest方法无疑通过显示UIAlertView来响应tel:scheme。 if ([url.scheme isEqualToString:@"tel"]) YES ,当YES ,用一个Call和Cancelbutton触发一个UIAlertView 。 在通话中,您将告诉sharedApplication openURL ; 取消,你不会发出呼叫,你也将要返回NO所以你的应用程序不会尝试loadWithRequest

自我纠正编辑

为了公平对待我自己的思维过程中的错误,我将我的答案留在上面。

我相信调用/取消对话框实际上是操作系统的一个function。 对不准确的道歉。

我也错误地浏览了你的代码的URL处理传递到sharedApplication只有当scheme是httphttps

再看看代码,我想知道是否有在Safari上有debugging选项吗? 我相信这可以防止警报popup。 另外 – 只是为了仔细检查一下显而易见的 – 你不是在模拟器里面试试这个,对吗? 如果删除http / https的条件检查,并使用canOpenURL检查,会发生什么情况?

但是,除了我对条件和对话本身的评论中的错误之外,你仍然不应该返回YES 。 要拨打电话,只能通过将其传递到sharedApplication:openURL并确保您返回NO因为您的应用程序不是电话应用程序。 在这种方法中,您想要返回YES的唯一原因是您的应用程序要以特殊的方式处理tel:链接,而不会将其发送到电话应用程序。

如果您在.xib中创build了UIWebView,请selectUIWebView并在Attribute Inspector中检查其属性。 第一个标题应该是“Web视图”,并在其下面提供一个标记为“检测”的checkbox列表。 确保选中“电话号码”。