let deferred;
addEventListener('beforeinstallprompt', e => {
e.preventDefault(); deferred = e;
});
// 点击时 deferred.prompt()
页面上放了一个安装按钮,监听 beforeinstallprompt 之后一直没进回调,按钮点了没反应,Chrome 地址栏右侧也没有安装图标。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:事件要求 manifest 可解析、有 192 和 512 图标、start_url 同源,还要在 HTTPS 下,缺一项就不触发。事件只派发一次,监听注册晚于触发时机就永远收不到。
「beforeinstallprompt 不触发」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。监控和日志的时间要对上,时区不一致会多绕很大一圈。
临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
处理上按这个顺序:用 Application 面板的 Manifest 区域逐项看有没有红色报错,先把图标和 start_url 补齐;把监听脚本放到 head 里尽早执行,回调里把事件对象存起来;按钮点击时调用存下来的 prompt(),别在回调外直接调。
确认没问题再收工,清空站点数据后重新访问,地址栏出现安装图标,点页面按钮能弹出系统安装框。
