1. 引言
随着 Web 能力的增长,Web 应用的功能开始与相应原生应用的功能相匹配。用户在同一设备上同时安装 一个 Web 应用和相应原生应用的情况将变得更加常见,并且这些应用的功能集将会趋同。
允许网站检测某个应用是否已安装(无论是原生应用还是 Web 应用)非常重要,这样它们就可以 禁用应由另一个应用提供的功能。
1.1. 示例
const installedApps= await navigator. getInstalledRelatedApps(); const nativeApp= installedApps. find( app=> app. id=== 'com.example.myapp' ); if ( nativeApp&& doesVersionSendPushMessages( nativeApp. version)) { // 有一个已安装的原生应用负责发送推送消息。 // 不需要执行任何操作。 return ; } // 创建一个推送订阅。
在上面的示例中,doesVersionSendPushMessages 是一个由开发者定义的函数。
2. 隐私考虑
此 API 仅在安全的顶级上下文中启用。这确保网站不能被伪造,并且站点与应用之间的关联是有效的。
Web 应用与其对应应用之间的关联是双向的,这意味着 Web 应用必须声明它与相关应用的关联, 并且相关应用也必须声明它与该 Web 应用的关联。这可以防止恶意网站对用户进行指纹识别, 并获取他们已安装应用的列表。
用户代理可以限制要匹配的相关应用数量,以限制指纹识别。
用户代理在隐私保护模式下运行时不得返回已安装的应用,例如 Chrome 中的无痕模式或 Firefox 中的隐私浏览模式。
3. 基础设施
3.1. 平台
平台是一个特定于 OS 的概念,用于将同一类别的应用组合在一起。
它由 USVString
表示。
一个 OS 具有已安装 应用,这是一个 映射,其中键为平台, 值为列表,列表项为已安装应用。
3.2. 已安装应用
已安装应用表示安装在用户设备上的 应用。
已安装应用由以下内容组成:
4. 算法
4.1. 匹配已安装应用
ExternalApplicationResource)
和 manifestURL(一个 URL)
匹配已安装
应用,运行以下步骤:
-
令 platform 为 relatedApp 的
platform。 -
令 installedApps 为已安装应用[platform]。
-
对 installedApps 中的每个 installedApp:
-
如果 relatedApp 的
id不等于 installedApp 的id,并且 relatedApp 的url不等于 installedApp 的id,则继续。 -
如果存在,则令 minVersion 为 relatedApp 的
min_version, 否则为空字符串。 -
如果 minVersion 不是空字符串,且 minVersion 大于 installedApp 的version,返回 null。
注:“greater”是一个特定于平台的概念,用于 对应用版本进行排序。它不必是字典序。
-
如果存在,则令 fingerprints 为 relatedApp 的
fingerprints, 否则为空列表。 -
对 fingerprints 中的每个 fingerprint:
-
如果 installedApp 的fingerprints 不包含 fingerprint,返回 null。
-
-
如果 installedApp 的relatedURLs 不包含 manifestURL,返回 null。
-
返回 installedApp。
-
-
返回 null。
5. API
5.1. RelatedApplication
dictionary {RelatedApplication required USVString ;platform USVString ;url DOMString ;id USVString ; };version
每个 RelatedApplication
表示一个已安装应用,
该已安装应用与从 WebAppManifest
提供的 ExternalApplicationResource
相匹配。
5.2. 对 Navigator
的扩展
[Exposed =Window ]partial interface Navigator { [SecureContext ]Promise <sequence <RelatedApplication >>getInstalledRelatedApps (); };
5.2.1. getInstalledRelatedApps()
getInstalledRelatedApps() 方法在被
调用时,运行以下步骤:
-
如果 relevantBrowsingContext 不是顶级浏览上下文,则返回一个以
InvalidStateErrorDOMException拒绝的 promise。是否 应移除此限制?(#11)
-
令 promise 为一个新的 promise。
-
并行地运行以下步骤:
-
令 manifest 和 manifestURL 为获取 manifest 的结果。如果失败,则以一个空列表resolve promise,并中止这些步骤。
-
令 relatedApplications 为 manifest 的
related_applications。 -
可选地:
-
令 maxRelatedApps 为用户代理确定的数字。
-
如果 relatedApplications 的大小大于 maxRelatedApps,则将 relatedApplications 截断为 maxRelatedApps 的大小。
注:这会限制网站能够知道多少个原生应用已安装。 额外项目需要被截断,以便每次都返回相同的
ExternalApplicationResource。 -
-
令 installedApps 为空列表。
-
对 relatedApplications 中的每个 relatedApplication:
-
以 installedAppsresolve promise。
-
-
返回 promise。