Мне нужно знать, когда мое веб-приложение 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);
}