10

PhoneGap アプリを構築しています。残念ながら、iOS デバイスおよびシミュレーターにデプロイする場合、devicereadyイベントは発生しません。Phonegap 2.2.0 を使用しています。

同じコードを Android にデプロイすると (もちろん Android 固有のcordova.jsファイルを使用して)、アプリは完全に動作します。

devicereadyを jQueryに置き換えると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 でしかできません...

4

5 に答える 5

10

私のhtmlには、イベントリスナーをdevicereadyに追加することをトリガーするonloadがあります

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

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

    </script>

  </head>

  <body onload="onBodyLoad()">
于 2012-11-04T02:31:14.850 に答える
4

oloreの答えに追加するために、私はデフォルトプロジェクト(./createスクリプトからビルドされる)のコードが使用するアプローチを使用することになりました(これはイベントドキュメントのコードとは異なります)。

主な違いは次のとおりです(これらのどれが実際に考慮されるのかはわかりません)。

  • cordova-2.2.0.jsルートフォルダにあります
  • <script></body>sは、ドキュメントのではなく、終了タグの直前に含まれます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で非常にうまく機能しているようで、ドキュメントからネストされているダブルハンドラーよりも少し理解しやすいです。

于 2012-11-05T11:22:27.850 に答える
1

cordova.jsのまたはdevicereadyリスナーを追加すると、違いが生じるようです。

これに関するドキュメントは見つかりませんでしたが、cordova.js は addEventListener + removeEventListener の呼び出しをインターセプトし、cordova.js の前に追加されたdeviceready コールバックのみを呼び出します。

私の場合の解決策は、スクリプトの順序を並べ替えるだけでした:

<script>
document.addEventListener('deviceready', ...)
</script>
<script src="cordova.js"></script>
于 2014-08-07T16:39:35.440 に答える
0

私は同じ問題を抱えていました。デバイスプラグインを追加することで動作するようになりました。

$ cordova plugin add org.apache.cordova.device

検証します:

$ cordova plugin ls
于 2014-08-21T18:50:28.703 に答える