@Alistairはこの回答で、ユーザーがアプリを開いた後にブラウザーに戻ることがあると指摘しました。その回答へのコメント者は、使用された時間の値はiOSのバージョンに応じて変更する必要があることを示しました。私たちのチームがこれに対処する必要があったとき、初期タイムアウトの時間値と、ブラウザーに戻ったかどうかを示す値を調整する必要があり、多くの場合、すべてのユーザーとデバイスで機能しないことがわかりました。
ブラウザに戻ったかどうかを判断するために任意の時間差しきい値を使用するのではなく、「pagehide」および「pageshow」イベントを検出することは理にかなっています。
何が起こっているのかを診断するために、次のWebページを作成しました。これは、主にコンソールロギング、アラート、またはWebインスペクター、jsfiddle.netなどの手法を使用すると、このワークフローに欠点があったため、イベントが展開するときにHTML診断を追加します。時間のしきい値を使用する代わりに、JavaScriptは「pagehide」および「pageshow」イベントの数をカウントして、それらが発生したかどうかを確認します。そして、最も強力な戦略は、1000の初期タイムアウトを使用することであることがわかりました(25、50、または100が他のユーザーによって報告/提案されたものではありません)。
これはローカルサーバーで提供でき、python -m SimpleHTTPServer
iOS Safariなどで表示できます。
それを試すには、「インストールされているアプリを開く」または「アプリがインストールされていません」リンクを押します。これらのリンクにより、マップアプリまたはApp Storeがそれぞれ開きます。その後、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>