Как определить, когда приложение iOS переходит в фоновый режим, используя HTML и JavaScript

Мне нужно знать, когда мое веб-приложение GWT переходит в фоновый режим на iPad. Приложение не является собственным приложением для iOS, а имеет «оболочку», позволяющую ему работать как приложение. Обертка написана на Swift и использует UIWebView.

Приложение должно знать, когда нажата кнопка «Домой», чтобы вызвать некоторую логику, согласно которой, если пользователь выходит за пределы приложения, приложение должно отображать экран предупреждения при возвращении в приложение (т. е. получает фокус). Эта логика должна быть верной независимо от того, как приложение теряет фокус, если только они не выходят из приложения явным образом. Я не могу объяснить, почему эта функциональность необходима из соображений безопасности, но достаточно сказать, что это приложение не для широкой аудитории; существуют определенные сценарии, в которых используется это приложение.

Я пробовал использовать document.hasFocus(), но он всегда возвращает true, хотя эта же логика работает на хромбуках, компьютерах с Windows и макбуках.

Я добавил прослушиватель видимостиChange, но visibilityState всегда виден. Я также добавил прослушиватели событий для pagehow и pagehide. Оператор консоли отладки распечатывается для прослушивателя событий pagehow, но не для прослушивателя событий pagehide. Наконец, я добавил прослушиватель событий для события выгрузки, но я никогда не видел, чтобы мой консольный оператор распечатывался для него.

Основываясь на различных поисковых запросах и статьях, которые я прочитал, кажется, что мобильный Safari игнорирует большинство, если не всех, этих слушателей, и единственный вариант, который я не пробовал, — это использование таймеров, которых я бы предпочел избежать. Кроме того, мне нужно решение HTML/Javascript, так как я могу только изменить свое приложение и не могу изменить приложение «оболочки». Я использую iPad Pro с iOS 11.4.

Вот только одна из многих статей, на которые я ссылался: from-background"> ​​Как определить в веб-приложении iOS при переключении обратно в Safari из фона?

Соответствующий код из приложения приведен ниже. Любые мысли или предложения приветствуются!

/*************************** page visibility ***************************/
var hidden, visibilityChange;
    if (typeof document.hidden !== "undefined") { // Opera 12.10 and Firefox 18 and later support
    hidden = "hidden";
    visibilityChange = "visibilitychange";
} else if (typeof document.msHidden !== "undefined") {
    hidden = "msHidden";
    visibilityChange = "msvisibilitychange";
} else if (typeof document.webkitHidden !== "undefined") {
    hidden = "webkitHidden";
    visibilityChange = "webkitvisibilitychange";
}

console.log("debug - common.js - customBlur - visibilityChange : " + visibilityChange + " | hidden: " + hidden);


if (typeof document.addEventListener === "undefined" || hidden === undefined) {
    console.log("This demo requires a browser, such as Google Chrome or Firefox, that supports the Page Visibility API.");
} else {
// Handle page visibility change
    document.addEventListener(visibilityChange, handleVisibilityChange, false);
}

var forceBlur = false;
function handleVisibilityChange() {
if (document.visibilityState == 'hidden') {
    console.log("debug - common.js - handleVisibilityChange - calling delayBlur");
    forceBlur = true;
} else console.log("debug - common.js - handleVisibilityChange - document not hidden");
}

/*************************** pageshow and pagehide ***************************/
var forcePhBlur = false;
window.addEventListener("pageshow", function(evt){
    console.log("debug - common.js - pageshow - showing the page");
}, false);
window.addEventListener("pagehide", function(evt){
    console.log("debug - common.js - pagehide - hiding the page");
    forcePhBlur = true;
}, false);

/*************************** unload ***************************/
var forceUlBlur = false;
window.addEventListener("unload", function(evt){
    console.log("debug - common.js - unload - unloading the page");
    window.onblur = true;
    forceUlBlur = true;
}, false);

/*************************** custom blur logic ***************************/
function delayCheck() {
    console.log("debug - common.js - delayCheck - document.hasFocus(): " +             
    document.hasFocus());
    console.log("debug - common.js - delayCheck - document.hidden: " +        document.hidden);
    if (!document.hasFocus() || document.hidden || forceBlur) {
        delayBlur();  //implemented in the java code
    }
}

var delayVar;

function customBlur() {
console.log("debug - common.js - customBlur - document.hasFocus(): " + document.hasFocus());
console.log("debug - common.js - customBlur - document.hidden: " + document.hidden);
console.log("debug - common.js - customBlur - Document.visibilityState : " + document.visibilityState);
console.log("debug - common.js - customBlur - forceBlur : " + forceBlur);
console.log("debug - common.js - customBlur - forcePhBlur : " + forcePhBlur);
console.log("debug - common.js - customBlur - forceUlBlur : " + forceUlBlur);

if (!document.hasFocus() || document.hidden || forceBlur) {
    console.log("debug - common.js - customBlur - calling delayCheck to blur");
    delayVar = window.setTimeout(delayCheck, 200);
}

person AmyW    schedule 09.01.2019    source источник
comment
Остановка действия «возврат домой» кажется достаточно раздражающей, чтобы удалить приложение, возможно, улучшите свое приложение, чтобы состояние не могло быть свободным в любом случае, и поэтому, если пользователь возвращается, всегда продолжает в той же точке?   -  person Ignacio Baca    schedule 10.01.2019
comment
Приложение похоже на приложение для безопасного тестирования, такое как Safe Exam Browser. Он используется только в определенных сценариях и, как таковой, включает обязательные причины, по которым пользователь не может выйти за пределы приложения.   -  person AmyW    schedule 11.01.2019


Ответы (2)


Некоторые люди прошли тот же путь, что и вы, и было бы интересно проанализировать их код.

Или вы можете использовать Cordova, чтобы упаковать свое веб-приложение в родное приложение, это даст вам возможность доступа к родному информация через вызовы javascript.

person Luigi Polvani    schedule 17.01.2019
comment
Спасибо за ваш комментарий! Раньше я просматривал эту библиотеку, но обнаружил, что она не работает для того, что мне нужно. :) Кордова выглядит интересно. Я слышал больше об этом в последнее время. - person AmyW; 11.02.2019
comment
Если вы заинтересованы в том, чтобы двигаться в этом направлении, вы также можете взглянуть на phonegap, он очень похож, но кажется лучше поддерживается. phonegap.com - person Luigi Polvani; 11.02.2019

Суть в том, что я не думаю, что с помощью javascript можно определить, когда кнопка «Домой» нажата при использовании гибридного приложения. События пользовательского интерфейса, такие как видимость страницы, выгрузка и т. д., не запускаются. По причинам, которые я не могу указать, я не могу использовать таймеры. Похоже, единственный вариант — отредактировать быстрый код для оболочки iPad, чтобы он сигнализировал, когда приложение переходит в фоновый режим.

person AmyW    schedule 11.02.2019