我需要知道什么时候我的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);
}
有些人就在你的旅程一样,它可能是有趣的解剖qazxsw POI。
或者你可以使用their code来包装你的web应用到本机应用程序,这会给你的方法,通过JavaScript调用访问本地信息。
它的短的,我不认为这是可能使用JavaScript时,home键使用混合应用时被推告诉。 UI事件,如页面的知名度,卸载等不会被触发。至于原因,我不能指定,我不能使用定时器。貌似唯一的选择是编辑SWIFT代码为iPad包装时,应用程序进入后台信号。