跳转到内容

getInstalledRelatedApps():检测已安装的原生或 PWA 对应应用

发布于

一句话: navigator.getInstalledRelatedApps() 会 resolve 为一组已经安装在用户设备上的、 与调用方 web 应用相关的平台特定应用或 PWA——这些应用在调用方 manifest 的 related_applications 中声明。

getInstalledRelatedApps() 可用于检查与调用该方法的 web 应用相关的 Universal Windows Platform (UWP)应用、Android 应用以及 PWA 的安装情况。要把调用方 web 应用与某个平台特定应用或 PWA 关联 起来,需要完成两件事:

  1. 调用方 web 应用的 manifest 必须在自己的 related_applications 成员中列出该相关的 Android 应用、UWP 应用或 PWA。
  2. 该平台特定应用或 PWA 必须以某种平台特定方式定义并验证它与调用方应用的关系:
    • Android 应用通过 Digital Asset Links 系统定义该关系。
    • Windows UWP 应用通过 URI Handlers 定义该关系。
    • PWA 则通过以下两种方式之一定义:在自己的 related_applications 成员中包含一个自引用条目 (指定 platform 与 id),用于同一 scope 内检查是否已安装在底层平台上;或者——对于要检查 某个 PWA 的 scope 之外的应用是否已安装在 Android 上的情况——在该 PWA 的 /.well-known/ 目录中提供一个 assetlinks.json 文件。

getInstalledRelatedApps() 不接受参数,返回一个 Promise,它 resolve 为一个数组,每个已安装的 相关应用对应数组中的一项,每项对象可以包含:

  • id(可选)——一个平台特定的字符串,标识该应用。
  • platform——该应用所属的生态或操作系统:"chrome_web_store"、"play"、 "chromeos_play"、"webapp"、"windows"、"f-droid" 或 "amazon"。
  • url(可选)——与该应用关联的 URL,通常是可以安装或了解它的地方。
  • version(可选)——该相关应用的版本。
const relatedApps = await navigator.getInstalledRelatedApps();
const psApp = relatedApps.find((app) => app.id === 'com.example.myapp');
if (psApp) {
// 一个相关的平台特定应用已经安装。
}

在顶层浏览上下文之外调用该方法会抛出 InvalidStateError 类型的 DOMException。

  • 在调用方 web 应用自己 manifest 的 related_applications 成员中列出该相关的 Android 应用、 UWP 应用或 PWA。
  • 为相关应用配置好其平台所需的验证方式:Android 用 Digital Asset Links,UWP 用 URI Handlers,相关 PWA 则用自引用的 related_applications 条目(或 /.well-known/assetlinks.json)。
  • 只在顶层浏览上下文中调用 getInstalledRelatedApps(),以避免 InvalidStateError。
  • 用解析出的 platform/id 值来决定是否要抑制自己的安装提示或某个功能(例如,当已存在 原生对应应用时跳过提示安装该 PWA)。
  • 安装提示——把这项检测与 beforeinstallprompt 结合,在相关应用已安装时抑制提示