2014-10-09 56 views
32

我最近将基于cordova的Android应用程序从3.5.0升级到3.6.3。特殊链接“tel”,“sms”和“mailto”停止工作。点击时,没有任何反应。有什么我可以在AndroidManifest.xml或Confix.xml或其他任何可以使它们恢复工作的地方?升级到科尔多瓦后,“tel”,“sms”和“mailto”不能在Android上工作3.6.3

我建立了两个相同和非常简单的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中,我添加上述设备准备块上的电话链路。

请帮忙。

回答

8

我有一个应用程序建立在3.5.1版本和所有特殊链接工作罚款。但是,当我升级最新版本3.6.3,然后他们没有工作。

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

  1. 添加InAppBrowser插件

    科尔多瓦插件添加org.apache.cordova.inappbrowser

  2. 在你的JS文件,打开应用程式内浏览器中的特殊链接创建自定义功能

    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. 你在哪里上的数据自定义URL调用类似短信或电话的特殊链接,然后 通,让它打开本地浏览器 窗口,它反过来将推动原生应用程序来处理的特殊 网址的地方。

几个例子:

<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> 
+0

我会试试看AAhad。非常感谢你。只有一个问题:它会打开InAppBrowser然后重定向,还是直接进入电话或电子邮件应用程序?因为屏幕上的中间阶段(通过InAppBrowser)并不是一个好的体验。再次感谢。 – abelabbesnabi 2014-10-09 15:49:54

89

我终于找到了答案。所有你需要做的是将以下内容添加到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

+8

在我删除之前,这并不适用于我:。 – 2015-04-29 01:00:49

+2

这个'launch-external'目前没有记录在白名单插件中,但根据代码它和''标签一样 – 2015-07-24 10:29:23

+1

而不是简单的链接,window.open('geo:xxxxx,xxxxxx',' _system')在删除后为我工作 – Michael 2015-12-01 20:27:21

3

修改科尔多瓦白名单

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

这是很容易做到:

  1. 开拓科尔多瓦config.xml文件,位于:yourProject - >应用程序 - > yourProject - > Android的 - >本地 - >水库 - - > xml - > config.xml。注意:如果您的文件位于您的项目 - >应用程序 - > yourProject - > android - > nativeResources - > res - > 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" /> 
    

推出-external属性将告诉Cordova允许此URL由Android系统中的其他应用程序处理 - 而不是由当前运行的Cordova/Worklight应用程序处理。

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

如果是在白名单中的唯一入口是这样的:

<access origin="*" /> 

那么你的应用程序将允许任何互联网资源,这可能会打开你的应用程序对某些类型的攻击资源请求。

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

如果你的白名单看起来是这样的:

<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>

加入档案“config。XML”:

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

来源:

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

+0

'mailto'和'tel'帮助我!然而,我仍然无法弄清楚如何让短信为iOS工作。任何线索? – Shotbyabel 2016-07-21 22:15:00

相关问题