이 답변 에서 @Alistair가 지적했습니다. 에서 때로는 사용자가 앱을 연 후 브라우저로 돌아갈 . 이 답변에 대한 의견자는 iOS 버전에 따라 사용되는 시간 값을 변경해야한다고 지적했습니다. 우리 팀이이 문제를 해결해야 할 때, 우리는 초기 타임 아웃 시간과 브라우저로 돌아 왔는지 여부를 알려주는 시간 값을 조정해야하며 모든 사용자와 장치에서 작동하지 않는 경우가 있음을 알게되었습니다.
브라우저로 돌아 왔는지 여부를 확인하기 위해 임의의 시차 임계 값을 사용하는 대신 "pagehide"및 "pageshow"이벤트를 감지하는 것이 좋습니다.
상황을 진단하는 데 도움이되도록 다음 웹 페이지를 개발했습니다. 주로 콘솔 로깅, 경고 또는 Web Inspector, jsfiddle.net 등의 기술을 사용하면이 작업 흐름에서 단점이 있었기 때문에 이벤트가 전개 될 때 HTML 진단이 추가됩니다. Javascript는 시간 임계 값을 사용하는 대신 "pagehide"및 "pageshow"이벤트 수를 계산하여 이벤트 발생 여부를 확인합니다. 그리고 가장 강력한 전략은 다른 사람들이보고 / 제안한 25, 50 또는 100이 아닌 1000의 초기 시간 제한을 사용하는 것이 었습니다.
이것은 로컬 서버에서 제공 될 수 있습니다 (예 : python -m SimpleHTTPServer
iOS Safari에서 볼 수 있음).
이를 사용하려면 "설치된 앱 열기"또는 "앱이 설치되지 않았습니다"링크를 누르십시오. 이러한 링크로 인해지도 앱 또는 앱 스토어가 각각 열립니다. 그런 다음 Safari로 돌아가서 이벤트의 순서와 타이밍을 볼 수 있습니다.
(참고 :이 기능은 Safari에서만 작동합니다. Chrome과 같은 다른 브라우저의 경우 페이지 숨기기 / 표시 등가 이벤트에 대한 핸들러를 설치해야합니다).
업데이트 : @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>