PhoneGap iOS应用无法及时恢复

时间:2013-06-11 15:35:55

标签: ios cordova

我正在创建一个 PhoneGap 应用,当应用处于有效状态时,该应用会跟踪用户的当前位置并将其显示在地图上。

当应用启动时,我会使用setInterval上的navigator.geolocation.getCurrentPosition开始跟踪该位置。当我收到暂停事件时,该间隔被清除。当我收到 resume 事件时,我再次致电setInterval

此外,在收到 resume 事件时,我需要向服务器发送一个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调用都是异步的,我不会锁定渲染,应用程序可以及时恢复,但似乎不是就是这样。我还尝试将{em> resume 代码包装在setTimeout中,但结果相同。

在没有及时恢复的情况下,实现这一目标的更好方法是什么?

我正在使用PhoneGap 2.7

1 个答案:

答案 0 :(得分:0)

您可以尝试同步运行startGPS()和checkState()函数,方法是在调用另一个之前等待一个函数返回。尝试两种方式,因为这两个函数中的一个可能是锤击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);