【问题标题】:Suppressing the native dialog when clicking on a tel: link单击电话时抑制本机对话框:链接
【发布时间】:2013-09-02 17:00:35
【问题描述】:

我一直在寻找关于在单击电话链接时抑制移动设备上的对话框的问题。

我们有这个要求,用我们网站上的自定义弹出窗口替换 iPhone 和 Android 上现有的原生对话框。

我们可以使用 HTML5,但对于一个基本网站,我们不使用 javascript(用于功率较低的 WAP 手机)。

有没有办法通过我的站点中的 HTML 来抑制来自浏览器(safari、chrome、firefox?)的手机本机对话框?

谢谢

【问题讨论】:

  • 是否只需要基于移动 webkit 的浏览器?数字必须是 tel: 链接,还是你可以用不同的东西包装数字以从浏览器中伪装它们?
  • 将基于 webkit...如果我们伪装它们,那么我们仍然需要一种从浏览器访问电话拨号器的方法。
  • 要清楚。我们实际上想用 HTML 自定义对话框替换原生对话框。我们仍然希望能够拨打电话。
  • 我认为在拨打电话之前出现的本机对话框的整个要点是让用户有机会接受或拒绝尝试。这很重要,因为电话号码可能在海外,或者是付费电话,用户必须能够拒绝(货币费用可能非常高)。如果任何网页都能够简单地自行拨打电话,而无需电话先要求用户确认,那将是一个严重的安全问题,很容易被诈骗者利用。
  • 它根本不会被视为您的应用程序中的安全漏洞。这是 Android 为保护用户而强制执行的标准程序。没有办法向操作系统“承诺”你会表现自己并因此绕过本机对话,因为不道德的诈骗者会类似地“承诺”同样的事情。

标签: android html iphone browser popup


【解决方案1】:

如果您的用例允许您避免使用 tel: 链接格式,您可以将数字放在其他看起来像链接的地方,然后让您的网页按照您的意愿处理它们。为了避免浏览器自动添加指向它认为是电话号码的数字的链接,请将以下 html 标记添加到文档的<head>(来自Safari Developer Library):

<meta name="format-detection" content="telephone=no">

这是否足够,还是我不理解您的问题?

更新

经过进一步澄清,似乎期望的结果是在按下tel:// 链接时调用本地电话拨号器,但只需抑制拨号前的用户提示。

根据RFC 3966: The tel URI for Telephone Numbers,第 11 节安全注意事项:
“Web 客户端和类似工具不得使用“tel”URI 来放置 未经该用户明确同意的电话 客户。在没有适当用户的情况下自动拨打电话 确认可能会带来许多风险..."

因此,尽管仍有可能存在用于抑制警报的参数,例如 &amp;confirmation=false&amp;alert=no,但它可能未记录在案,并且对于每个移动操作系统都不同。我的猜测是它不存在。

可能的解决方法

根据iOS Developer Library
“当用户点击网页中的电话链接时,iOS 会显示一个警报,询问用户是否真的要拨打电话号码,如果用户接受,则开始拨号. 当用户在本机应用程序中打开带有 tel 方案的 URL 时,iOS 不会显示警报并在不进一步提示用户的情况下启动拨号。但是,可以将本机应用程序配置为显示自己的警报。"

因此,如果您的用例允许您将网站嵌入 UIWebView 并将其作为 iOS 应用程序分发,那么应该可以取消警报。

根据Android Developer Docs
“[使用拨号器] 要求您的应用程序在清单中请求以下权限:&lt;uses-permission id="android.permission.CALL_PHONE" /&gt;

同样,如果您的用例允许您将网站嵌入 android.webkit.WebView 并将其作为 Android 应用程序分发,那么似乎也可以取消警报。

【讨论】:

  • 很好的反应...我们已经有一个 Android 和 iPhone 应用程序,我们已经应用了这个。 Web 应用程序适用于没有下载应用程序或在没有应用程序可用的设备上的人。我得到的印象(我最初也这么认为)是不可能从 Web 应用程序中抑制拨号确认弹出窗口。由于我们还要处理众多浏览器(safari、chrome、opera、firefox),因此如果远程可用,那么信任任何此类抑制将是极其不可靠的。
  • 我将把问题留待更长时间,看看是否有更好的答案。
  • @aqwert 有趣的是,我刚刚创建了一个带有tel: 链接的测试页面,并在Android 2.3 手机上打开了它。我没有收到提示。相反,它直接将我带到了拨号器应用程序(但它实际上并没有自动拨号)。这是您在 Android 上的体验吗?
  • 我们发现,根据 Android 操作系统,它会显示或不显示对话框。无论如何,这有点让人头疼,因为它不仅可能是特定于操作系统的,而且也是运营商的。我们可以根据 UserAgent 字符串进行检测,但无法测试 Android 操作系统的所有变体。
  • @BigMacAttack 这似乎与供应商和设备相关......已经看到不同(不一致)的行为。
【解决方案2】:

不确定这是否是您要求的完整规范……据我所知,我已经断断续续地与它斗争了好几个月,如果操作系统没有办法直接抑制拨号器对话框认为这是在独立浏览器的页面中单击的电话号码。

我记得它在数据参数中广播了一个带有“Tel:...”的意图。由于供应商的拨号器会监视它,因此您最希望的就是让您自己的拨号器也监听该事件......但是随后android会弹出那个烦人的“完整操作”对话框,他们必须点击你的,然后必须启动另一个拨号器意图。 (然后你会看到你的拦截拨号器吗?)

正如 BigMacAttack 所指出的,您可以通过 webkit 运行它,将您的标签更改为“tel”以外的内容并拦截它。同样,如果服务器页面总是可以通过 web-kit 视图提供,你可以做我在几个 android 和 iOS 应用程序上所做的:

// Android flavored
wv1.setWebViewClient(new WebViewClient() {

    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {

        boolean dialMe = false;                 

        if (url.indexOf("tel:") > -1) {  // PHONE permissions in AndroidManifest
                                             // see also DIAL_PHONE

            dialMe = myCustomDialerPopup ( Uri.parse(url) ) ; // display YOUR msg.

            if ( dialMe = true ) { // launch normal dialer

                Intent i =  new Intent( Intent.ACTION_DIAL, Uri.parse(url) ) ;
                view.getContext().startActivity(i);  

            } else {
                            //// guess they don't want to call - oops marketing failed !
            } 
        }

        return true;  // or false to stop navigation.
    } 

}                       

【讨论】:

    猜你喜欢
    • 2011-05-10
    • 2010-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多