我进行了搜索和搜索,但似乎无法找到解决此问题的方法.
出于某种原因,我不能让'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语句,则会立即拨打该号码而不进行确认.我真的希望它通过提供警报来实现以前的功能,让您可以选择在拨打号码之前点击"呼叫"或"取消".
如果作为HTML链接启动,则tel URL方案如果显示为:
1-408-555-5555
如果从本机URL字符串启动(意味着您使用Objective-C编写此字符串并且未通过WebView提供此字符串),则您的URL字符串应如下所示:
tel:1-408-555-5555
注意:这仅适用于安装了Phone应用程序的iOS设备(仅限iPhone).iPad和iPod Touch设备将显示警告消息.
注意2:确保您传递的电话号码不包含空格或其他特殊字符(例如*和#).
代码反馈
根据您的代码,现在情况有点清晰.您评论当您if
在shouldStartLoadWithRequest
方法中返回第一个语句(返回的位置YES
)时没有任何反应.这正是您应该看到的行为,因为您的应用不是电话应用.只有Phone应用程序才能处理tel:
URL方案.通过返回YES
,您告诉操作系统您的应用将处理电话呼叫,但它不能.当条件被删除时,您会收到呼叫,因为下一个块检查if ([[UIApplication sharedApplication] canOpenURL:url])
允许sharedApplication
(在这种情况下,是电话应用程序)启动呼叫.
事情如何运作和你想要什么
操作系统不会为您显示"呼叫/取消"警告对话框.那取决于你.它出现在Safari中,因为Safari应用程序的shouldStartLoadWithRequest
方法无疑tel:
通过显示一个来响应该方案UIAlertView
.if ([url.scheme isEqualToString:@"tel"])
应该使用"取消"和"取消"按钮YES
触发a 时的条件UIAlertView
.随叫随到,你会告诉sharedApplication
来openURL
; 在取消时,您不会发出通话而且您也想要返回,NO
因此您的应用不会尝试loadWithRequest
.
自我修正编辑
为了公平对待我自己的思维过程中的错误,我将上面的回答留在上面.
我认为呼叫/取消对话框实际上是操作系统的一个功能.对不准确的道歉.
我也错误地浏览了你的代码将URL处理传递给sharedApplication,只有当方案是http
或时才会发生https
.
再看看代码,我想知道你是否有任何机会在Safari中有调试选项?我相信这可以防止警报弹出.另外 - 只是为了仔细检查显而易见的事实 - 你是不是在模拟器中尝试这个,对吗?如果您删除http
/ 的条件检查会发生什么,https
并且只是使用canOpenURL
检查?
但是,除了我对条件和对话框本身的注释中的错误之外,您仍然不应该返回YES
.要拨打电话,您应该只能通过将其传递到sharedApplication:openURL
并确保您返回,NO
因为您的应用不是电话应用.您希望YES
以此方法返回的唯一原因是您的应用程序将以tel:
特殊方式处理链接,而不涉及将其发送到电话应用程序.