"tel", "sms" и "mailto" больше не работают в Android после обновления до кордовы 3.6.3
Недавно я обновил приложение для Android на основе cordova от 3.5.0 до 3.6.3. Специальные ссылки "tel", "sms" и "mailto" перестали работать. При нажатии ничего не происходит. Есть ли что-нибудь, что я могу сделать в AndroidManifest.xml или Confix.xml или что-нибудь еще, чтобы вернуть их обратно?
Я построил два одинаковых и очень простых приложения для Android, чтобы доказать свое подозрение, один с кордорой 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, я добавил телефонную ссылку выше в готовом блоке устройства.
Пожалуйста, помогите.
Ответы
Ответ 1
Наконец-то я нашел ответ. Все, что вам нужно сделать, это добавить в 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
Ответ 2
У меня было приложение, построенное на версии 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');
}
};
-
Место, где вы вызываете специальные ссылки, такие как sms или tel, затем
передайте свой собственный URL-адрес с данными и откройте его собственный браузер
окно, которое, в свою очередь, будет подталкивать собственное приложение для обработки специальных
URLs.
Пример:
<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>
Ответ 3
Изменить белый список Кордовы
Одно из исправлений безопасности связано с созданием нового белого списка для протоколов http/s
. Если ваше приложение использует другие протоколы помимо http://
и https://
, например sms:
, mailto:
, geo:
, tel:
и т.д., Тогда вам нужно будет внести некоторые изменения в конфигурацию, чтобы добавить эти протоколы в Белый список.
Это легко сделать:
- Откройте файл config.xml Cordova, расположенный по адресу: yourProject → apps → yourProject → android → native → res → xml → config.xml. Примечание. Если у вас есть файл, расположенный в вашем проекте → apps → yourProject → android → nativeResources → res → xml, вам придется внести изменения в этот файл (в папке nativeResources), так как если этот файл существует, он перезапишет файл config.xml в /native/, когда приложение будет перестроено.
-
Прокрутите до списка белых списков. Вы должны увидеть элементы, перечисленные ниже:
<access origin="https://my.company.com/resources" />
<access origin="http://*.othersupplier.com" />
-
Для каждого используемого протокола non http/https вам нужно будет добавить запись в белый список следующим образом:
<access origin="sms://*" launch-external="true" />
<access origin="mailto://*" launch-external="true" />
Внешний атрибут запуска будет сообщать Кордове, что этот 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`
Ответ 4
Как и в случае с Cordova 4.0, вы должны включить плагин whitelist.
<gap:plugin name="cordova-plugin-whitelist" source="npm" />
<allow-intent href="tel:*" />
https://github.com/apache/cordova-plugin-whitelist
Ответ 5
Эта запись может вам помочь: https://www.simb.co/mailto-links-in-phonegap-cordova/
window.location.href = "mailto:?subject=Something to share with you...";
Работает и на iOS.