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.

  • PhoneGap: Détecter si vous exécutez sur un navigateur de bureau
  • PhoneGap désactive la mise en cache
  • Comment appeler une activité Android depuis PhoneGap
  • Accès au JSON imbriqué avec AngularJS
  • Clignotant / clignotant avec JQM et PhoneGap sur Android
  • Phonegap - Choisissez l'image à partir de la galerie
  • 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 …

  • Comment puis-je exécuter des tâches en arrière-plan dans React Native?
  • PhoneGap désactive la mise en cache
  • IOS 6 safari, setInterval n'est pas déclenché
  • UIWebView: Puis-je désactiver l'alerte javascript () à l'intérieur de n'importe quelle page Web?
  • IOS 8 a supprimé la propriété de fenêtre «minimal-ui», y a-t-il d'autres solutions «soft fullscreen»?
  • Empêcher le changement d'orientation dans iOS Safari
  • 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.