我最近将基于科尔多瓦的Android应用程序从3.5.0升级到3.6.3。特殊链接"电话"、"短信"和"邮件"停止工作。单击时,没有任何反应。我可以在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
在索引.html中,我在设备就绪块上添加了上面的电话链接。
请帮忙。
我终于找到了答案。您所要做的就是将以下内容添加到 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 科尔多瓦安全问题
我有一个基于 3.5.1 版本构建的应用程序,所有特殊链接都工作正常。但是当我升级到最新版本 3.6.3 时,它们不起作用。
所以我对代码进行了以下更改,现在它们工作正常。
-
添加应用浏览器插件
Cordova plugin add org.apache.cordova.inappbrowser
-
在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'); }
};
-
您调用特殊链接(如短信或电话(的地方传递包含数据的自定义 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>
从 Cordova 4.0 开始,您必须包含白名单插件。
<gap:plugin name="cordova-plugin-whitelist" source="npm" />
<allow-intent href="tel:*" />
https://github.com/apache/cordova-plugin-whitelist
修改科尔多瓦白名单
其中一个安全修复程序涉及为非http/s
协议创建新的白名单。如果您的应用程序使用除http://
和https://
之外的其他协议,例如sms:
、mailto:
、geo:
、tel:
等,则需要进行一些配置更改才能将这些协议添加到白名单中。
这很容易做到:
- 打开 Cordova config.xml 文件,位于:yourProject --> apps --> yourProject --> android --> native -->
- res --> xml --> config.xml。注意:如果你有一个文件位于你的项目 --> apps --> 你的项目 --> android --> nativeResources --> res --> xml,你将不得不对此文件进行更改(在 nativeResources 文件夹下(,因为如果此文件存在,它将在重建应用程序时覆盖/native/文件夹中的配置.xml。
滚动到您的白名单条目。您应该会看到如下所示的项目:
<access origin="https://my.company.com/resources" /> <access origin="http://*.othersupplier.com" />
对于您使用的每个非 http/https 协议,您必须添加一个白名单条目,如下所示:
<access origin="sms://*" launch-external="true" /> <access origin="mailto://*" launch-external="true" />
launch-external 属性将告诉 Cordova 允许此 URL 由 Android 系统中的其他应用程序处理,而不是由当前运行的 Cordova/Worklight 应用程序处理。
这意味着当用户点击<a href="sms:555...">
链接时,Android 将允许注册的任何应用程序sms:
处理请求。
如果白名单中的唯一条目如下所示:
<access origin="*" />
然后,您的应用程序将允许向任何 Internet 资源发出资源请求,这可能会使您的应用程序受到某些类型的攻击。
您应该在此标记中列出您希望能够访问的特定域。
如果您的白名单如下所示:
<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>
添加到文件"配置.xml":
<access origin="tel:*" launch-external="yes"/>
源:
https://www.ibm.com/developerworks/community/blogs/worklight/entry/action_required_cordova_android_security_update?lang=en'
如果你的配置中有这些行.xml,然后把它们注释掉。
<!--<allow-navigation href="*" />
<allow-navigation href="*://*" />-->