Cordova InAppBrowser — обратные вызовы событий не вызываются после открытия системного браузера (_system)

В нашем приложении Cordova мы используем InAppBrowser (не так ли?) для запуска нашего локального веб-приложения. Иногда нам нужно открыть браузер устройства (Chrome/Safari) для обработки внешних ссылок.

Когда мы возвращаемся из браузера устройств, кажется, что плагин InAppBrowser перестает запускать события ('loadstop', 'loadstart' и т. д.). Мы пытались перерегистрировать события, но это, похоже, не работает.

Кто-нибудь знает, почему?

Вот техническая информация

Мы открываем наше локальное веб-приложение обычным способом:

ref = cordova.InAppBrowser.open(url, 'blank', options);

Никаких сюрпризов при регистрации обратных вызовов событий:

ref.addEventListener('loadstop', onLoadStop);
ref.addEventListener('loadstart', onLoadStart);
ref.addEventListener('loaderror', onLoadError);
ref.addEventListener('exit', onExit);

Мы попытались открыть внешний веб-браузер с помощью window:

window.open(event.url, '_system');

Или используя второй InAppBrowser:

var browser = new cordova.InAppBrowser.open(event.url,'_system');

Мы используем InAppBrowser v3.0.0. Это происходит как на Android, так и на iOS.


person Vaiden    schedule 27.08.2018    source источник


Ответы (1)


По-видимому, это известная проблема с InAppBrowser: открытие системного браузера вызывает события диспетчер вышел из строя.

Официальное решение — зарегистрировать те же обратные вызовы событий в новом InAppBrowser. Поскольку InAppBrowser вообще не запускает события для системного браузера, вам не нужно беспокоиться о запуск двойных обратных вызовов событий. Это решение восстанавливает обработку событий в старом (локальном веб-приложении) InAppBrowser.

Пример из официального выпуска:

//example 3 : hack/solution with cordova.InAppBrowser.open(url, '_system');
//event hander for inAppBrowser
function inAppBrowserEventHandler(event){
  //process few logic with the event parameter
  //and if conditions met lets open it on system browser
  var url = 'https://cordova.apache.org/';

  //open the url in system browser
  var _inAppBrowserSystem = cordova.InAppBrowser.open(url, '_system');

   //for somereason, after assigning the same event handler to the _inAppBrowserSystem, the event dispatcher continues to work
  _inAppBrowserSystem.addEventListener('loadstop', inAppBrowserEventHandler);
}
//open the link in inside the iAB without
var _inAppBrowser = cordova.InAppBrowser.open(url, '_blank');
_inAppBrowser.addEventListener('loadstop', inAppBrowserEventHandler);
person Vaiden    schedule 27.08.2018