打开电话:从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是http
或https
。
再看看代码,我想知道是否有在Safari上有debugging选项吗? 我相信这可以防止警报popup。 另外 – 只是为了仔细检查一下显而易见的 – 你不是在模拟器里面试试这个,对吗? 如果删除http
/ https
的条件检查,并使用canOpenURL
检查,会发生什么情况?
但是,除了我对条件和对话本身的评论中的错误之外,你仍然不应该返回YES
。 要拨打电话,只能通过将其传递到sharedApplication:openURL
并确保您返回NO
因为您的应用程序不是电话应用程序。 在这种方法中,您想要返回YES
的唯一原因是您的应用程序要以特殊的方式处理tel:
链接,而不会将其发送到电话应用程序。
如果您在.xib中创build了UIWebView,请selectUIWebView并在Attribute Inspector中检查其属性。 第一个标题应该是“Web视图”,并在其下面提供一个标记为“检测”的checkbox列表。 确保选中“电话号码”。