Phonegap deviceready ne lance pas avec Cordova 2.2.0 dans iOS

Je crée une application PhoneGap. Malheureusement, lors du déploiement sur des appareils et des simulateurs iOS, l'événement deviceready ne se déclenche jamais. J'utilise Phonegap 2.2.0.

Lorsque je déploie le même code sur Android (en utilisant le fichier cordova.js spécifique à cordova.js , bien sûr), l'application fonctionnera parfaitement.

Lorsque je remplace le deviceready par un jQuery- ready() l'application sera chargée sur iOS, mais il n'aura plus accès aux API spécifiques au périphérique.

Le cordova.js est chargé car je verrai un message d'alerte simple que je mets dedans, mais que deviceready ne se déclenche jamais et que les API ne sont jamais exposées.

Ma head HTML:

 <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> 

Mon JS:

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

Mais en quelque sorte, les choses ne se feront que sur Android …

  • Javascript extrayant le numéro de la chaîne
  • Comment faire pour autoupdate un thread de forum lors de nouveaux messages?
  • Déterminer si le clic de la souris s'est produit dans la moitié gauche ou droite de DIV
  • Comment supprimer des espaces d'une chaîne à l'aide de JavaScript?
  • Jquery soumette le formulaire de sélection lorsque l'option est sélectionnée
  • Comment accéder à la page parent iFrame en utilisant jquery?
  • Élément d'échelle proportionnel à la couverture d'arrière-plan avec jQuery
  • JQuery autorise seulement deux nombres après le point décimal
  • 5 Solutions collect form web for “Phonegap deviceready ne lance pas avec Cordova 2.2.0 dans iOS”

    Dans mon html, j'ai une surcharge qui déclenche que l'ajout d'un auditeur d'événement à deviceready

      function onDeviceReady() { console.log("we are an app"); MyApp.initialize_phonegap(); } function onBodyLoad() { document.addEventListener("deviceready", onDeviceReady, false); } </script> </head> <body onload="onBodyLoad()"> 

    Pour ajouter à la réponse d'Olore, j'ai fini par utiliser l'approche selon laquelle le code dans le projet par défaut (qui se construit à partir du script ./create ) utilise (ce qui est différent du code dans les documents Événement ).

    Les principales différences sont (je ne sais pas vraiment lequel d'entre eux doit être pris en compte):

    • cordova-2.2.0.js se trouve dans le dossier racine
    • <script> s sont inclus directement avant la fermeture </body> -tag et non dans la head du document
    • deviceready -handling fonctionne comme:

       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); } }; 
    • La dernière <script> appelle juste app.initialize()

    Cela semble fonctionner assez bien sur iOS et Android et est un peu plus compréhensible pour moi que le double manipulateur niche des docs.

    Il semble faire une différence si vous ajoutez l'auditeur déverrouillé avant ou après le cordova.js :

    Je n'ai pas pu trouver de documentation à ce sujet, mais cordova.js intercepte les appels à addEventListener + removeEventListener et n'appelle que les retours de retour deviceready qui ont été ajoutés avant cordova.js.

    La solution dans mon cas était simplement de réorganiser l'ordre de script:

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

    J'ai découvert que si vous incluez accidentellement le script cordova.js deux fois, l'événement deviceready ne déclenche pas.

    J'avais le même problème. Je l'ai fait fonctionner en ajoutant le plugin de l'appareil.

     $ cordova plugin add org.apache.cordova.device 

    Vérifier:

     $ cordova plugin ls 
    JavaScript rend le site Web intelligent, beauté et facile à utiliser.