Почему Cordova 2.7.0 JS, похоже, больше не работает на удаленных страницах?

Фон

Я пытаюсь обновить приложение iOS, основанное на Cordova 2.0 до версии 2.7.

В основном это приветственный экран, который указывает на удаленную поисковую систему (пожалуйста, воздержитесь от комментариев о действительности приложения и вероятном одобрении, поскольку мы прошли мимо этого), и мы использовали ChildBrowser, чтобы разрешить открытие ссылок в дополнительном браузере, чтобы не улавливать пользователя в веб-просмотре Cordova.

Кордова 2.7 имеет функцию под названием InAppBrowser Я надеюсь использовать вместо ChildBrowser. InAppBrowser делает практически то же самое, кроме пропущенной кнопки для открытия в Safari.

Проблема

Существующие удаленные веб-страницы приложений включают в себя Cordova JS (а также плагин ChildBrowser), и он отлично работает для открытия ссылок в под-браузере.

Мой тест Приложение Cordova 2.7, похоже, не правильно загружает Кордову JS, когда оно загружается с удаленной веб-страницы.

Я попытался использовать этот точный HTML-код на встроенной стартовой странице и удаленной стартовой странице:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <script type="text/javascript" src="http://mydomain.com/mobile/cordova-2.7.0.js"></script>
  </head>
  <body>
    <script>
      document.addEventListener("deviceready", onDeviceReady, false);
      function onDeviceReady() {
        alert("Ready!!");
      }
    </script>
  </body>
</html>

Чтобы проверить это как встроенную стартовую страницу, я помещаю эту строку в config.xml:

<content src="index.html" />

Когда я запускаю приложение, я быстро получаю "Готов!". предупреждение.

Чтобы проверить это как удаленную стартовую страницу (я нацелен на ссылку на удаленную страницу в конечном приложении, я просто использую ее как стартовую страницу для тестирования. то же самое, если я ссылаюсь со встроенной страницы.), я поместил эту строку в config.xml:

<content src="http://mydomain.com/mobile/index.php" />

Когда я запускаю приложение, я просто получаю пустой экран и не предупреждаю.

Далее, в cordova-2.7.0.js L. 6255, я изменил

console.log('deviceready has not fired after 5 seconds.');

к

alert('deviceready has not fired after 5 seconds.');

С этим изменением запуск приложения с помощью стартовой страницы пуста приводит к пустой странице, а затем через пять секунд я получаю предупреждение: "deviceready не запускается через 5 секунд". Так что это говорит мне, что Кордова JS не работает правильно. Излишне говорить, что я не могу заставить InAppBrowser запускать ссылки в дополнительном браузере на удаленном сайте, но я могу заставить его работать отлично на встроенной стартовой странице.

У кого-нибудь есть идеи, куда идти дальше? Это довольно простой пример, поэтому я предполагаю, что это проблема настроек Кордовы или изменение функциональности. Я ценю любые мысли, спасибо!

Ответ 1

Да, что-то сломалось в 2.7 - связано с нашей работой cordova-cli. См.: https://issues.apache.org/jira/browse/CB-3029

Исправление состоит в том, чтобы добавить в корневую папку пустой файл с именем cordova_plugins.json.

Ответ 2

У меня была аналогичная проблема, связанная с обновлением до Кордовы 2.7. Однако моя проблема заключалась в том, что мои консольные инструменты перестали стрелять при запуске приложения. Я не мог понять, почему для меня это происходило. Я думал, это потому, что я обновил jquery.mobile. Это не так. Тогда я подумал, что это проблема .htaccess, и это тоже не так. Оказывается, именно Cordova 2.7 вызывала эту проблему.

Я попытался добавить файл .json на свой сервер, что не устранило проблему.

Исправление происходит в источнике 2.7 и комментирует следующий код:

/*comment out this as it is breaking console.logs
    var xhr = new context.XMLHttpRequest();
    xhr.onload = function() {
        // If the response is a JSON string which composes an array, call handlePluginsObject.
        // If the request fails, or the response is not a JSON array, just call finishPluginLoading.
        var obj = this.responseText && JSON.parse(this.responseText);
        if (obj && obj instanceof Array && obj.length > 0) {
            handlePluginsObject(obj);
        } else {
            finishPluginLoading();
        }
    };
    xhr.onerror = function() {
        finishPluginLoading();
    };
    xhr.open('GET', 'cordova_plugins.json', true); // Async
    xhr.send();
    */

Заменить весь блок вызовом следующей функции:

finishPluginLoading();

Мои журналы теперь работают снова. Мне потребовалось всего 3 дня, царапая мне голову.

Надеюсь, что это поможет кому-то с аналогичной проблемой.

Ответ 3

Если вы вставляете Кордову на внешнюю веб-страницу, не будет возможности открыть InAppBrowser из вашего гибридного приложения, поэтому Кордова не сможет загрузить. Это связано с тем, что InAppBrowser требует, чтобы Кордова была полностью загружена и инициализирована, прежде чем ее можно будет использовать для получения удаленной страницы. Вам нужно использовать свою HTML-страницу, с помощью <script type="text/javascript" src="http://mydomain.com/mobile/cordova-2.7.0.js"></script> в качестве основной точки входа для вашего приложения. Затем вы можете использовать InAppBrowser, чтобы открыть удаленную страницу. (Возможно, вы могли бы сделать это в onDeviceReady(), но не уверены, что он сначала "запустит" страницу.) Я не думаю, что на удаленной странице должен быть какой-либо код Кордовы. Я не уверен, что можно было бы даже взаимодействовать с Кордовой с удаленной страницы из-за той же политики происхождения (возможно, вы могли бы использовать функции InAppBrowser для ввода кода "моста", хотя обойти это.)

Ответ 4

Как отметил Шазрон, проблема связана с файлом "cordova_plugins.json".

Чтобы решить проблему, не меняя код, вы можете создать файл "cordova_plugins.json" в корневой папке и вставить содержимое между кавычками внутри этого файла. Например, шахта имеет следующее содержание:

"Just a dummy file required since Cordova 2.6.0"

Ответ 5

создайте файл cordova_plugins.json, содержащий {}. затем перейдите к cordova-2.7.0.js и прокомментируйте эту строку require('cordova/channel').onNativeReady.fire();, а затем, когда это будет сделано, добавьте ее обратно

Ответ 6

Как и я, если вы используете Cordova 5.1.1 и хотите получить доступ к встроенным функциям после перенаправления, тогда скопируйте папку cordova.js, cordova_plugins.js и плагинов, которая находится в\platform\имя_панели\assets\www\и поместит их на сервер, наконец, ссылку cordova.js внутри вашего html. После каждого добавления плагина обязательно обновите эти файлы и папку.