Chr*_*her 37 mobile android web-applications settimeout ios
我有一个针对iOS和Android设备的jQuery Mobile网络应用程序.应用程序的一个组件是后台任务,它定期检查a.)对本地数据的更改以及b.)与服务器的连接.如果两者都为真,则任务会推送更改.
我正在使用一个简单的基于setTimeout()的函数来执行此任务.每个失败或成功条件都会在后台任务上调用setTimeout(),确保它以30秒的间隔运行.我使用上一个任务运行时的时间戳更新状态div以进行调试.
在任何桌面浏览器中,这都可以正常工作; 但是,在iOS或Android上,经过一段时间后,任务就会停止执行.我想知道这是否与设备的省电设置有关 - 当iOS进入待机状态时,是否会终止JavaScript执行?这似乎发生了.
如果是这样,恢复的最佳方式是什么?是否有可以挂钩的唤醒事件?如果没有,还有哪些其他选项不涉及依赖于用户交互的事件(我不想将整个页面绑定到单击事件只是为了重新启动后台任务).
lun*_*chs 29
当浏览器页面没有聚焦时,看起来在MobileSafari上暂停了Javascript执行.似乎setInterval()事件迟到了,只要浏览器聚焦就会触发它们.这意味着我们应该能够保持setInterval()运行,并假设浏览器丢失/重新获得焦点,如果setInterval函数花费的时间比平时长得多.
此代码在从浏览器选项卡切换回来后,从另一个应用程序切换回来后,以及从睡眠状态恢复后发出警报.如果将阈值设置为比setTimeout()稍长,则可以假设如果触发此超时将无法完成.
如果你想保持安全:你可以保存你的超时ID(由setTimeout返回)并将其设置为比你的超时更短的阈值,然后再次运行clearTimeout()和setTimeout().
<script type="text/javascript">
var lastCheck = 0;
function sleepCheck() {
var now = new Date().getTime();
var diff = now - lastCheck;
if (diff > 3000) {
alert('took ' + diff + 'ms');
}
lastCheck = now;
}
window.onload = function() {
lastCheck = new Date().getTime();
setInterval(sleepCheck, 1000);
}
</script>
Run Code Online (Sandbox Code Playgroud)
编辑:看起来这有时会在恢复时连续触发一次,所以你需要以某种方式处理它.(让我的安卓浏览器彻夜难眠后,它醒来了两个alert()s.我打赌Javascript在完全睡眠之前的任意时间恢复了.)
我在Android 2.2和最新的iOS上测试过 - 一旦你从睡眠状态恢复,它们都会发出警报.