Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: AmyWОтветов: 2

Мне нужно знать, когда мое веб-приложение 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);
}
  • Остановка действия "возврат домой" кажется достаточно раздражающей, чтобы удалить приложение, возможно, улучшите свое приложение, чтобы состояние не могло быть свободным в любом случае, и поэтому, если пользователь возвращается, всегда продолжает в той же точке? Ignacio Baca 10.01.2019
  • Приложение похоже на приложение для безопасного тестирования, такое как Safe Exam Browser. Он используется только в определенных сценариях и, как таковой, включает обязательные причины, по которым пользователь не может выйти за пределы приложения. AmyW 11.01.2019

iosjavascriptblurbackgroundgwt

Ответы

Ответ 1 · рейтинг 2 · Luigi Polvani

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

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

Ответ 2 · рейтинг 2 · AmyW

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы