移动端平均停留时长只有 38 秒,桌面端 2 分 10 秒,同一批内容差距四倍,跳出前的最后一段停留经常是 0。日志里能对上时间点,这种反而好排。
移动端用户习惯直接切后台再划掉,页面没有 beforeunload,只有 visibilitychange 能捕获。上报只挂在 pagehide 上,很多机型根本不触发。这一点先确认清楚,后面就不用反复试。
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'hidden') {
navigator.sendBeacon('/stat/leave', data);
}
});
这次卡住的地方就在「visibilitychange 上报」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
处理上按这个顺序:监听 visibilitychange,状态变成 hidden 时立刻上报;用 sendBeacon 发,别用同步请求;记录可见时长而不是 pagehide 时间差;用真机切后台再关闭,确认事件到达。
结果对不对很好判断,移动端停留时长回到 1 分 40 秒左右,离开事件的上报率超过 90%。
