1

アプリがアクティブなときにユーザーの現在の場所を追跡し、地図上に表示するPhoneGapアプリを作成しています。

setIntervalアプリが起動すると、 onを使用して位置の追跡を開始しnavigator.geolocation.getCurrentPositionます。一時停止イベントを受け取ると、その間隔はクリアされます。再開イベントを取得したら、setIntervalもう一度呼び出します。

また、レジュームイベントを受信したら、サーバーに Ajax リクエストを送信して、アプリがバックグラウンドで動作している間に何か興味深いことが発生したかどうかを確認し、結果として情報を含む新しい画面を表示する必要があります。

時々、私の電話ではほとんどありませんが、テスターの電話ではより頻繁に、履歴書に時間がかかりすぎて、アプリが iOS によって強制終了されます。

Code Type:       ARM (Native)
Parent Process:  launchd [1]

Date/Time:       2013-05-29 09:26:54.352 +0200
OS Version:      iOS 6.1.4 (10B350)
Report Version:  104

Exception Type:  00000020
Exception Codes: 0x000000008badf00d
Highlighted Thread:  0

Application Specific Information:
com.x failed to resume in time

Elapsed total CPU time (seconds): 10.590 (user 10.590, system 0.000), 53% CPU 
Elapsed application CPU time (seconds): 9.821, 49% CPU

次の疑似コードは、アプリをどのように配線したかを示しています。

(function app() {

    function init() {
        // Init app
        // ...

        startGPS();

        checkState();
    }

    function checkState() {
        // Make Ajax request to server and compare with local state
        // and decide which screen to show
        // ...
    }

    function startGPS() {
        // use setInterval on navigator.geolocation.getCurrentPosition
        // ...
    }

    function stopGPS() {
        // clear the interval from startGPS()
        // ...
    }

    // Other functions
    // ...

    on('pause', stopGPS);
    on('resume', startGPS)
    on('resume', checkState);
    on('deviceready', init);

})();

私は、おそらく素朴に、Ajax 呼び出しと呼び出しの両方getCurrentPositionが非同期であるため、レンダリングをロックアップせず、アプリは時間内に再開できると信じていましたが、そうではないようです。また、履歴書コードを でラップしようとしましたsetTimeoutが、結果は同じでした。

時間内に再開するのに失敗することなくこれを達成するためのより良いアプローチは何でしょうか?

PhoneGap 2.7 を使用しています

4

1 に答える 1

0

startGPS() 関数と checkState() 関数を同期的に実行するには、一方が戻るのを待ってから他方を呼び出します。これらの 2 つの関数のいずれかが CPU に負荷をかけ、アプリが強制終了されている可能性があるため、両方の方法を試してください。

function startGPS() {
  // use setInterval on navigator.geolocation.getCurrentPosition
}
function checkState(){
  $.ajax({
    url: someurl,
    success: function(){
      // Make Ajax request to server and compare with local state
      startGPS();
    }
  });
}
on('resume', checkState);

また

function startGPS() {
  var firstCall = true;
  setInterval(function(){
    navigator.geolocation.getCurrentPosition(function(position){
      // do some stuff with position...

      if(firstCall){
        firstCall = false;
        checkState(); // check state after first successful position is returned
      }
    });
  }, someInterval);
}
function checkState(){
  // Make Ajax request to server and compare with local state
}
on('resume', startGPS);
于 2013-06-11T16:58:32.663 に答える