升级到cordova 3.6.3后,“tel”,“sms”和“mailto”不再在Android中运行

时间:2014-10-09 05:59:53

标签: android cordova

我最近将基于Cordova的Android应用从3.5.0升级到3.6.3。特殊链接" tel"," sms"和" mailto"停止工作。点击后,没有任何反应。我可以在AndroidManifest.xml,Confix.xml或其他任何东西上做些什么来让它们恢复工作吗?

我构建了两个相同且非常简单的Android应用程序来证明我的怀疑,一个用cordova 3.5.0和一个用3.6.3。它们都有一个简单的链接:

<a href="tel:1(858)xxx-xxxx">Call</a>

第一个起作用,第二个起作用。

我认为他们添加了一种安全功能,以某种方式阻止意图。

PS:两个应用程序都是这样构建的:

cordova create app com.tmp.app "App"
cordova platform add android

在index.html中,我在设备就绪块上添加了上面的电话链接。

请帮忙。

5 个答案:

答案 0 :(得分:91)

我终于找到了答案。您所要做的就是将以下内容添加到config.xml:

<access origin="tel:*" launch-external="yes"/>
<access origin="geo:*" launch-external="yes"/>
<access origin="mailto:*" launch-external="yes"/>
<access origin="sms:*" launch-external="yes"/>
<access origin="market:*" launch-external="yes"/>

我希望这对每个人都有帮助。

这一切都始于IBM !!!

IBM Cordova Security Issues

答案 1 :(得分:8)

我有一个基于3.5.1版本的应用程序,所有特殊链接都在运行精细。但是当我在最新版本3.6.3上升级时,它们无法正常工作。

所以我在代码中进行了以下更改,现在它们工作正常。

  1. 添加InAppBrowser插件

    cordova插件添加org.apache.cordova.inappbrowser

  2. 在JS文件中创建自定义函数以在InApp浏览器中打开特殊链接

    var app = {
            initialize: function() {
            this.bindEvents();
        },         
        bindEvents: function() {
            document.addEventListener('deviceready', this.onDeviceReady, false);
        },         
        onDeviceReady: function() {
            app.receivedEvent('deviceready');
        },
        openNativeAppWindow: function(data) {
            window.open(data, '_system');
        }
    

    };

  3. 您正在调用特殊链接(如短信或电话)的地方 使用数据传递您的自定义网址,并让它打开本机浏览器 窗口反过来将推动本机App处理特殊 网址。

  4. 几个例子:

    <br><br><input type="button" onClick="app.openNativeAppWindow('http://google.com')" value="Open Google"/>
                <br><br><a onClick="app.openNativeAppWindow('geo://0,0?q=dallas')" data-rel="external">google maps</a>
                <br><br><a onClick="app.openNativeAppWindow('geo:0,0?q=Bacau')">Geolocation Test</a>
                <br><br><a onClick="app.openNativeAppWindow('geo:0,0?q=34.99,-106.61(Treasure)')">longitude & latitude with a string label</a>
                <br><br><a onClick="app.openNativeAppWindow('geo:0,0?q=1600+Amphitheatre+Parkway%2C+CA')">street address Test</a>
                <br><br><a onClick="app.openNativeAppWindow('sms:2125551212')">SMS</a>
                <br><br><a onClick="app.openNativeAppWindow('mms:2125551212')">MMS</a>
                <br><br><a onClick="app.openNativeAppWindow('tel:2125551212')">Open Phone Dialer</a>
    

答案 2 :(得分:3)

修改Cordova白名单

其中一个安全修复程序涉及为非http/s协议创建新的白名单。如果您的应用使用除http://https://之外的其他协议,例如sms:mailto:geo:tel:等,那么您将需要进行一些配置更改以将这些协议添加到白名单。

这很容易做到:

  1. 打开Cordova config.xml文件,该文件位于:yourProject - &gt;应用 - &gt; yourProject - &gt; android - &gt;原生的 - &gt; res - &gt; xml - &gt; config.xml中。注意:如果您的项目位于您的项目 - &gt;应用 - &gt; yourProject - &gt; android - &gt; nativeResources - &gt; res - &gt; xml,您将不得不对此文件(在nativeResources文件夹下)进行更改,因为如果此文件存在,它将在重建应用程序时覆盖/ native /文件夹中的config.xml。
  2. 滚动到白名单条目。您应该看到如下列出的项目:

    <access origin="https://my.company.com/resources" />
    <access origin="http://*.othersupplier.com" />
    
  3. 对于您使用的每个非http / https协议,您必须添加如下白名单条目:

    <access origin="sms://*" launch-external="true" />
    <access origin="mailto://*" launch-external="true" />
    
  4. launch-external属性将告诉Cordova允许此URL由Android系统中的其他应用程序处理 - 而不是由当前运行的Cordova / Worklight应用程序处理。

    这意味着,当用户点击<a href="sms:555...">链接时,Android会让注册的任何应用程序sms:处理请求。

    如果白名单中的唯一条目如下所示:

    <access origin="*" />
    

    然后您的应用程序将允许对任何Internet资源的资源请求,这可能会使您的应用程序打开某些类型的攻击。<​​/ p>

    您应该在此标记中列出您希望能够访问的特定域。

    如果您的白名单看起来像这样:

    <access origin="https://www.ibm.com" />
    <access origin="https://my-worklight-server.company.com" />
    

    在您的应用程序中,您使用mailto:协议打开用户的电子邮件客户端,使用geo:协议显示地图,然后您应该将白名单修改为:

    <access origin="https://www.ibm.com" />
    <access origin="https://my-worklight-server.company.com" />
    <access origin="mailto://*" launch-external="true" />
    <access origin="geo://*" launch-external="true" />
    

    HTML:

      

    <a href="tel:+212x-xx-xx-xx-xx">Call</a>

    添加到文件&#34; config.xml&#34; :

    <access origin="tel:*" launch-external="yes"/>
    

    来源:

    https://www.ibm.com/developerworks/community/blogs/worklight/entry/action_required_cordova_android_security_update?lang=en`

答案 3 :(得分:3)

从Cordova 4.0开始,您必须包含白名单插件。

<gap:plugin name="cordova-plugin-whitelist" source="npm" />
<allow-intent href="tel:*" />

https://github.com/apache/cordova-plugin-whitelist

答案 4 :(得分:0)

如果您的 config.xml 中有这些行,请将它们注释掉。

<!--<allow-navigation href="*" />
<allow-navigation href="*://*" />-->