我最近将基于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中,我在设备就绪块上添加了上面的电话链接。
请帮忙。
答案 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 !!!
答案 1 :(得分:8)
我有一个基于3.5.1版本的应用程序,所有特殊链接都在运行精细。但是当我在最新版本3.6.3上升级时,它们无法正常工作。
所以我在代码中进行了以下更改,现在它们工作正常。
添加InAppBrowser插件
cordova插件添加org.apache.cordova.inappbrowser
在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');
}
};
您正在调用特殊链接(如短信或电话)的地方 使用数据传递您的自定义网址,并让它打开本机浏览器 窗口反过来将推动本机App处理特殊 网址。
几个例子:
<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:
等,那么您将需要进行一些配置更改以将这些协议添加到白名单。
这很容易做到:
滚动到白名单条目。您应该看到如下列出的项目:
<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资源的资源请求,这可能会使您的应用程序打开某些类型的攻击。</ 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"/>
来源:
答案 3 :(得分:3)
从Cordova 4.0开始,您必须包含白名单插件。
<gap:plugin name="cordova-plugin-whitelist" source="npm" />
<allow-intent href="tel:*" />
答案 4 :(得分:0)
如果您的 config.xml 中有这些行,请将它们注释掉。
<!--<allow-navigation href="*" />
<allow-navigation href="*://*" />-->