跳转到内容

Chrome 与 Android 上的 PWA(WebAPK、TWA)

一句话: Android 版 Chrome 是能力最强的 PWA 平台——可安装的 PWA 会触发 beforeinstallprompt,当用户安装时,Chrome 会静默生成一个 WebAPK,使应用在启动器上 拥有真实的安装包、自己的图标以及系统级集成。若需应用商店露出,同一个 Web 应用可被封装成 Trusted Web Activity(TWA) 并上架 Google Play。

  • 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; // 只能使用一次
});

当用户安装一个合格的 PWA 时,Chrome 会向 Google 运营的生成服务请求一个 WebAPK 并安装 到设备上。这赋予 PWA 一些书签快捷方式永远不具备的特性:

  • 一等公民的应用身份。 在应用抽屉、应用信息页与长按快捷方式中拥有自己的条目;它会 作为已安装的 Android 应用出现。
  • 由 manifest 驱动的外观。 名称、图标(含 maskable)、主题色、显示模式与 scope 都 来自你的 manifest。
  • Intent 处理。 WebAPK 为你的源注册,因此指向你 scope 内的链接可在已安装应用中打开, 而非浏览器标签页。
  • 无需 Play 商店。 WebAPK 安装完全通过 Chrome 进行——无需开发者账号、签名或商店列表。

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
  • 设置 scopestart_url,使 WebAPK 捕获正确的链接。
  • 若需 Play 分发,用 Bubblewrap 或 PWABuilder 生成 TWA。
  • 托管 assetlinks.json 并验证 Digital Asset Links,使其不显示地址栏。
  • 应用内数字商品使用 Play Billing 以符合 Play 政策。
  • 在真实 Android 设备上测试安装、启动器身份与链接捕获。