Phonegap设备已经在iOS中使用Cordova 2.2.0无法启动

时间:2012-11-02 13:24:48

标签: javascript jquery ios cordova

我正在构建一个PhoneGap应用程序。不幸的是,在部署到iOS设备和模拟器时,deviceready事件永远不会触发。我正在使用Phonegap 2.2.0。

当我将相同的代码部署到Android时(当然使用特定于Android的cordova.js文件),该应用程序将完美运行。

当我用jQuery替换deviceready - ready()时,应用程序也会在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上完成......

5 个答案:

答案 0 :(得分:10)

在我的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()">

答案 1 :(得分:4)

为了添加到olore的答案,我最终使用了默认项目中的代码(从./create脚本构建)使用的方法(与 {{3中的代码不同) }} )。

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

  • 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上运行得相当好,对我来说比从文档中嵌套的双重处理程序更容易理解。

答案 2 :(得分:1)

如果您在 cordova.js 之前添加 deviceready 侦听器 ,这似乎会有所不同>:

我无法找到任何关于此的文档,但是cordova.js拦截了对addEventListener + removeEventListener的调用,并且只调用了在之前添加了的cordready回调。 cordova.js。

我的案例中的解决方案只是重新排列脚本顺序:

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我遇到了同样的问题。我通过添加设备插件让它工作。

$ cordova plugin add org.apache.cordova.device

验证:

$ cordova plugin ls