@Alistair a souligné dans cette réponse que parfois les utilisateurs reviennent au navigateur après l'ouverture de l'application. Un commentateur à cette réponse a indiqué que les valeurs de temps utilisées devaient être modifiées en fonction de la version d'iOS. Lorsque notre équipe a dû faire face à cela, nous avons constaté que les valeurs de temps pour le délai d'expiration initial et indiquer si nous étions retournés au navigateur devaient être réglées, et souvent ne fonctionnaient pas pour tous les utilisateurs et appareils.
Plutôt que d'utiliser un seuil de différence de temps arbitraire pour déterminer si nous étions retournés au navigateur, il était logique de détecter les événements "pagehide" et "pageshow".
J'ai développé la page Web suivante pour aider à diagnostiquer ce qui se passait. Il ajoute des diagnostics HTML au fur et à mesure que les événements se déroulent, principalement parce que l'utilisation de techniques telles que la journalisation de la console, les alertes ou l'inspecteur Web, jsfiddle.net, etc. avaient tous leurs inconvénients dans ce flux de travail. Plutôt que d'utiliser un seuil de temps, le Javascript compte le nombre d'événements "pagehide" et "pageshow" pour voir s'ils se sont produits. Et j'ai trouvé que la stratégie la plus robuste était d'utiliser un délai initial de 1000 (plutôt que les 25, 50 ou 100 rapportés / suggérés par d'autres).
Cela peut être servi sur un serveur local, par exemple python -m SimpleHTTPServer
et affiché sur iOS Safari.
Pour jouer avec, appuyez sur les liens «Ouvrir une application installée» ou «Application non installée». Ces liens doivent provoquer respectivement l'ouverture de l'application Maps ou de l'App Store. Vous pouvez ensuite retourner dans Safari pour voir la séquence et le calendrier des événements.
(Remarque: cela ne fonctionnera que pour Safari. Pour les autres navigateurs (comme Chrome), vous devrez installer des gestionnaires pour les événements pagehide / show-equivalent).
Mise à jour: comme @Mikko l'a souligné dans les commentaires, les événements pageshow / pagehide que nous utilisons ne sont apparemment plus pris en charge dans 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>