2012-11-02 13 views
10

Sto costruendo un'app PhoneGap. Sfortunatamente, quando si esegue la distribuzione su dispositivi iOS e simulatori, l'evento deviceready non viene mai attivato. Sto usando Phonegap 2.2.0.Devono che il licenziatario non stia sparando utilizzando Cordova 2.2.0 in iOS

Quando distribuisco lo stesso codice su Android (utilizzando il file specifico per Android cordova.js), l'app funzionerà perfettamente.

Quando sostituisco lo deviceready con un jQuery- ready(), l'app verrà caricata anche su iOS, ma non avrà quindi accesso alle API specifiche del dispositivo.

Il cordova.js viene caricato in quanto vedrò un semplice messaggio di avviso che ho inserito al suo interno, tuttavia deviceready non si attiva mai e le API non vengono mai esposte.

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

miei JS:

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

Ma in qualche modo roba otterrà solo fatto su Android ...

risposta

10

nel mio html ho un onload che trigger che l'aggiunta di un ascoltatore di eventi a deviceready

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

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

    </script> 

    </head> 

    <body onload="onBodyLoad()"> 
+0

che sembra essere la causa del problema, grazie. Ma ad essere onesti, sono ancora un po 'confuso dal fatto che non capisco perché ho bisogno di annidare un gestore di eventi all'interno di un altro gestore di eventi. Il metodo 'addEventListener' dovrebbe essere disponibile sin dall'inizio come' document', no? Hai una spiegazione per questo comportamento? – m90

+0

hai caricato un carico di corpo =? Questo mi ha fatto inciampare la prima volta. Sono d'accordo con te sarebbe strano se la configurazione del gestore di eventi doppio fosse la soluzione. – olore

+0

No, non ne avevo uno in primo luogo perché non avevo la "logica", quando usarlo "in qualche modo" funziona, eppure sono andato avanti ad usare l'approccio che utilizza l'impostazione di default del progetto, vedere la mia risposta sotto. – m90

4

Per aggiungere alla risposta di Olore ho finito per utilizzare l'approccio che utilizza il codice nel progetto predefinito (che viene generato dallo script ./create) (che è diverso dal codice nello Event docs).

Le principali differenze sono (io non so davvero che uno di questi in realtà devono essere presi in considerazione):

  • cordova-2.2.0.js si trova nella cartella principale
  • <script> s sono compresi a destra prima del chiusura </body> -tag e non in head
  • deviceready opere -la gestione del documento come:

    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); 
    } 
    }; 
    
  • L'ultima <script> tag invoca semplicemente app.initialize()

Questo sembra funzionare abbastanza bene su iOS e Android ed è un po 'più comprensibile per me più del doppio gestore di nidificazione dalla documentazione.

+1

Penso che va in questo modo per i file esterni, simulatore o tutti: -phonegap inizia -loads intera app dispositivo -fires evento ready esecuzione -start js evento -assign -ma è già sparato. inizialmente caricato prima poi eseguito più tardi che incasina la logica. –

0

Ho scoperto che se si include accidentalmente lo script cordova.js due volte, l'evento di deviceready non viene attivato.

1

sembra di fare la differenza, se si sta aggiungendo il deviceready ascoltatore prima o dopo le cordova.js:

io non sono riuscito a trovare alcuna documentazione su questo, ma Cordova .js intercetta le chiamate a addEventListener + removeEventListener e chiama solo callback deviceready che sono stati aggiunti prima di cordova.js.

soluzione nel mio caso era solo per modificare l'ordine script:

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

ho avuto lo stesso problema. L'ho fatto funzionare aggiungendo il plug-in del dispositivo.

$ cordova plugin add org.apache.cordova.device 

per verificare:

$ cordova plugin ls 
Problemi correlati