获取已安装的相关应用 API 可用于获取已安装的相关应用列表以及有关这些应用的详细信息。
借助该 API,您可以检查渐进式 Web 应用 (PWA)、Android 应用或通用 Windows 平台 (UWP) 应用是否已安装在当前设备上,无论是从 PWA 本身还是从相关网页(例如产品营销网站)都可以进行检查。
如果应用已安装,您可以自定义用户体验。
例如:
- 如果您的其他应用已安装,则不会宣传 PWA 的安装。
 - 将用户从产品营销网站直接重定向到您的应用。
 - 将通知等部分功能集中到另一个应用中,以防止重复通知。
 
什么是 Get Installed Related Apps API?
调用异步 navigator.getInstalledRelatedApps() 方法会返回一个 promise,该 promise 会解析为一个对象数组,其中包含有关以下应用的详细信息:
- 安装在当前设备上,
 - 在 Web 应用清单的 
related_applications字段中定义, - 与调用 
navigator.getInstalledRelatedApps()方法的网页具有已验证的关系(详情请参阅下文)。 
const installedRelatedApps = await navigator.getInstalledRelatedApps?.();
调用 console.log(installedRelatedApps) 会返回如下内容:
[
  {
    platform: "webapp",
    id: "https://example.com/?utm_source=home_screen",
    url: "https://example.com/manifest.json"
  },
  {
    platform: "play",
    id: "com.example.twa",
    url: "https://play.google.com/store/apps/details?id=com.example.twa",
    version: "0.1.0"
  }
]
例如,如需检查用户的设备上是否安装了任何相关应用,您可以使用以下单行代码:
const hasInstalledRelatedApps = !!(await navigator.getInstalledRelatedApps?.())?.length;
如果您知道软件包 ID,可以使用以下单行命令获取已安装的相关 Android 应用的版本号:
const installedRelatedAndroidAppVersion = (await navigator.getInstalledRelatedApps?.())?.find(app => app.id === 'com.example.twa')?.version;
您可以查看的支持的应用类型
| 应用类型 | 可检查 | 
| Android 应用 | 仅限 Android: Chrome 80 或更高版本  | 
  
| 通用 Windows 平台 (UWP) 应用 | 仅限 Windows: Chrome 85 或更高版本 Edge 85 或更高版本  | 
  
| 在同一来源的同一作用域中安装的渐进式 Web 应用 (PWA) | Android: Chrome 84 或更高版本 桌面设备(Windows、macOS、Linux、ChromeOS): Chrome 140 或更高版本 Edge 140 或更高版本  | 
  
| 在相同或不同来源的不同作用域中安装的渐进式 Web 应用 (PWA) | 
   仅限 Android: Chrome 84 或更高版本  | 
  
检查您的 Android 应用是否已安装
您的网站可以检查您的 Android 应用是否已安装。
支持的设备:
- 仅限 Android:Chrome 80 或更高版本
 
向 Android 应用告知您的网站
首先,您需要更新 Android 应用,以便使用 Digital Asset Links 系统定义网站与 Android 应用之间的关系。这样可验证只有您的网站才能检查您的 Android 应用是否已安装。
在 Android 应用的 AndroidManifest.xml 中,添加一个 asset_statements 条目:
<manifest>
  <application>
   …
    <meta-data android:name="asset_statements" android:resource="@string/asset_statements" />
   …
  </application>
</manifest>
然后,在 strings.xml 中添加以下资源声明,并将 site 更新为您的网域。请务必添加转义字符。
<string name="asset_statements">
  [{
    \"relation\": [\"delegate_permission/common.handle_all_urls\"],
    \"target\": {
      \"namespace\": \"web\",
      \"site\": \"https://example.com\"
    }
  }]
</string>
完成后,在设备上安装更新后的应用,或将其发布到 Google Play 商店或任何其他 Android 应用分发平台。
向您的网站介绍您的 Android 应用
接下来,通过向网页添加 Web 应用清单,告知网站您的 Android 应用。清单必须包含 related_applications 属性,这是一个提供应用详细信息的数组,包括 platform 和 id。
platform必须为playid是 Android 软件包 ID
{
  "related_applications": [{
    "platform": "play",
    "id": "com.android.chrome"
  }]
}
检查您的应用是否已安装
最后,调用异步函数 navigator.getInstalledRelatedApps() 以检查您的 Android 应用是否已安装。
检查 Windows (UWP) 应用是否已安装
您的网站可以检查您的 Windows 应用(使用 UWP 构建)是否已安装。
支持的设备:
- 仅限 Windows:Chrome 85 或更高版本、Edge 85 或更高版本
 
向 Windows 应用告知您的网站
您需要更新 Windows 应用,以使用 URI 处理程序定义网站与 Windows 应用之间的关系。这样可验证只有您的网站可以检查您的 Windows 应用是否已安装。
将 Windows.appUriHandler 扩展程序注册添加到应用的清单文件 Package.appxmanifest 中。例如,如果您的网站地址是 example.com,您需要在应用的清单中添加以下条目:
<Applications>
  <Application Id="App" ... >
      ...
      <Extensions>
         <uap3:Extension Category="windows.appUriHandler">
          <uap3:AppUriHandler>
            <uap3:Host Name="example.com" />
          </uap3:AppUriHandler>
        </uap3:Extension>
      </Extensions>
  </Application>
</Applications>
请注意,您可能需要将 uap3 命名空间添加到 <Package> 属性。
然后,创建一个名为 windows-app-web-link 的 JSON 文件(不含 .json 文件扩展名),并提供应用的软件包系列名称。将该文件放置在服务器根目录或 /.well-known/ 目录中。您可以在应用清单设计器的“打包”部分中找到软件包系列名称。
[{
  "packageFamilyName": "MyApp_9jmtgj1pbbz6e",
  "paths": [ "*" ]
}]
如需详细了解如何设置 URI 处理程序,请参阅使用应用 URI 处理程序为网站启用应用。
让您的网站了解您的 Windows 应用
接下来,通过向网页添加 Web 应用清单,让您的网站了解您的 Windows 应用。清单必须包含 related_applications 属性,这是一个提供应用详细信息的数组,包括 platform 和 id。
platform必须为windowsid是应用的软件包系列名称,后跟Package.appxmanifest文件中的<Application>Id值。
{
  "related_applications": [{
    "platform": "windows",
    "id": "MyApp_9jmtgj1pbbz6e!App"
  }]
}
检查您的应用是否已安装
最后,调用异步函数 navigator.getInstalledRelatedApps() 以检查 Windows 应用是否已安装。
不妨查看此演示。
检查您的渐进式 Web 应用是否已安装(在范围内)
PWA 可以检查是否已安装。在这种情况下,发出请求的网页必须与 PWA 位于同一网域,并且在 Web 应用清单中定义的 PWA 范围内。
支持的设备:
- Android:Chrome 84 或更高版本
 - 桌面设备(Windows、macOS、Linux、ChromeOS):Chrome 140 或更高版本、Edge 140 或更高版本
 
让 PWA 了解自身
通过在 PWA 的Web 应用清单中添加 related_applications 条目,让 PWA 了解自身。
platform必须为webappurl是 PWA 的 Web 应用清单的路径(可以是相对路径)id是在 Web 应用清单的id字段中声明或由浏览器计算出的Web 应用 ID(桌面设备必需,Android 设备不需要)
{
  …
  "scope": "/",
  "start_url": "/?utm_source=home_screen",
  "related_applications": [{
    "platform": "webapp",
    "url": "/manifest.json",
    "id": "https://example.com/?utm_source=home_screen"
  }],
  …
}
检查 PWA 是否已安装
最后,从 PWA 的 scope 内调用异步函数 navigator.getInstalledRelatedApps(),以检查 PWA 是否已安装。如果 navigator.getInstalledRelatedApps() 是在 PWA 范围之外调用的,则会返回 []。有关详情,请参见下文。
检查渐进式 Web 应用是否已安装(超出范围)
即使网页不在 PWA 的作用域内,您的网站也可以检查 PWA 是否已安装。例如,从 /landing/ 提供的着陆页可以检查从 /pwa/ 提供的 PWA 是否已安装,或者您的着陆页是从 www.example.com 提供的,而您的 PWA 是从 app.example.com 提供的。
支持的设备:
- 仅限 Android:Chrome 84 或更高版本
 
告知 PWA 您的网站
首先,您需要向提供 PWA 的服务器添加数字资产链接。这有助于定义您的网站与 PWA 之间的关系,并验证只有您的网站可以检查 PWA 是否已安装。
将 assetlinks.json 文件添加到 PWA 所在的网域的 /.well-known/ 目录中,例如 app.example.com。在 site 属性中,提供将执行检查的 Web 应用清单的完整路径(而不是 PWA 的 Web 应用清单)。
// Served from https://app.example.com/.well-known/assetlinks.json
[
  {
    "relation": ["delegate_permission/common.query_webapk"],
    "target": {
      "namespace": "web",
      "site": "https://www.example.com/manifest.json"
    }
  }
]
向您的网站介绍 PWA
接下来,通过向网页添加 Web 应用清单,告知您的网站有关 PWA 应用的信息。清单必须包含 related_applications 属性,这是一个提供有关 PWA 详细信息的数组,包括 platform 和 url。
platform必须为webappurl是 PWA 的 Web 应用清单的完整路径
{
  "related_applications": [{
    "platform": "webapp",
    "url": "https://app.example.com/manifest.json"
  }]
}
检查 PWA 是否已安装
最后,调用异步函数 navigator.getInstalledRelatedApps() 以检查 PWA 是否已安装。
还有问题吗?
仍有疑问?查看 StackOverflow 上的 getInstalledRelatedApps 标记,看看是否有人提出过类似问题。如果找不到,请在论坛中提出问题,并务必添加 progressive-web-apps 标记。我们的团队会经常监控该标签,并尽力回答您的问题。
反馈
您是否发现 Chrome 的实现存在 bug?还是实现与规范不同?
- 请访问 https://new.crbug.com 提交 bug。请尽可能详细地说明问题,提供重现 bug 的说明,并在组件框中输入 
Mobile>WebAPKs。 
实用链接
谢谢
特别感谢 Microsoft 的 Sunggook Chue 帮助我们详细了解了 Windows 应用的测试,以及 Rayan Kanso 帮助我们详细了解了 Chrome。