从UIWebView打开tel:链接

时间:2011-11-12 05:49:56

标签: iphone ios xcode uiwebview

我进行了搜索和搜索,但似乎无法找到解决此问题的方法。

出于某种原因,我无法获得'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语句,则会立即拨打该号码而不进行确认。我真的希望它通过提供警报来实现其功能,让您可以选择在拨打号码之前点击“呼叫”或“取消”。

2 个答案:

答案 0 :(得分:7)

如果以HTML链接方式启动,则tel URL方案将显示为:

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

如果您从本机URL字符串启动(意味着您在Objective-C中编写此字符串并且未通过WebView提供),则您的URL字符串应如下所示:

tel:1-408-555-5555

注意:这仅适用于安装了手机应用的iOS设备(仅限 iPhone )。 iPad和iPad iPod Touch设备将显示警告信息。

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

代码反馈

根据您的代码,现在情况有点清晰。您评论在if方法(返回shouldStartLoadWithRequest)中放置第一个YES语句时没有任何反应。这正是您应该看到的行为,因为您的应用不是手机应用。只有Phone应用程序才能处理tel: URL方案。通过返回YES,您告诉操作系统您的应用将处理电话呼叫,但它不能。当删除条件时,您会收到调用,因为检查if ([[UIApplication sharedApplication] canOpenURL:url])的下一个块允许sharedApplication(在本例中为Phone应用程序)启动调用。

事情如何运作&amp;你想要什么

操作系统不会为您显示“呼叫/取消”警告对话框。那取决于你。它显示在Safari中,因为Safari应用程序的shouldStartLoadWithRequest方法无疑会通过显示tel:来响应UIAlertView方案。在if ([url.scheme isEqualToString:@"tel"])时,YES的条件应在UIAlertView时触发带有“呼叫和取消”按钮的sharedApplication。在通话中,您会告诉openURL NO;在取消时,您不会发出电话&amp;您还需要返回loadWithRequest,以便您的应用不会尝试http

自我纠正编辑

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

我认为“调用/取消”对话框实际上是操作系统的一项功能。对不准确的道歉。

我还错误地浏览了代码将URL处理传递给sharedApplication,仅在方案为httpshttp时才会发生。

再看看代码后,我想知道你是否有任何机会在Safari中有调试选项?我相信这可以防止警报弹出。另外 - 只是要仔细检查一下 - 你是不是在模拟器里试试这个,对吗?如果您删除https / canOpenURL的条件检查并仅使用YES检查会怎样?

然而,除了我对条件和评论的评论中的错误对话框本身,您仍然不应该返回sharedApplication:openURL。要拨打电话,您应该只能将其传递给NO并确保返回YES,因为您的应用不是电话应用。您希望在此方法中返回tel:的唯一原因是,您的应用将以特殊方式处理{{1}}链接,而不涉及将其发送到手机应用。

答案 1 :(得分:0)

如果您在.xib中创建了UIWebView,请选择UIWebView并在Attribute Inspector中检查其属性。第一个标题应为“Web View”,并在其下方提供标记为“Detection”的复选框列表。确保选中“电话号码”。