如何使用HTML和JavaScript检测iOS应用何时进入后台

时间:2019-01-09 19:19:59

标签: javascript ios gwt background blur

我需要知道GWT Web应用程序何时在iPad上进入后台。该应用程序不是本机iOS应用程序,而是周围有一个“包装器”,允许它作为应用程序运行。包装器使用Swift编写,并使用UIWebView。

应用程序需要知道何时按下主页按钮才能触发一些逻辑,即如果用户不在应用程序之外,则该应用程序应在返回到应用程序时显示警告屏幕(即获得焦点)。无论应用程序如何失去焦点,这种逻辑都应该是正确的,除非它们明确退出应用程序。由于安全性原因,我无法解释为什么需要该功能,但是可以说这不是一般的受众类型的应用程序;在某些情况下会使用此应用。

我尝试使用document.hasFocus(),但即使在chromebook,Windows计算机和macbook上也能使用相同的逻辑,它始终会返回true。

我添加了visibleChanged侦听器,但是visibleState始终可见。我还为pageshow和pagehide添加了事件侦听器。调试控制台语句为pageshow事件侦听器打印,但从不为pagehide事件侦听器打印。最后,我为unload事件添加了一个事件侦听器,但是我从来没有看到为它打印出控制台语句。

根据我读过的各种搜索和文章,似乎移动Safari会忽略大多数(如果不是全部)这些侦听器,而我似乎没有尝试过的唯一选择是使用计时器,而我更希望避免使用该计时器。另外,我需要一个HTML / Javascript解决方案,因为我只能修改我的应用程序,而不能修改“包装”应用程序。我正在将iPad Pro与iOS 11.4配合使用。

这只是我引用的众多文章之一: How to detect in iOS webapp when switching back to Safari from background?

应用程序中的相关代码如下。任何想法或建议都将不胜感激!

/*************************** 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);
}

2 个答案:

答案 0 :(得分:0)

有些人也喜欢你,所以剖析their code可能很有趣。

或者您可以使用Cordova将Web应用程序打包到本机应用程序中,这将为您提供通过javascript调用访问本机信息的方法。

答案 1 :(得分:0)

简短的是,我认为使用混合应用程序时按下主屏幕按钮时无法告诉使用javascript。不会触发页面可见性,卸载等UI事件。由于无法指定的原因,我无法使用计时器。看起来唯一的选择是编辑iPad包装程序的快速代码,以在应用程序进入后台时发出信号。