【问题标题】:Opening tel: links from UIWebView打开电话:来自 UIWebView 的链接
【发布时间】:2011-12-27 12:27:16
【问题描述】:

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

由于某种原因,我无法在 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 语句,号码会立即拨打,无需确认。我真的很希望它能够像以前那样通过发出警报来发挥作用,让您可以选择在拨打号码之前点击“呼叫”或“取消”。

【问题讨论】:

  • 确认有没有特殊字符?
  • @Hitman 是的 - 链接看起来像 tel:########## (使用实际数字,而不是井号)。有些有破折号,但是否包含它们似乎没有区别。

标签: iphone ios xcode uiwebview


【解决方案1】:

如果作为 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 和 iPod Touch 设备将显示警告消息。

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

代码反馈

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

工作原理和您想要什么

操作系统不会为您显示呼叫/取消警报对话框。那取决于你。它出现在 Safari 中是因为 Safari 应用程序的shouldStartLoadWithRequest 方法无疑通过显示UIAlertView 来响应tel: 方案。 if ([url.scheme isEqualToString:@"tel"]) 的条件应该在 YES 时触发带有呼叫和取消按钮的 UIAlertView。 On Call,你会告诉sharedApplicationopenURL;在取消时,您将不会发出呼叫并且您还希望返回 NO,因此您的应用不会尝试 loadWithRequest

自我更正编辑

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

我相信呼叫/取消对话框实际上是操作系统的一项功能。对不准确之处深表歉意。

我还错误地浏览了您的代码将 URL 处理传递给 sharedApplication 仅在方案为 httphttps 时发生。

再次查看代码后,我想知道您是否有机会在 Safari 中启用调试选项?我相信这可以防止警报弹出。另外——只是为了仔细检查显而易见的——你没有在模拟器中尝试这个,对吗?如果删除http/https 的条件检查并只使用canOpenURL 检查会发生什么?

但是,除了条件和对话框本身的 cmets 中的错误之外,您仍然不应该返回 YES。要拨打电话,您应该只能通过将其传递给sharedApplication:openURL 并确保您返回NO 来完成,因为您的应用程序不是电话应用程序。您希望在此方法中返回 YES 的唯一原因是,如果您的应用要以不涉及将其发送到电话应用的特殊方式处理 tel: 链接。

【讨论】:

  • 您的示例中的 HTML 链接就是我们正在做的事情。正如我所提到的,它曾经在 iOS 5 之前工作,所以无论如何这不太可能成为问题。这些链接在 Safari 中可以正常工作 - 如果链接没有以这种方式格式化,Safari 也不会工作。不过感谢您的回复。
  • 愿意分享一些关于如何在应用程序中处理 UIWebView 的实际代码吗?你能从你的应用的 UIWebView 成功启动其他 URL 方案吗?编辑:更具体地说,您是否在 UIWebViewDelegate 中处理 shouldStartLoadWithRequest:navigationType 方法以在您的应用程序外部正确启动链接?
  • 我编辑了问题以包含代码以及更多细节。谢谢!
  • 我确实禁用了 Safari 中的调试,但没有弹出窗口。但我会在其他时间担心这个。不过,您的解释确实有帮助……谢谢!
【解决方案2】:

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

【讨论】:

  • 如果链接、电子邮件和号码已经使用anchor 标签添加到HTML 页面,则这没有意义
猜你喜欢
  • 2021-05-29
  • 1970-01-01
  • 2014-01-26
  • 1970-01-01
  • 2010-12-27
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多