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

> navigator.getInstalledRelatedApps() 如何让 web 应用检查在 manifest 的 related_applications 中声明的相关 Android、UWP 或 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`**（可选）——该相关应用的版本。

```js
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）。

## 相关内容

- [安装提示](/zh/reference/installation/install-prompt/)——把这项检测与 `beforeinstallprompt`
  结合，在相关应用已安装时抑制提示