Phonegap设备在iOS中不能使用Cordova 2.2.0

我正在构buildPhoneGap应用程序。 不幸的是,当部署到iOS设备和模拟器时, deviceready事件从不会触发。 我正在使用Phonegap 2.2.0。

当我将相同的代码部署到Android(当然使用Android特定的cordova.js文件)的应用程序将完美工作。

当我用devicereadyready()replacedeviceready的时候,应用程序也会在iOS上加载,然后它将无法访问设备特定的API。

cordova.js被加载,因为我会看到一个简单的警告消息,我把它放在里面,但deviceready永远不会触发,并且API从不暴露。

我的HTML 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上完成…

在我的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脚本构build)中使用的代码(这是不同的事件文档中的代码)的方法。

主要的区别是(我不知道其中哪一个实际上应该被考虑在内):

  • cordova-2.2.0.js位于根文件夹中
  • <script>包含在</body>标签之前,而不是在文档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上工作得相当好,对于我来说,比从文档嵌套的双处理程序更容易理解。

如果您在cordova.js 之前之后添加deviceready侦听器, 似乎有所作为

我找不到任何文档,但是cordova.js拦截了对addEventListener + removeEventListener的调用,并且只调用了 cordova.js 之前添加的devicereadycallback。

在我的情况下,解决scheme只是重新安排脚本顺序:

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

我发现如果不小心将cordova.js脚本包含两次,那么deviceready事件不会触发。

我有同样的问题。 我通过添加设备插件来工作。

 $ cordova plugin add org.apache.cordova.device 

核实:

 $ cordova plugin ls