Chrome 与 Android 上的 PWA(WebAPK、TWA)
一句话: Android 版 Chrome 是能力最强的 PWA 平台——可安装的 PWA 会触发
beforeinstallprompt,当用户安装时,Chrome 会静默生成一个 WebAPK,使应用在启动器上
拥有真实的安装包、自己的图标以及系统级集成。若需应用商店露出,同一个 Web 应用可被封装成
Trusted Web Activity(TWA) 并上架 Google Play。
通过 Chrome 安装
Section titled “通过 Chrome 安装”beforeinstallprompt。 当应用满足可安装条件(HTTPS、含 name/图标/start_url的有效 manifest、带 fetch 处理函数的 Service Worker)时,Chrome 触发beforeinstallprompt。调用preventDefault()暂存该事件,然后在合适时机从你自己的安装按钮触发prompt()。- 浏览器内安装 UI。 Chrome 还会在地址栏/菜单中提供安装入口,用户无需你的自定义按钮 也能安装。
appinstalled事件。 安装完成后触发——适合用来隐藏安装入口并记录转化。
let deferredPrompt = null;window.addEventListener('beforeinstallprompt', (e) => { e.preventDefault(); // 抑制迷你信息栏 deferredPrompt = e; // 为你自己的按钮保存 showInstallButton();});
installButton.addEventListener('click', async () => { if (!deferredPrompt) return; deferredPrompt.prompt(); await deferredPrompt.userChoice; deferredPrompt = null; // 只能使用一次});WebAPK——真正的 Android 安装包
Section titled “WebAPK——真正的 Android 安装包”当用户安装一个合格的 PWA 时,Chrome 会向 Google 运营的生成服务请求一个 WebAPK 并安装 到设备上。这赋予 PWA 一些书签快捷方式永远不具备的特性:
- 一等公民的应用身份。 在应用抽屉、应用信息页与长按快捷方式中拥有自己的条目;它会 作为已安装的 Android 应用出现。
- 由 manifest 驱动的外观。 名称、图标(含 maskable)、主题色、显示模式与
scope都 来自你的 manifest。 - Intent 处理。 WebAPK 为你的源注册,因此指向你 scope 内的链接可在已安装应用中打开, 而非浏览器标签页。
- 无需 Play 商店。 WebAPK 安装完全通过 Chrome 进行——无需开发者账号、签名或商店列表。
Trusted Web Activity——上架 Play
Section titled “Trusted Web Activity——上架 Play”TWA 在你发布到 Google Play 的 Android 应用内,以全屏、无浏览器控件的方式运行你的 PWA。 与 WebView 不同,TWA 在用户的 Chrome 中渲染,拥有完整的 Web 平台能力与共享存储。
- Digital Asset Links 验证归属。 你托管一个
assetlinks.json,将应用的签名密钥与你的 源绑定;缺少它,TWA 会显示地址栏。 - 工具链。 Bubblewrap(CLI)与 PWABuilder 可从你的 manifest 生成 TWA 封装项目, 并处理 Asset Links 接线。
- Play 内购。 经 Play 分发意味着需遵守 Play 政策;应用内数字商品通常须使用 Play Billing。
| 决策问题 | 推荐做法 | 理由 |
|---|---|---|
| 安装需要 Play 商店吗? | 不需要——WebAPK 直接从 Chrome 安装。 | 只有商店分发才需要 TWA + Play 列表。 |
何时调用 prompt()? |
暂存 beforeinstallprompt 后,由用户操作触发。 |
该事件一次性,且必须由手势触发。 |
| 如何获得 Play 列表? | 用 Bubblewrap/PWABuilder 把 PWA 封装为 TWA。 | TWA 复用你的 Web 应用并透传 Web 能力。 |
| 为什么我的 TWA 显示地址栏? | 修复 Digital Asset Links(assetlinks.json)。 |
归属验证失败;验证通过前地址栏一直存在。 |
| 启动器上图标被裁切? | 提供 maskable 图标。 |
Android 会套用蒙版;非 maskable 图标会被裁切。 |
- 满足可安装条件:HTTPS、有效 manifest、带 fetch 处理函数的 Service Worker。
- 提供 maskable 图标,使 WebAPK 启动器图标正确渲染。
- 处理
beforeinstallprompt(暂存 + 自定义按钮)与appinstalled。 - 设置
scope与start_url,使 WebAPK 捕获正确的链接。 - 若需 Play 分发,用 Bubblewrap 或 PWABuilder 生成 TWA。
- 托管
assetlinks.json并验证 Digital Asset Links,使其不显示地址栏。 - 应用内数字商品使用 Play Billing 以符合 Play 政策。
- 在真实 Android 设备上测试安装、启动器身份与链接捕获。