Ответ 1
Я согласен с тем, что действительно должен быть какой-то сигнал, с помощью которого вы можете узнать, когда приложение ложится спать и когда оно просыпается, но вы должны быть в состоянии выяснить, когда Safari просыпается косвенно.
Когда веб-просмотр переходит в фоновый режим, Safari помещает все в него, чтобы спать. Он приостанавливает любое видео, отменяет сетевой запрос, останавливает обновление пользовательского интерфейса и приостанавливает все операции setInterval/setTimeout. Сам JS никогда не будет знать (насколько я могу судить), как это произошло, но может сказать, что это произошло. Самый простой способ использовать это - создать регулярно вызываемый метод и проверить, было ли это неожиданно длительное время со времени последнего обновления. Если вы ожидаете, что что-то обновится каждые 10 секунд, и прошло пять минут, вы можете быть уверены, что устройство проснулось. Вот быстрый пример, который я придумал:
var intTime = new Date().getTime();
var getTime = function() {
var intNow = new Date().getTime();
if (intNow - intTime > 1000) {
console.log("I JUST WOKE UP")
}
intTime = intNow;
setTimeout(getTime,500);
};
getTime();
Это обнаружит, когда пользователь вернется с другой вкладки, отклонил консоль разработчика или вернул Safari из фона. Я установил интервал в полсекунды; вы можете установить его на все, что вам нужно, хотя я думаю, что очень низкие значения будут иметь проблемы concurrency и, вероятно, будут без необходимости перезаряжать батарею на устройстве.