Почему событие возобновления Cordova не срабатывает в режиме блокировки питания / спящем режиме в iOS с использованием sencha
В моем приложении, если пользователь заблокировал мобильный телефон. Мне нужно перейти на экран входа в систему. Я реализовал событие возобновления, чтобы перейти на экран входа в систему, если пользователь разблокирует устройство. Кто-нибудь может сказать, почему событие возобновления Cordova не срабатывает в режиме блокировки питания / спящем режиме в IOS
Есть ли какое-либо другое событие, которое мне нужно использовать в режиме блокировки?
PS Он работает в минимизации приложения и максимизации приложения
2 ответа
Хотя в IOS событие возобновления вызывается при сворачивании или развертывании приложения нажатием кнопки "домой", создается впечатление, что событие возобновления не срабатывает при "закрытии" или "запуске" приложения нажатием кнопки питания, по крайней мере, в IOS.
Возможным JS-решением может быть проверка на бездействие. Скажем, если приложение не получало каких-либо событий, инициированных пользователем в течение некоторого времени (30 секунд, и если с тех пор не было запущено никакого реального события паузы), например, click/touch-events, то можно предположить, что приложение все еще может выполнить некоторый код (так что он все еще на переднем плане) и "приостановлен":
// threshold for inactivity state
var idleTimeout = 30000;
// variable that holds the time in seconds, which indicates how long the app has not received certain events
var timeInSecondsPassed = 0;
// interval instance
var intervalInstance = null;
// variable to handle the transition from "pause" to "resume" state
var inPauseState = false;
function startPauseListener() {
timeInSecondsPassed = 0;
var resetPassedTime = function(){
timeInSecondsPassed = 0;
// has the app reached the "pause" state and
// currently receiving certain events -> the "resume" state is reached
if(inPauseState){
inPauseState = false;
// the "resume" state is reached here
// so the same code might be executed here as it is in the resume-listener
}
};
document.ontouchstart = resetPassedTime;
document.onclick = resetPassedTime;
document.onscroll = resetPassedTime;
document.onkeypress = resetPassedTime;
intervalInstance = setInterval(checkPauseState,1000);
}
function clearPauseListener() {
clearInterval(intervalInstance);
timeInSecondsPassed = 0;
}
function checkPauseState() {
timeInSecondsPassed += 1000;
if (timeInSecondsPassed >= idleTimeout) {
inPauseState = true;
timeInSecondsPassed = 0;
// run further code here to handle "pause" state
// at this point it is assumed as soon as the app receives click/touch-events again a "resume" state is reached.
}
}
function onDeviceReady() {
// handle android devices so that the interval is stopped when a real pause event is fired and started when a real resume event is fired
document.addEventListener("resume", function(){
startPauseListener();
// your actual code to handle real resume events
}, false);
document.addEventListener("pause", function(){
clearPauseListener();
}, false);
}
Следует отметить, что когда приложение действительно приостановлено, и запускается событие паузы, приведенный выше код запускается не в IOS, а в Android, поэтому вам, возможно, придется по-разному обрабатывать этот сценарий в Android, выполняя предварительные действия как резюме, так и паузы. -Listener для в Android, когда приложение сворачивается с помощью кнопки домой, интервал все равно будет выполняться и потребляет процессор в фоновом режиме.
И, пожалуйста, обратите внимание, что это всего лишь концептуальный код, который не тестируется ни на одном устройстве!!!
Надеюсь это поможет.
Там есть специфичное для iOS событие под названием active
это "обнаруживает, когда пользователи отключают кнопку блокировки, чтобы разблокировать устройство с приложением, работающим на переднем плане".
Проверьте документацию внизу resume
страница документа:
https://cordova.apache.org/docs/en/5.1.1/cordova/events/events.resume.html