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