@Alistair 在这个答案中指出,有时用户会在打开应用程序后返回浏览器。该答案的评论者表示,必须根据 iOS 版本更改使用的时间值。
当我们的团队不得不处理这个问题时,我们发现初始超时的时间值以及告诉我们是否已经返回浏览器必须进行调整,并且通常不适用于所有用户和设备。
与其使用任意时间差阈值来确定我们是否返回浏览器,不如检测“pagehide”和“pageshow”事件。
我开发了以下网页来帮助诊断发生了什么。它在事件展开时添加了 HTML 诊断,主要是因为使用控制台日志记录、警报或 Web Inspector、jsfiddle.net 等技术在此工作流程中都有其缺点。JavaScript 不使用时间阈值,而是计算“pagehide”和“pageshow”事件的数量以查看它们是否已发生。我发现最稳健的策略是使用 1000 的初始超时(而不是其他人报告和建议的 25、50 或 100)。
这可以在本地服务器上提供,例如python -m SimpleHTTPServer
在 iOS Safari 上查看。
要使用它,请按“打开已安装的应用程序”或“未安装应用程序”链接。这些链接应分别导致地图应用程序或应用程序商店打开。然后,您可以返回 Safari 查看事件的顺序和时间。
(注意:这仅适用于 Safari。对于其他浏览器(如 Chrome),您必须为 pagehide/show-equivalent 事件安装处理程序)。
更新:正如@Mikko 在评论中指出的那样,我们正在使用的 pageshow/pagehide 事件显然在 iOS8 中不再支持。
<html>
<head>
</head>
<body>
<a href="maps://" onclick="clickHandler()">Open an installed app</a>
<br/><br/>
<a href="xmapsx://" onclick="clickHandler()">App not installed</a>
<br/>
<script>
var hideShowCount = 0 ;
window.addEventListener("pagehide", function() {
hideShowCount++;
showEventTime('pagehide');
});
window.addEventListener("pageshow", function() {
hideShowCount++;
showEventTime('pageshow');
});
function clickHandler(){
var hideShowCountAtClick = hideShowCount;
showEventTime('click');
setTimeout(function () {
showEventTime('timeout function ' + (hideShowCount-hideShowCountAtClick) + ' hide/show events');
if (hideShowCount == hideShowCountAtClick){
// app is not installed, go to App Store
window.location = 'http://itunes.apple.com/app';
}
}, 1000);
}
function currentTime()
{
return Date.now()/1000;
}
function showEventTime(event){
var time = currentTime() ;
document.body.appendChild(document.createElement('br'));
document.body.appendChild(document.createTextNode(time + ' ' + event));
}
</script>
</body>
</html>