1

在单击电话链接时,我一直在寻找有关在移动设备上抑制对话框的方法,但无济于事。

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

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

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

谢谢

4

2 回答 2

1

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

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

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

更新

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

根据RFC 3966:电话号码的 tel URI,第 11 节安全注意事项:
“未经该客户端用户的明确同意,Web 客户端和类似工具不得使用“tel”URI 拨打电话。自动拨打电话,无需适当的用户确认可能会带来许多风险......”

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

可能的解决方法

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

因此,如果您的用例允许您将网站嵌入到 a 中UIWebView并将其作为 iOS 应用程序分发,则应该可以抑制警报。

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

同样,如果您的用例允许您将网站嵌入到Android 应用程序中android.webkit.WebView并将其分发为 Android 应用程序,那么抑制警报似乎也是可能的。

于 2013-09-02T22:42:20.593 回答
0

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

我记得它在数据参数中广播了一个带有“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.
    } 

}                       
于 2013-09-04T22:26:44.327 回答