Estoy de acuerdo en que realmente debería haber alguna señal que pueda engancharse para saber cuándo se va a dormir una aplicación y cuándo se despierta, pero debería ser capaz de averiguar cuándo se despierta Safari indirectamente.
Cuando la vista web pasa a segundo plano, Safari pone todo en ella para dormir. Pausa cualquier video, aplaza la solicitud de red, detiene la actualización de la interfaz de usuario y pausa todas las operaciones setInterval/setTimeout. JS nunca se dará cuenta (por lo que puedo decir) de cómo sucedieron estas cosas, pero puede decir que ha sucedido. La forma más sencilla de usar esto es compilar un método invocado con regularidad y verificar si ha pasado mucho tiempo desde la última actualización. Si espera que algo se actualice cada 10 segundos y han pasado cinco minutos, puede estar bastante seguro de que el dispositivo se ha activado. Aquí está un ejemplo rápido se me ocurrió:
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();
Esto permitirá detectar cuando el usuario ha de regresar de otra ficha, ha desestimado la consola de desarrollador o traído de nuevo Safari en el fondo. He establecido el intervalo en medio segundo; puedes configurarlo en cualquier cosa que necesites, aunque creo que los valores muy bajos tendrán problemas de concurrencia y probablemente quemarán la batería del dispositivo innecesariamente.
Gracias Andrew. Ya tengo temporizadores "inactivos" en mi aplicación web, que es un correo web con un cliente de mensajería instantánea, entre otras características interesantes. No había pensado utilizar uno de esos temporizadores para detectar si el iPad ha estado inactivo durante un período de tiempo. Supongo que tendrá que hacer por ahora. ¡Aclamaciones! – rcarrier
Muy inteligente, gracias! – Codebeat
Creo que puedes disminuir el intervalo para verificar 1 o 2 segundos porque la mayoría de las acciones tardan al menos 1 o 2 segundos en hacerlo si no estás paranoico ;-). – Codebeat