# 分发

> 把 PWA 装到设备上的四条渠道：浏览器安装、Google Play 上的 Trusted Web Activity、Microsoft Store 打包上架、Galaxy Store，以及每条渠道各要付出什么。

PWA 通过四条渠道之一到达设备：浏览器自带的安装流程、上架 Google Play 的 Trusted Web Activity、Microsoft Store 的打包上架，或接入 Galaxy Store 的一个 URL。四条渠道跑的是同一份代码；不同的是谁来审核、谁绘制安装界面，以及更新如何到达用户。

## 工作原理

每条渠道都在同一个源前面多加一个产物。浏览器渠道什么都不加；商店渠道加一个包，这个包唯一的职责是证明发布者拥有该源。

### 浏览器安装

Android、Windows、macOS、ChromeOS 与 Linux 上的 Chromium 浏览器在满足[可安装条件](/zh/compatibility/install-prompt/)后提供安装入口：带图标的 manifest、位于 scope 内的 `start_url`、安全源，以及已注册的 Service Worker。在 Android 上，Chrome 会生成一个 [WebAPK](/zh/reference/installation/webapk/)，让应用像原生应用一样出现在启动器与应用设置中。iOS 与 iPadOS 上的 Safari 通过共享菜单里的[添加到主屏幕](/zh/reference/installation/ios-add-to-home-screen/)安装，没有提示事件。没有审核，没有目录；每次更新就是一次普通的服务器部署。

### Google Play 上的 Trusted Web Activity

[Trusted Web Activity](/zh/reference/installation/twa/) 是一个 Android 应用，其 Activity 在 Chrome 72 及以后中全屏打开你的源，与浏览器共享 cookie、存储和 Service Worker。信任来自 Digital Asset Links：站点在 `https://example.com/.well-known/assetlinks.json` 发布一条声明，`relation` 为 `delegate_permission/common.handle_all_urls`，`target` 写明 `package_name` 与签名证书的 `sha256_cert_fingerprints`。Google 写明放在「any other location, or with any other name」的声明列表无效。

[Bubblewrap](https://github.com/GoogleChromeLabs/bubblewrap) 负责生成项目：`bubblewrap init --manifest <url>` 读取你的 Web manifest，`bubblewrap build` 产出 `app-release-signed.apk` 与 `app-release-bundle.aab`，`bubblewrap fingerprint generateAssetLinks` 写出待上传的 `assetlinks.json`。它要求 Node.js 14.15 及以上与 JDK 17；CLI 首次运行时会提议自动下载 JDK 与 Android 命令行工具。PWABuilder 是同一内核上的网页前端。

验证失败时，Chrome 的快速入门写道：「the browser falls back to displaying your website as a Custom Tab」，页面顶部会出现浏览器界面。常见原因是指纹不匹配：Bubblewrap 用 `init` 时创建的密钥签名，而 Google Play 可能依你的签名设置用另一把密钥重新签名，其指纹也必须写进文件。这条渠道的代价是一次性的 Play 上架、一把必须保管好的签名密钥，以及[商店政策](/zh/ecosystem/stores/)中描述的付款政策。

### Microsoft Store 打包上架

Microsoft Store 把 PWA 作为 Windows 包接收，没有原生壳。PWABuilder 把 URL 变成 `.msixbundle` 与 `.classic.appxbundle`；Partner Center 在提交流程的 **Packages** 步骤接收这两个文件。代码更新经你的服务器发布，不需要新包；manifest 变更（图标、名称、`file_handlers`、`protocol_handlers`、`share_target`）需要新包，因为 manifest 被复制进了包内。从 Store 安装的 PWA 的 `start_url` 被固定，跳转到区域域名会被视为超出 scope，Edge 在窗口顶部显示 URL 与页面标题；Microsoft 没有记录任何为 Store 安装关闭该栏的方法。

### 通过 URL 接入 Galaxy Store

三星 2019-10-24 的公告请开发者「send us the URL to pwasupport@samsung.com」；随后三星负责接入与图标授权，上架条目在 Samsung Internet 中打开 PWA。发布时条目「only visible in the US Galaxy Store」，到 2026-10 没有自助提交路径的文档。

| 渠道 | 审核 | 谁绘制安装界面 | 更新如何到达用户 |
|---|---|---|---|
| 浏览器安装 | 无 | 浏览器 | 下一次导航；Service Worker 更新周期 |
| Trusted Web Activity | Google Play 政策审核 | Google Play | Web 代码：下次启动；TWA 壳：Play 更新 |
| Microsoft Store 包 | Microsoft Store 认证（写明 24 至 48 小时） | 商店 | Web 代码：下次启动；manifest：新包 |
| Galaxy Store URL | 三星人工接入 | 商店 | 下次启动 |

## 实测行为

:::observed
Android 按域名记录 Digital Asset Links 的结果。`adb shell pm get-app-links --user cur <package>` 打印一段 `Domain verification state:`，取值为 `verified`、`none`、`approved`、`denied`、`migrated`、`restored`、`legacy_failure`、`system_configured`，或一个不小于 1024 的数字；Android 文档给出的例子是 `example.org: 1026`，表示该域名因验证器特有的错误而失败。`adb shell pm verify-app-links --re-verify <package>` 在 Android 12 及以后重新触发验证（Android Developers，「Verify Android App Links」）。
:::

同一页面写明了 `assetlinks.json` 变更何时生效：Android 15 及以后会在后台重新验证，「changes can take up to seven days to propagate」；Android 14 及以下只在应用安装或更新时重读文件。因此轮换指纹时，过渡期内文件里要同时保留两枚指纹。

## 另请参阅

- [Trusted Web Activities](https://developer.chrome.com/docs/android/trusted-web-activity)（developer.chrome.com）
- [Verify Android App Links](https://developer.android.com/training/app-links/verify-android-applinks)（developer.android.com）
- [Publish a PWA to the Microsoft Store](https://learn.microsoft.com/en-us/microsoft-edge/progressive-web-apps/how-to/microsoft-store)（learn.microsoft.com）
- [商店政策](/zh/ecosystem/stores/)
- [Trusted Web Activity](/zh/reference/installation/twa/)
- [WebAPK](/zh/reference/installation/webapk/)
- [安装提示兼容性](/zh/compatibility/install-prompt/)

← 返回[生态](/zh/ecosystem/)总览。