Manifest · 清单成员
related_applications 与 prefer_related_applications
发布于
related_applications 是一个对象数组,每一项给出 platform 以及商店 url 或 id,指向这个 Web
应用的原生或 Web 对应版本。prefer_related_applications 是布尔值,告诉浏览器推荐其中一个对应应用,
而不是提议安装 Web 应用本身。navigator.getInstalledRelatedApps() 在运行时读取的也是同一个数组。
Android 上的 Chrome 44、Samsung Internet 4.0、Android WebView 44 与 Edge 17 处理这两个成员(BCD
html.manifest.related_applications)。桌面端 Chrome 在 Windows 上为 getInstalledRelatedApps()
读取数组,但对 prefer_related_applications 只做一件事:值为 true 时拒绝安装。Firefox 157 解析
这两个成员后不做处理;Safari 27 不读取它们。
- 类型:
related_applications是对象数组,字段有platform(字符串,必填)、url(字符串)、id(字符串)、min_version(字符串)与fingerprints({ type, value }数组)。url与id至少要有一个。prefer_related_applications是布尔值。 - 允许的
platform值:play(Google Play)、itunes(App Store)、windows(Microsoft Store)、chrome_web_store、f-droid、amazon,以及webapp(以清单id标识的 PWA)。 - 默认值:空数组,以及
false。省略prefer_related_applications等同于写false。 - 示例值:
[{ "platform": "play", "id": "com.example.app" }]搭配"prefer_related_applications": true。
Chromium 逐条校验:缺少 platform 的条目记录
'platform' is a required field, related application ignored.,既没有 url 也没有 id 的条目记录
one of 'url' or 'id' is required, related application ignored.;其余条目保留。这种关系是单向的:原生应用不需要反过来指向 Web 应用,唯一的
例外是 getInstalledRelatedApps(),它在 Android 上会先核验 Play 应用的 Digital Asset Links 声明,
再报告其已安装(Digital Asset Links,developers.google.com)。
prefer_related_applications: true 在 Chromium 里有两种效果。在 Chrome for Android(仅 Beta 与
Stable 渠道)上,安装提示改为推荐第一个 play 条目而不是 Web 应用。在其他所有地方它会阻断可安装性:
可安装性检查报告 The manifest specifies prefer_related_applications: true,在其他渠道或平台上还会
附加 Manifest 'prefer_related_applications' is only supported on Chrome Beta and Stable channels on Android.。
第一个示例是两个成员所在的清单;后两个是页面在运行时如何使用这个数组。
指向 Play 商店应用与 Microsoft Store 页面
Section titled “指向 Play 商店应用与 Microsoft Store 页面”一个有原生同胞的 Web 应用把两者都列出来。Play 条目以包名作 id、以商店页面作 url;Microsoft
Store 条目只有 url。不写 prefer_related_applications 时,Web 应用仍可安装,这个列表只服务于
getInstalledRelatedApps()。
{ "name": "Trail Maps", "start_url": "/", "display": "standalone", "related_applications": [ { "platform": "play", "url": "https://play.google.com/store/apps/details?id=com.example.trailmaps", "id": "com.example.trailmaps" }, { "platform": "windows", "url": "https://apps.microsoft.com/store/detail/trail-maps/9WZDNCRFHVJL" } ]}只有当应用在 Android 上绝对不能以 PWA 形式安装时才加 "prefer_related_applications": true;它会
同时移除所有其他 Chromium 平台上的 PWA 安装路径。
原生应用已安装时隐藏安装按钮
Section titled “原生应用已安装时隐藏安装按钮”navigator.getInstalledRelatedApps() 以数组中已安装在本设备上的条目兑现(Android 上的 Chrome 80;
Windows 上的 Chrome 85 支持 windows 条目)。它只能在应用自身源的顶层框架中调用,且 Play 应用必须
为该源发布 Digital Asset Links 声明。回退分支为没有该方法的浏览器保留按钮。
async function nativeAppInstalled() { if (typeof navigator.getInstalledRelatedApps !== 'function') { return false; // Safari、Firefox、iOS 版 Chrome:展示 Web 安装路径 } try { const apps = await navigator.getInstalledRelatedApps(); return apps.some((app) => app.platform === 'play' || app.platform === 'windows'); } catch { return false; // 不在顶层框架,或 asset links 校验未通过 }}
nativeAppInstalled().then((installed) => { document.querySelector('#install-web-app').hidden = installed;});兑现的对象带有 platform、url、id 与 version,所以设置了 min_version 时,同一个调用还能
发现过时的原生应用。
检测 PWA 自身是否已经安装
Section titled “检测 PWA 自身是否已经安装”id 等于清单自身 id 的 webapp 条目,让在浏览器标签页里打开的站点能询问本设备是否已安装它的
PWA。Chrome 85 及之后会兑现这一查询;其他浏览器落到 display-mode 检查,而后者只知道当前窗口的
情况。
{ "id": "/", "related_applications": [ { "platform": "webapp", "url": "https://trailmaps.example/manifest.webmanifest" } ]}async function pwaInstalled() { if (matchMedia('(display-mode: standalone)').matches) return true; // 正以应用形式运行 if (typeof navigator.getInstalledRelatedApps !== 'function') return false; const apps = await navigator.getInstalledRelatedApps(); return apps.some((app) => app.platform === 'webapp');}用这个结果把“安装”号召改成“打开应用”;webapp 条目对可安装性和安装提示没有任何影响。
- getInstalledRelatedApps():检测已安装的原生或 PWA 对应应用
- id 清单成员
- 可安装性条件:PWA 如何才能被安装
- Trusted Web Activity(TWA):PWA 进入 Play 商店
- Manifest Incubations: related_applications member(wicg.github.io)
- Navigator: getInstalledRelatedApps() method(developer.mozilla.org)
规范
| 规范 | 状态 |
|---|---|
| Web 应用清单:related_applications | WICG 草案 |
| Manifest Incubations: prefer_related_applications member | WICG 草案 |