Phonegap设备在iOS中不能使用Cordova 2.2.0
我正在构buildPhoneGap应用程序。 不幸的是,当部署到iOS设备和模拟器时, deviceready
事件从不会触发。 我正在使用Phonegap 2.2.0。
当我将相同的代码部署到Android(当然使用Android特定的cordova.js
文件)的应用程序将完美工作。
当我用deviceready
– ready()
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
- Phonegap IOS – 插件推送设置
- iOS的PhoneGap正则expression式replace
- Xcode PhoneGap navigator.connection未定义
- 在使用PhoneGap构build的iPhone应用程序中加速jQuery Mobile 1.1中的页面转换?
- cordova3.1.0:找不到插件或不是CDVPlugin
- 添加或删除cordova / phone间隙中的插件时出错
- cordova ios resolveLocalFileSystemURL ENCODING_ERR在cordova.file.applicationDirectory
- audio不在cordovaiOS 8中播放
- iOS无法find插件,Android很好