A @Alistair apontou nesta resposta que, às vezes, os usuários retornam ao navegador após abrir o aplicativo. Um comentarista para essa resposta indicou que os valores dos tempos usados precisavam ser alterados dependendo da versão do iOS. Quando nossa equipe teve que lidar com isso, descobrimos que os valores de tempo para o tempo limite inicial e informando se havíamos retornado ao navegador tinham que ser ajustados e, geralmente, não funcionavam para todos os usuários e dispositivos.
Em vez de usar um limite arbitrário de diferença de horário para determinar se retornamos ao navegador, fazia sentido detectar os eventos "ocultar página" e "exibição de página".
Desenvolvi a seguinte página da Web para ajudar a diagnosticar o que estava acontecendo. Ele adiciona diagnósticos HTML à medida que os eventos se desenrolam, principalmente porque o uso de técnicas como log do console, alertas ou Inspetor da Web, jsfiddle.net etc., todos tiveram suas desvantagens nesse fluxo de trabalho. Em vez de usar um limite de tempo, o Javascript conta o número de eventos "ocultar página" e "exibição de página" para verificar se eles ocorreram. E descobri que a estratégia mais robusta era usar um tempo limite inicial de 1000 (em vez dos 25, 50 ou 100 relatados / sugeridos por outros).
Isso pode ser servido em um servidor local, por exemplo, python -m SimpleHTTPServer
e exibido no iOS Safari.
Para jogar, pressione os links "Abrir um aplicativo instalado" ou "Aplicativo não instalado". Esses links devem fazer com que o aplicativo do Google Maps ou a App Store seja aberto, respectivamente. Você pode retornar ao Safari para ver a sequência e o horário dos eventos.
(Observação: isso funcionará apenas para o Safari. Para outros navegadores (como o Chrome), você precisará instalar manipuladores para os eventos ocultar páginas / mostrar equivalentes).
Atualização: Como o @Mikko apontou nos comentários, os eventos pageshow / pagehide que estamos usando aparentemente não são mais suportados no 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>