如何在iOS应用中去使用HTML和JavaScript的背景检测

问题描述 投票:0回答:2

我需要知道什么时候我的GWT Web应用程序转移到iPad上的背景。该应用程序是不是原生iOS应用,而是有一个“包装”围绕它允许它作为一个应用程序运行。该包装是用斯威夫特和使用的UIWebView。

应用程序需要时,以触发一些逻辑,如果用户进入该应用的之外,那么应用应当在返回到该应用程序(即,获得焦点)显示警告画面,按主页按钮就知道了。这个逻辑应该是真实的,无论应用程序如何失去焦点,除非他们明确地退出程序。我无法解释为什么这些功能是必要的,因为安全的目的,但我只想说,这不是一个普通观众类型的应用;有在其下使用此应用的特定场景。

我已经使用document.hasFocus()试过了,但它总是返回true,尽管这同样的逻辑适用于Chromebook,Windows机器,和MacBook。

我加visibilityChange监听器,但visibilityState始终可见。我还添加事件侦听pageshow和pagehide。调试控制台语句打印出来的pageshow事件监听,但从来没有为pagehide事件监听。最后,我添加了卸载事件的事件监听器,但我从来没有看到我的控制台声明打印出它。

基于我读过各种搜索和文章,似乎移动Safari浏览器忽略大多数,如果不是所有的听众,而且似乎是唯一的选择我都不会用,我宁愿避免计时器都试过了。另外,我需要一个HTML / JavaScript的解决方案,我只能修改我的应用程序和cannnot修改“包装”的应用程序。我使用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);
}
javascript ios gwt background blur
2个回答
2
投票

有些人就在你的旅程一样,它可能是有趣的解剖qazxsw POI。

或者你可以使用their code来包装你的web应用到本机应用程序,这会给你的方法,通过JavaScript调用访问本地信息。


2
投票

它的短的,我不认为这是可能使用JavaScript时,home键使用混合应用时被推告诉。 UI事件,如页面的知名度,卸载等不会被触发。至于原因,我不能指定,我不能使用定时器。貌似唯一的选择是编辑SWIFT代码为iPad包装时,应用程序进入后台信号。

© www.soinside.com 2019 - 2024. All rights reserved.