Android InAppBrowser _системные обратные вызовы

Я разрабатываю мобильное приложение для Android/IOS/Windows 8 в Кордове, которому нужно передать несколько строк на веб-страницу. К сожалению для меня, веб-страница не поддерживает протокол TLS 1.0, что означает, что более старые версии Android (и версии IOS) не могут открывать страницу в родном браузере.

Это означает, что вызов window.open, если для него задано значение «_blank», не будет загружать страницу в любой версии Android до 16 API, и это действительно гарантируется только для 19 API и выше:

window.open('https://www.libertymountain.com/login.aspx','_blank') 

Мое решение состояло в том, чтобы изменить его на «_system» вместо «_blank». Это работает, потому что телефон может использовать браузер Chrome или Safari вместо родного браузера. Однако, когда я это делаю, все обратные вызовы перестают работать. Он просто открывает страницу, и я не могу запустить на ней скрипт.

Например, приведенный ниже код никогда не выполняет обратный вызов. Он просто открывает веб-страницу:

var ref = window.open('https://www.libertymountain.com/login.aspx','_system');
ref.addEventListener('loadstart', function() { alert("Hello"); });

Я что-то упустил, или есть правильный способ сделать это?

РЕДАКТИРОВАТЬ: Просто чтобы было ясно, это мой код, который никогда не вызывает обратный вызов:

document.addEventListener("deviceready", init, false);

function init() {
    window.open = cordova.InAppBrowser.open;
    var ref = window.open('https://www.libertymountain.com/login.aspx', '_system');
    // This event never triggers, nor does any other event, even though the
    // webpage is opened in Chrome
    websiteReference.addEventListener('loadstart', function(event) { console.log('Hello'); });
}

Если я изменю его на это, события сработают. Но мне нужно сделать это с помощью «_system», иначе старые устройства Android и IOS не смогут этого сделать.

document.addEventListener("deviceready", init, false);

function init() {
    window.open = cordova.InAppBrowser.open;
    // Change '_system' to '_blank'
    var ref = window.open('https://www.libertymountain.com/login.aspx', '_blank');
    // This event never triggers, nor does any other event, even though the
    // webpage is opened in Chrome
    websiteReference.addEventListener('loadstart', function(event) { console.log('Hello'); });
}

person NineToYourSpine    schedule 15.07.2015    source источник
comment
@jcesarmobile Можно? Как? Слушатели не запускаются для внешнего браузера.   -  person NineToYourSpine    schedule 15.07.2015
comment
Извините, вы не можете добавлять слушателей во внешние браузеры.   -  person jcesarmobile    schedule 15.07.2015
comment
@jcesarmobile Так есть ли способ запустить скрипт во внешнем браузере на телефоне?   -  person NineToYourSpine    schedule 15.07.2015
comment
Нет, это невозможно   -  person jcesarmobile    schedule 15.07.2015
comment
@jcesarmobile Хорошо, это то, что мне нужно было услышать. Я удивлен, что это было так трудно узнать. В документации ничего не говорится о том, что внешние браузеры не могут запускать обратные вызовы или запускать на них сценарии.   -  person NineToYourSpine    schedule 15.07.2015


Ответы (2)


Я слышал, что вы не можете выполнять сценарии или вызывать обратные вызовы во внешних системных браузерах (при использовании параметра «_system» для InAppBrowser window.open()). Судя по моим тестам, это правда. С другой стороны, «_blank», конечно, вызывает обратные вызовы, потому что он использует собственный браузер в приложении.

person NineToYourSpine    schedule 15.07.2015
comment
Это, безусловно, было моим опытом - _system кажется более или менее выстрелил и забыл. По крайней мере, до тех пор, пока оно не конфликтует с другими окнами _blank или _self, которые вы могли открыть за это время. Мне действительно интересно, почему они связали _system - ее поведение настолько отличается - person Keith Paul Barrow; 14.09.2016

Чтобы запустить скрипт в другом файле, вам нужно сначала загрузить этот файл следующим образом:

var ref = window.open('http://www.libertymountain.com/','_system');
$(ref .document).load(function() {
    alert('Hello');
    // do other things
});

ИЛИ +-------

document.addEventListener("deviceready", onDeviceReady, false);

// device APIs are available
//
function onDeviceReady() {
     var ref = window.open('http://www.libertymountain.com/','_system');
     ref.addEventListener('loadstart', function(event) { alert('Hello'); });
}
person Prabhu Vignesh Rajagopal    schedule 15.07.2015
comment
Я пробовал уже второй. Обратный вызов срабатывает только в том случае, если вы измените «_system» на «_blank». Как я объяснил в своем посте, это проблема, потому что мне нужно использовать «_system», чтобы старые устройства Android/IOS могли использовать другой браузер для входа на веб-сайт. - person NineToYourSpine; 15.07.2015