@airairair ชี้ให้เห็นในคำตอบนี้ว่าบางครั้งผู้ใช้จะกลับสู่เบราว์เซอร์หลังจากเปิดแอป ผู้แสดงความเห็นต่อคำตอบนั้นระบุว่าต้องใช้ค่าเวลาที่ใช้ในการเปลี่ยนทั้งนี้ขึ้นอยู่กับเวอร์ชั่นของ iOS เมื่อทีมของเราต้องจัดการกับเรื่องนี้เราพบว่าเวลาค่าสำหรับการหมดเวลาเริ่มต้นและบอกว่าเราได้กลับไปที่เบราว์เซอร์จะต้องมีการปรับและมักจะไม่ทำงานสำหรับผู้ใช้และอุปกรณ์ทั้งหมด
แทนที่จะใช้ขีดจำกัดความแตกต่างของเวลาโดยพลการเพื่อตรวจสอบว่าเราได้กลับไปที่เบราว์เซอร์หรือไม่เราควรตรวจจับเหตุการณ์ "pagehide" และ "pageshow"
ฉันพัฒนาเว็บเพจต่อไปนี้เพื่อช่วยวินิจฉัยสิ่งที่เกิดขึ้น มันเพิ่มการวินิจฉัย HTML เป็นเหตุการณ์ที่เกิดขึ้นส่วนใหญ่เป็นเพราะการใช้เทคนิคเช่นการเข้าสู่ระบบคอนโซลการแจ้งเตือนหรือตรวจสอบเว็บ jsfiddle.net ฯลฯ ทั้งหมดมีข้อบกพร่องในกระบวนการทำงานนี้ แทนที่จะใช้การ จำกัด เวลา Javascript จะนับจำนวนเหตุการณ์ "pagehide" และ "pageshow" เพื่อดูว่าเกิดขึ้นหรือไม่ และฉันพบว่ากลยุทธ์ที่แข็งแกร่งที่สุดคือการใช้การหมดเวลาเริ่มต้นที่ 1,000 (แทนที่จะเป็น 25, 50, หรือ 100 รายงาน / แนะนำโดยผู้อื่น)
สามารถให้บริการบนเซิร์ฟเวอร์ภายในเช่นpython -m SimpleHTTPServer
และดูบน iOS Safari
หากต้องการเล่นให้กดลิงก์ "เปิดแอปที่ติดตั้ง" หรือ "แอปที่ไม่ได้ติดตั้งแอป" ลิงก์เหล่านี้ควรทำให้แอป Maps หรือ App Store เปิดตามลำดับ จากนั้นคุณสามารถกลับไปที่ Safari เพื่อดูลำดับและเวลาของเหตุการณ์
(หมายเหตุ: สิ่งนี้จะใช้งานได้กับ Safari เท่านั้นสำหรับเบราว์เซอร์อื่น (เช่น Chrome) คุณจะต้องติดตั้งตัวจัดการสำหรับการซ่อน / แสดงเหตุการณ์เทียบเท่า)
อัปเดต:เนื่องจาก @Mikko ได้ชี้ให้เห็นในความคิดเห็นเหตุการณ์ที่แสดงหน้าเว็บ / หน้าเว็บที่เราใช้จะไม่ได้รับการสนับสนุนใน 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>