无需登录 数据私有 本地保存

PWA安装横幅演示 - 触发beforeinstallprompt

13
0
0
0
PWA 环境检测
检测中...
manifest Service Worker HTTPS beforeinstallprompt
Chrome Android iOS Safari Chrome Desktop 三星浏览器 自定义横幅
9:41
示例网页内容
↓ 下拉查看更多
My PWA App
快速、可靠的体验
▲ Chrome Android 原生安装横幅模拟
9:41
示例网页内容
My PWA App
添加到主屏幕
点击分享 → 添加到主屏幕
点击底部 分享按钮,然后选择"添加到主屏幕"
▲ iOS Safari 添加到主屏幕引导横幅模拟
example.com
My PWA App
快速、可靠的体验
example.com
▲ Chrome Desktop 地址栏安装图标 + 安装对话框模拟
9:41
示例网页内容
My PWA App
快速、可靠的体验
▲ 三星浏览器安装横幅模拟
9:41
示例网页内容
My PWA App
自定义描述文案
▲ 自定义样式横幅预览
横幅参数配置
真实 beforeinstallprompt 触发

检测中...

需要 HTTPS + manifest.json + Service Worker 才能触发真实事件

manifest.json 示例
{
  "name": "My PWA App",
  "short_name": "PWA App",
  "description": "快速、可靠的体验",
  "start_url": "/",
  "display": "standalone",
  "background_color": "#ffffff",
  "theme_color": "#4285f4",
  "icons": [
    {
      "src": "/icon-192.png",
      "sizes": "192x192",
      "type": "image/png"
    },
    {
      "src": "/icon-512.png",
      "sizes": "512x512",
      "type": "image/png"
    }
  ]
}

常见问题与知识点

什么是 beforeinstallprompt 事件?

beforeinstallprompt 是浏览器在 PWA 安装条件满足时触发的一个事件。它允许开发者拦截默认的安装提示,保存事件引用,然后在合适的时机(如用户点击自定义安装按钮)调用 prompt() 方法来显示安装对话框。这是实现自定义 PWA 安装体验的核心 API。

该事件在以下浏览器中支持:Chrome(桌面和Android)、Edge、三星浏览器、Opera 等基于 Chromium 的浏览器。iOS Safari 从 16.4 版本开始也部分支持。

beforeinstallprompt 的触发条件是什么?

浏览器触发 beforeinstallprompt 需要满足以下条件:

  • HTTPS:网站必须通过 HTTPS 提供服务(localhost 除外)。
  • 有效的 manifest.json:包含 nameshort_namestart_urlicons(至少 192x192 和 512x512)、display(推荐 standalone)。
  • 已注册的 Service Worker:需要有效的 Service Worker 控制页面。
  • 用户未安装:用户尚未将该 PWA 安装到设备上。
  • 用户交互:用户需要与页面有一定的交互(如点击、滚动等),浏览器会判断用户是否对网站感兴趣。
如何正确监听和使用 beforeinstallprompt?

标准用法如下:

let deferredPrompt;
window.addEventListener('beforeinstallprompt', (e) => {
  e.preventDefault(); // 阻止默认弹出
  deferredPrompt = e; // 保存事件
  // 显示自定义安装按钮
  installBtn.style.display = 'block';
});
installBtn.addEventListener('click', async () => {
  if (!deferredPrompt) return;
  deferredPrompt.prompt();
  const { outcome } = await deferredPrompt.userChoice;
  console.log('用户选择:', outcome); // 'accepted' 或 'dismissed'
  deferredPrompt = null;
});

注意:prompt() 只能调用一次,调用后事件即被消耗。需要在用户手势(点击)中调用。

iOS Safari 支持 PWA 安装提示吗?

iOS Safari 的 PWA 支持与传统 Chromium 浏览器不同:

  • iOS 16.4 之前:不支持 beforeinstallprompt,用户需要手动点击分享按钮 → "添加到主屏幕"。许多网站会显示自定义引导横幅来提示用户。
  • iOS 16.4+:Safari 开始支持部分 PWA 安装 API,但仍有限制。manifest 中的 related_applications 等字段被支持。
  • 推荐做法:检测是否为 iOS 设备,如果是则显示自定义引导横幅,教用户如何通过分享菜单添加到主屏幕。
Service Worker 对 PWA 安装有多重要?

Service Worker 是 PWA 的核心组件,对于安装至关重要:

  • 安装条件:Chromium 浏览器要求有活跃的 Service Worker 才会触发 beforeinstallprompt
  • 离线支持:Service Worker 可以缓存资源,使 PWA 在离线时也能加载。
  • 推送通知:配合 Push API 实现推送通知功能。
  • 后台同步:支持后台数据同步。

一个最简单的 Service Worker 注册示例:

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/sw.js');
}
为什么我的 beforeinstallprompt 没有触发?

常见排查步骤:

  1. 确认使用 HTTPS(或 localhost)。
  2. 检查 manifest.json 是否有效,所有必填字段是否完整,图标路径是否正确。
  3. 确认 Service Worker 已注册并成功激活(可在 Chrome DevTools → Application → Service Workers 查看)。
  4. 检查是否已经安装过该 PWA(已安装则不会再次触发)。
  5. 确保有足够的用户交互(浏览器需要判断用户对网站有持续兴趣)。
  6. 在 Chrome 中,可以访问 chrome://flags 查看相关 PWA 标志是否被禁用。
  7. 使用 Lighthouse 审计工具检查 PWA 配置是否完整。