Подтвердить что ты не робот

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();

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

4b9b3361

Ответ 1

Сначала я сопротивлялся публикации ответа на этот вопрос. Как уже упоминалось одним из разработчиков, 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." );
});

Ответ 2

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

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

window._cordovaNative = true;

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

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

Ответ 3

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

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

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

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

API связи с "устройством" возвращается к этому обработчику promptbasednativeapi.js(также см. cordova-js/src/android/exec.js). На версии 3.x.x просто говорят

window._cordovaNative = true;
Мне было недостаточно. Необходимо реализовать весь протокол связи.

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

Вы можете использовать "эмулятор" на стороне браузера, например. Расширение эмулятора пульсаций для chrome ( [UPDATE]. Рассмотрим использование 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

Ответ 4

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

Ответ 5

Я вошел в 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>

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

Ответ 6

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

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

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

Ответ 7

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