Phonegap deviceready не стреляет с помощью Cordova 2.2.0 в iOS

Я создаю приложение PhoneGap. К сожалению, при развертывании на устройствах iOS и симуляторах deviceready событие никогда не срабатывает. Я использую Phonegap 2.2.0.

когда я развертываю тот же код на Android (используя Android-specific cordova.js файл, конечно) приложение будет работать отлично.

когда я заменить deviceready с jQuery -ready() приложение также будет загружаться на iOS, но тогда у него не будет доступа к API-интерфейсам устройства.

на cordova.js is загружен, поскольку я увижу простое предупреждающее сообщение, которое я положил внутри него, но deviceready никогда не срабатывает, и API никогда не подвергаются воздействию.

Мои HTMLs head:

<script type="text/javascript" charset="utf-8" src="js/cordova.js"></script> <!-- yes it is the iOS version -->
<script src="js/jquery-1.8.2.min.js"></script>
<script src="js/app.js"></script>

мой JS:

function doStuff(){
//app functionality
}
document.addEventListener('deviceready', doStuff, false);

но как-то все будет сделано только на Android...

5 ответов


в моем html у меня есть onload, который запускает добавление прослушивателя событий в deviceready

      function onDeviceReady() {
        console.log("we are an app");
        MyApp.initialize_phonegap();
      }

      function onBodyLoad() {   
        document.addEventListener("deviceready", onDeviceReady, false);
      }

    </script>

  </head>

  <body onload="onBodyLoad()">

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

основные различия (я действительно не знаю, какой из них на самом деле следует принимать во внимание):

  • cordova-2.2.0.js находится в корневой папке
  • <script>s включены прямо перед закрытием </body> - tag, а не в документе head
  • deviceready-разгрузочных работ, как:

    var app = {
    // Application Constructor
    initialize: function() {
        this.bindEvents();
    },
    // Bind Event Listeners
    //
    // Bind any events that are required on startup. Common events are:
    // 'load', 'deviceready', 'offline', and 'online'.
    bindEvents: function() {
        document.addEventListener('deviceready', this.onDeviceReady, false);
    },
    // deviceready Event Handler
    //
    // The scope of 'this' is the event. In order to call the 'receivedEvent'
    // function, we must explicity call 'app.receivedEvent(...);'
    onDeviceReady: function() {
        app.receivedEvent('deviceready');
        myApp.start(); //this is where I put the call to my App's functionality relying on device APIs
    },
    // Update DOM on a Received Event
    receivedEvent: function(id) { // I didn't really use this, yet I left it in here as it's in the demo
        var parentElement = document.getElementById(id);
        var listeningElement = parentElement.querySelector('.listening');
        var receivedElement = parentElement.querySelector('.received');
    
        listeningElement.setAttribute('style', 'display:none;');
        receivedElement.setAttribute('style', 'display:block;');
    
        console.log('Received Event: ' + id);
    }
    };
    
  • последние <script> тег просто называет app.initialize()

это, кажется, работает довольно хорошо на iOS и Android и немного более понятно для меня, чем двойной обработчик вложенности из документов.


Кажется, что это имеет значение, если вы добавляете функция deviceready сработала слушатель до или после на Кордова.js:

Я не смог найти никакой документации по этому вопросу, но Кордова.js перехватывает вызовы addEventListener + removeEventListener и вызывает только deviceready обратные вызовы, которые были добавлены до Кордова.js.

решение в моем случае было просто переставить скрипт порядок:

<script>
document.addEventListener('deviceready', ...)
</script>
<script src="cordova.js"></script>

Я обнаружил, что если вы случайно включите Кордова.сценарий js дважды, затем событие deviceready не запускается.


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

$ cordova plugin add org.apache.cordova.device

проверка:

$ cordova plugin ls