Phonegap 3 – Оповещение о том, что если я нажму ok, то произойдет сбой broswer

Я не могу придумать хорошее объяснение этому … Но когда я включаю

<script type="text/javascript" src="phonegap.js"></script> 

В моем приложении phonegap, которое я не изменил, на экране появится 2 всплывающих окна.

 //The first popup gap:["PluginManager","startup","PluginManager224542697"] //the second gap:["App","show","App224542698"] 

Я должен отменить оба всплывающих окна и действительно хотел бы понять рассуждения.

Две строки, о которых идет речь, находятся в строке 21117 и 21118 phonegap.js

  // Tell the native code that a page change has occurred. require('cordova/exec')(null, null, 'PluginManager', 'startup', []); require('cordova/channel').onNativeReady.fire(); 

Это, конечно, не ломается, когда оно находится в приложении, но это означает, что развитие практически невозможно.

Solutions Collecting From Web of "Phonegap 3 – Оповещение о том, что если я нажму ok, то произойдет сбой broswer"

Для меня проблема возникла из-за того, что phonegap.js возвращался в режим PROMPT при работе за пределами телефонной разговора. Я считаю, что этот режим предназначен для телефонного разговора ниже Android 3.2, где вся связь осуществляется через предупреждения (это то, что вы видите).

Я исправил проблему, установив следующую переменную перед загрузкой phonegap.js:

Window._cordovaNative = true;

Это приводит к тому, что телефонная задержка в мысли о том, что вы работаете над телефонной связью 3.2, следовательно, никогда не входит в режим подсказки.

Разумеется, если вы настроите таргетинг на устройства ниже 3.2, то это, вероятно, нарушит всю связь с Phonegap на этих устройствах …

Я наткнулся на эту ошибку и вопрос, пробовав следующее:

  • Завершено учебное cordova create Hello World с cordova create и т. Д.
  • Развертывается как на эмуляторе, так и на подключенном устройстве без проблем.
  • Я получил ту же ошибку, что и при работе с cordova serve и просто cordova serve на // localhost: 8000 в соответствии с инструкциями.

Я согласен, что эти предупреждения очень раздражают. Он убивает всю точку быстрого развития не-родной js-разработки.

Что происходит не так?

API связи с «устройством» возвращается к этому обработчику promptbasednativeapi.js (также см. Cordova-js / src / android / exec.js ). В версии 3.xx просто говорится

 window._cordovaNative = true; 

Было недостаточно для меня. Нужно реализовать весь протокол коммуникации.

Быстрое решение

Вы можете использовать «эмулятор» на стороне браузера, например, расширение эмулятора Ripple для хрома ( [ОБНОВЛЕНИЕ]. Рассмотрите возможность использования https://github.com/apache/incubator-ripple для телефонной заставки 3.xx, как указано DuKes0mE). Такой «эмулятор» может понимать и запускать соответствующие события, например «готовое устройство». Пока это выглядит многообещающе 🙂

Что происходит?

Ответ от @antscode был очень полезен. После некоторого копания и чтения кода cordova / cordova-js я понял, что

  • Ошибка возникает из механизма, который является частью архитектуры плагина cordova. Плагины разрабатываются как так называемые команды cordova, которые могут быть выполнены из js – именно так организована кордовая архитектура.
  • Кордова – это структура JS. Один из них предлагается для первичного написания (неродного) JS-кода. Чтобы поговорить со всеми этими разными родными плагинами, нужно придумать протокол для связи с ними, сорт RPC с сериализацией JSON. Это именно то, что происходит.
  • Плагины также могут быть в чистом JS. Процитировать руководство

Создайте новый плагин echome с:

 window.echo = function(str, callback) { cordova.exec(callback, function(err) { callback('Nothing to echo.'); }, "Echo", "echo", [str]); }; 

Получите доступ к нему как к команде cordova через JS:

  window.echo("echome", function(echoValue) { alert(echoValue == "echome"); // should alert true. }); 

Нет эмулятора

Я мог представить себе ситуацию, когда довольно сложное приложение прорвется внутри такого «эмулятора» клиентской стороны веб-браузера (и только в нем). Лучшим решением было бы выяснить способ убедить приложение не отказываться от метода связи PROMPT (тот, который вызывает раздражающие предупреждения). Ну, у меня сейчас нет такого решения 🙁 Будем рады узнать, как это сделать.

Решение находится здесь: https://gist.github.com/ewiger/7d5e0cc8fccf311e9ce2

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

Я вошел в hello / platform / ios / CordovaLib и скопировал файл cordova.js в свой корень www и изменил

Или загрузите здесь: https://github.com/apache/cordova-ios/blob/master/CordovaLib/cordova.js

 <script type="text/javascript" src="phonegap.js"></script> 

в

 <script type="text/javascript" src="cordova.js"></script> 

И больше всплывающих окон

У меня была такая же проблема с проектом, созданным другим разработчиком. В моем случае причиной осталась конфигурация Cordova / PhoneGap 2.x. Это всплывающее окно связано с плагиновой системой. Удаление плагина из моего config.xml сделало его лучше:

 <plugin name="InAppBrowser" value="org.apache.cordova.InAppBrowser" /> 

В конце я решил, что лучше всего создать новый проект 3.x и переместить весь мой HTML / CSS / JS в только что созданный проект. В новом проекте были зафиксированы все проблемы.

Сначала я сопротивлялся опубликованию ответа на этот вопрос. Как уже упоминалось одним из разработчиков, не следует включать phonegap.js если это не производственный код.

Это, однако, означает, что вы не можете тестировать функции телефонной связи.

Чтобы вкратце объяснить мой мыслительный процесс, во все годы разработки (php) я часто устанавливал глобальные переменные, которые я могу легко написать код для dev, stage or production .

Пожалуйста, подумайте, что это может быть не лучший способ, но для меня это работает, и я наслаждаюсь остальной частью моего базового приложения гораздо больше, чем пересмотр этого в настоящее время;)

Итак, я сделал это:

 //Define SD var SD = {}; //define SD so we can use it globally /*================================================== Is Mobile - If true then we are a mobile ================================================== */ SD.isMobile = true; //This is with the assumtion that your domain contains (for exmaple) http://yourdomain.local if (document.URL.indexOf("local") > 0 || document.URL.indexOf("sex") > 0) { SD.isMobile = false; } SD = { isMobile: SD.isMobile, ENVIROMENT: 'liveApp', CDN: 'yoururl.com/', HTTP: 'http://yoururl.com/', } // #define the globals depending on where we are ----------------------------------------------------- SD.globals = function () { switch (window.location.hostname) { case "sd.local": SD.ENVIROMENT = 'localApp', SD.CDN = 'sd.local/', SD.HTTP = 'http://yoururl.com/', SD.AJAX = SD.HTTP+'app/'; break; case "192.168.0.25": //Set to your machines IP address SD.ENVIROMENT = 'mobilePhone', SD.AJAX = SD.HTTP+ 'app/'; break; default: SD.AJAX = SD.HTTP+'app/'; break; } }; 

И теперь, наконец, после работы init я добавляю phonegap.js если нам это нужно.

  if(SD.isMobile){ $.getScript('phonegap.js', function( data, textStatus, jqxhr){ c( "cordova was loaded." ); }); 

Я испытывал те же самые два всплывающих окна, которые вы описывали, но только испытывал их, когда добавлял iOS в свой проект телефонных разговоров. В первый раз я сделал это, я скопировал папку www из моего рабочего приложения для Android. Это была проблема, потому что у нее были артефакты из плагинов Android. После взрыва и воссоздания приложения iOS в проекте phonegap с помощью инструментов командной строки я более тщательно привел только необходимые файлы html, js и css для своего приложения, которые решили проблему.