点“打开 App”执行 location.href = 'myapp://detail/42',没装 App 的用户停在空白页 3 秒,没有任何提示,只能手动返回。日志里能对上时间点,这种反而好排。

scheme 唤起没有返回值,页面无法知道成功还是失败。跳转后浏览器进入等待,定时器被挂起,兜底逻辑没有机会执行。这一点先确认清楚,后面就不用反复试。

const t = Date.now();
location.href = 'myapp://detail/42';
setTimeout(() => {
  if (Date.now() - t < 2500 && !document.hidden) showDownloadTip();
}, 2000);

「scheme 唤起兜底」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

别只看报错的最后一行,往上看几行,真正的起因通常在上面。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。

处理上按这个顺序:跳转前记录时间并启动 2 秒定时器;用 visibilitychange 判断页面是否被切走 切走视为成功;超时后展示下载引导 不要停在空白;装与不装两台设备各测一次。

结果对不对很好判断,未安装 App 时 2 秒内出现下载提示,已安装时直接跳到详情页不弹提示。

作者 9823189