【发布时间】:2026-01-19 09:15:01
【问题描述】:
背景
我将全屏网络应用程序安装到 iOS 设备的主屏幕上,并在每次启动网络应用程序时运行一些 javascript。
Apple 在 iOS 13 中进行了更改,脚本仅在首次启动时运行。每次后续启动都会从上次停止的地方显示 Web 应用,而不会刷新到开始处(除非它已从应用切换器中删除)。
我相信这是 Web App 开发人员非常需要的功能,可以在用户切换到另一个应用程序并再次返回时停止网页刷新
为了让javascript在每次应用程序被带到前台或启动时运行一些代码,我想我可以简单地使用一些通知来查看focus、blur和visibilitychange或者查看document.activeElement , document.hasFocus() 或 document.hidden.
这就是问题所在......
iOS 13 还引入了我报告的一个错误,但看起来它不会很快得到修复,并且仍然存在于 13GM 和 13.1 测试版中。
错误
如果您有多个主屏幕网络应用程序,就好像它们都共享同一个网络容器。启动第二个 Web 应用程序会导致所有焦点类型通知在之前打开的 Web 应用程序上触发,就好像它们再次成为前面和中心一样。这意味着任何javascript 代码都将像已启动一样运行,即使它没有启动。
问题
我正在尝试找到解决此错误的方法,并在 Web 应用程序在前端和中心启动时收到通知。使用 onLoad 类型代码只会在 Web 应用程序留在应用程序切换器中时运行一次。在启动其他 Web 应用程序时,观看 focus 类型的事件将不必要地触发。有没有我可以尝试调用的其他事件或方法,或者我可以尝试实现的任何技巧?
编辑
根据要求,这里是示例 html:
<html>
<head>
<title>visibilitychange</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
</head>
<body id="body">
<h1>visibilitychange</h1>
<h3>Save this web clip to your home screen, then when you open it it'll automatically list the times the visibilitychange notification is called and the state</h3>
<br /><br />
<p>Initial page visibility was <b id="status">unknown</b>.</p>
<div id="target"></div>
<script type="text/javascript">
document.getElementById('status').innerHTML = document.hidden ? 'hidden' : 'visible';
var target = document.getElementById('target');
function logToScreen(text) {
var timeBadge = new Date().toTimeString().split(' ')[0];
var newState = document.createElement('p');
newState.innerHTML = '<span class="badge">' + timeBadge + '</span> ' + text + '</b>';
target.appendChild(newState);
}
function isPageHidden() {
console.log('isPageHidden() ==' + document.visibilityState);
logToScreen('isPageHidden() ==' + document.visibilityState);
return document.visibilityState == 'hidden'; // document.hidden;
}
document.addEventListener("visibilitychange", function(event)
{
console.log('visibilitychange event listener');
logToScreen('visibilitychange event listener');
if(!isPageHidden()) {
console.log('page opened');
logToScreen('page opened');
}
}, false);
</script>
</body>
</html>
【问题讨论】:
标签: javascript ios dom mobile-safari ios13