@Alistair ha sottolineato in questa risposta che a volte gli utenti tornano al browser dopo aver aperto l'app. Un commentatore di quella risposta ha indicato che i valori dei tempi utilizzati dovevano essere modificati a seconda della versione di iOS. Quando il nostro team ha dovuto occuparsene, abbiamo scoperto che i valori di tempo per il timeout iniziale e che dicevano se fossimo tornati al browser dovevano essere sintonizzati e spesso non funzionavano per tutti gli utenti e i dispositivi.
Invece di utilizzare una soglia di differenza temporale arbitraria per determinare se fossimo tornati al browser, aveva senso rilevare gli eventi "pagehide" e "pageshow".
Ho sviluppato la seguente pagina Web per aiutare a diagnosticare cosa stava succedendo. Aggiunge la diagnostica HTML man mano che gli eventi si svolgono, principalmente perché l'utilizzo di tecniche come la registrazione della console, gli avvisi o Web Inspector, jsfiddle.net ecc. Hanno tutti i loro svantaggi in questo flusso di lavoro. Anziché utilizzare una soglia temporale, Javascript conta il numero di eventi "pagehide" e "pageshow" per vedere se si sono verificati. E ho scoperto che la strategia più efficace era quella di utilizzare un timeout iniziale di 1000 (anziché i 25, 50 o 100 riportati / suggeriti da altri).
Questo può essere servito su un server locale, ad es. python -m SimpleHTTPServer
E visualizzato su iOS Safari.
Per giocarci, premi il link "Apri un'app installata" o "App non installata". Questi collegamenti dovrebbero far aprire rispettivamente l'app Maps o l'App Store. È quindi possibile tornare a Safari per vedere la sequenza e i tempi degli eventi.
(Nota: questo funzionerà solo per Safari. Per altri browser (come Chrome) dovresti installare gestori per gli eventi pagehide / show-equivalenti).
Aggiornamento: Come ha sottolineato @Mikko nei commenti, gli eventi pagehow / pagehide che stiamo utilizzando non sembrano più supportati in 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>