Как я могу запретить iPhone (включая iOS 7) переспать в HTML или JS?

Я пытаюсь написать код для сохранения телефона и не спать на веб-странице.

В моем поиске я нашел этот пост: Предотвратить переход на безопасное сафари iOS в режиме ожидания/автоматическое блокирование/сон?

Но петля аудиофайла, похоже, больше не поддерживает MobileSafari и препятствует блокировке телефона. Во время принудительного обновления страницы каждые 30 секунд мне нужно, чтобы исходная страница оставалась открытой.

Последнее интерактивное музыкальное видео Google, Just A Reflektor, похоже, предотвращает блокировку с мобильных устройств, а их JS здесь ссылается на функцию preventSleepIos.

Что я могу сделать, чтобы IOS не заснул?

Спасибо!

Ответы

Ответ 1

Если вы запустите миниатюрный script через http://jsbeautifier.org/, вы получите представление о том, как работает этот хак.

Идея взлома заключается в следующем: если в сафари запрашивается новая страница, ios-устройство будет reset таймаутом ожидания.

Зная, что мы можем установить интервал для запроса новой страницы каждые 30 секунд или около того:

iosSleepPreventInterval = setInterval(function () {
    window.location.href = "/new/page";
}, 30000);

Теперь нам нужно остановить запрос, чтобы страница не перенаправлялась:

iosSleepPreventInterval = setInterval(function () {
    window.location.href = "/new/page";
    window.setTimeout(function () {
        window.stop()
    }, 0);
}, 30000);

Теперь на страницу будет отображаться запрос каждые 30 секунд, поэтому устройство ios не будет усыновлено, и запрос будет отменен, поэтому вы не удаляетесь от страницы.

Примечание. Я использую этот код для "/new/page":

sleep(10);exit;

Этот хак был протестирован на iOS 6 и iOS 7. Вы можете проверить его самостоятельно на jsBin.

Примечание2: Android использует разные хаки, чтобы предотвратить спящий режим.

Ответ 2

Вам нужно будет сделать запрос на сервер, что, к сожалению, невозможно с строго HTML или JS. Оба эти языка - это интерфейсные скриптовые языки, а это означает, что после загрузки DOM манипуляция с DOM с помощью ванильного HTML и CSS будет влиять только на интерфейс.

Насколько я знаю, существует всего несколько способов предотвратить переключение в систему iOS, одним из которых является создание игрушечного приложения, которое снова и снова запускает службу в iOS, а другое - устанавливать application.idleTimerDisabled = YES, но оба этих решения выходят за рамки технологий веб-интерфейса.

Если вы хотите, чтобы сеанс не терялся через веб-приложение, вы могли бы написать дешевую функцию на стороне сервера, чтобы время ping время сервера было так часто, чтобы сохранить сеанс пользователя.

Пример использования javascript и PHP:

function cd(){
   var alerttime = "<?php echo date('h:i:s', (strtotime($_SESSION['ordertime']) + (1 * 60)));  ?>"
   var extratime = "<?php echo date('h:i:s', (strtotime($_SESSION['ordertime']) + (2 * 60)));  ?>";
    redo();
}    

function getTime(){
    currenttime = "<?php echo date('h:i:s', time()); ?>";

   var cd = setTimeout("getTime()",1000);
    }