appinstalled事件已废弃,chrome 68+、firefox、safari、edge均不触发;唯一可靠方案是监听beforeinstallprompt并处理userchoice结果,辅以matchmedia('(display-mode: standalone)')判断ios安装状态。

appinstalled 事件根本不会在大多数浏览器中触发
Chrome 从 68 版本起已移除 appinstalled 事件,Firefox 从未支持,Safari 不支持,Edge(基于 Chromium)同样不触发。你写 window.addEventListener('appinstalled', handler) 后永远收不到回调——这不是代码写错了,是规范废弃+厂商放弃的结果。
目前没有标准、可靠、跨浏览器的 JS 事件能告诉你“安装已完成”。所谓“检测成功安装”,实际只能退而求其次:判断安装条件是否满足 + 用户是否大概率已安装。
用 beforeinstallprompt + userChoice 判断用户是否点了“添加”
beforeinstallprompt 是唯一可捕获的安装前信号,但它只代表“PWA 符合安装条件”,不等于用户真点了确认。真正能反映用户意图的是 userChoice Promise 的结果:
-
userChoice返回{outcome: "accepted"}表示用户点击了添加按钮(但不保证最终完成安装,比如中途切走或系统失败) -
{outcome: "dismissed"}表示用户关闭了提示或点了取消 - 该 Promise 在 Chrome 中仅在
beforeinstallprompt被preventDefault()后才可用
let deferredPrompt;
window.addEventListener('beforeinstallprompt', (e) => {
e.preventDefault();
deferredPrompt = e;
});
// 比如绑定到一个“添加到主屏幕”按钮
addBtn.addEventListener('click', () => {
if (deferredPrompt) {
deferredPrompt.prompt();
deferredPrompt.userChoice.then((choiceResult) => {
if (choiceResult.outcome === 'accepted') {
console.log('用户点了添加 —— 这是最接近“安装成功”的信号');
}
deferredPrompt = null;
});
}
});
通过 matchMedia 检测 iOS 是否处于“已安装”状态
iOS Safari 是特例:它不支持 beforeinstallprompt,但提供 matchMedia('(display-mode: standalone)') 或 matchMedia('(display-mode: minimal-ui)') 来判断当前是否以 PWA 模式运行(即从主屏幕启动)。这虽不是“安装完成通知”,却是唯一能确认用户已添加并再次打开的方式:
文章转信息图。将文章/笔记转化为手机可读的 HTML 信息图,自动匹配视觉风格。触发场景:文章转图、笔记转图、信息图、转小红书图、做张图、可视化这篇文章、文生图。
-
matchMedia('(display-mode: standalone)').matches为true→ 用户已添加且正以独立窗口运行 - 该检测必须在页面加载后执行,不能在
DOMContentLoaded前依赖 - 注意:首次从 URL 打开时返回
false;只有从主屏幕图标启动才可能为true
你可以把它作为“用户很可能已安装”的旁证,配合服务端埋点或 localStorage 标记使用。
为什么不要监听 appinstalled?现在还有哪些坑要避开
除了事件本身已失效,强行保留 appinstalled 监听还会带来干扰:
- 在旧版 Chrome(≤67)中可能误触发,但新版会静默忽略,导致行为不一致
- 部分 PWA 工具链(如 Workbox)或框架封装层仍残留该监听,容易误导开发者以为它有效
- Android 上即使用户点“添加”,系统也可能延迟创建图标或失败,没有任何 JS 回调可感知
- 桌面端(Windows/macOS)PWA 安装后无任何事件,全靠用户主动反馈或服务端日志推断
真正能落地的方案只有两个:用 userChoice 抓住用户点击瞬间,再用 display-mode 媒体查询确认下次启动状态。其余所有“安装成功回调”的设想,目前都只是空想。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










