アプリがアクティブなときにユーザーの現在の場所を追跡し、地図上に表示する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 を使用しています