getinstalledrelatedapps 无法避免重复安装提示,仅返回已安装且通过 assetlinks.json 或 web-app-origin-association 声明的原生应用列表,不触发安装也不抑制系统弹窗;其返回空数组常见于https缺失、非用户手势调用、应用未安装、assetlinks.json验证失败或chrome未将站点识别为webapk关联源等情况。

getInstalledRelatedApps 不能用于“避免重复安装提示”,它只返回已安装的、在 web-app-origin-association 或 assetlinks.json 中声明过的原生应用列表,且**不触发任何安装行为,也不影响系统弹窗逻辑**。浏览器不会因调用该 API 而跳过或抑制“已安装应用”的提示(比如 Chrome 的“打开应用”横幅或 PWA 安装提示)。想绕过安装确认弹窗?做不到。
为什么 getInstalledRelatedApps 返回空数组很常见
这个 API 实际生效需要同时满足多个硬性条件,缺一不可:
-
getInstalledRelatedApps只在 HTTPS 环境下可用,HTTP 页面直接拒绝调用 - 必须在用户手势(如
click、touchstart)触发的上下文中调用,不能在页面加载时自动执行 - 目标原生应用必须已在设备上安装,且其
AndroidManifest.xml中正确配置了<intent-filter></intent-filter>+android:autoVerify="true" - 对应域名必须已通过
/.well-known/assetlinks.json在服务器上完成数字签名验证(不是上传就行,需 SHA256 指纹匹配) - Chrome(目前唯一支持该 API 的主流浏览器)要求站点已注册为 WebAPK 的关联源,且用户曾主动与该 PWA 交互过(如添加到主屏幕)
如何验证 assetlinks.json 是否生效
别只看文件能不能 curl 到,重点是验证签名和结构是否被系统认可:
将调研报告、方案对比、数据分析、需求梳理、会议纪要、设计说明、代码评审、学习笔记等任务产物输出为可在浏览器直接打开的单文件 HTML,替代 Markdown 作为最终交付物。Markdown 在信息密度、视觉清晰度和可分享性上已跟不上 AI 产物的丰富度,HTML 能同时承载排版、表格、SVG 等。
- 用 Google 提供的在线校验工具:https://digitalassetlinks.googleapis.com/v1/statements:list?source.web.site=https://
yourdomain.com&relation=delegate_permission/common.handle_all_urls —— 替换为你的域名,看返回是否含"result": true和正确的包名 - 确保
assetlinks.json响应头包含Content-Type: application/json,且无重定向、无 404、无缓存干扰(建议加Cache-Control: no-cache) - 包名、证书指纹、域名三者必须与 APK 构建时完全一致;调试版和正式版证书不同,需分别配置两套
assetlinks.json
替代方案:用 navigator.getInstalledRelatedApps 做体验分流
它不适合拦截安装,但可用于优化用户路径:
- 若
getInstalledRelatedApps()返回非空数组,可隐藏“下载 App”按钮,改显示“打开应用”链接(用intent:或自定义 scheme) - 若返回空,再展示 PWA 安装提示或原生 App 下载入口
- 注意:iOS 完全不支持该 API,Safari 返回空 Promise;华为浏览器、Edge(基于 Chromium)支持程度与 Chrome 一致
- 示例代码片段(需在 click 回调中):
button.addEventListener('click', async () => {
try {
const apps = await navigator.getInstalledRelatedApps();
if (apps.length > 0) {
window.location.href = 'intent://open#Intent;scheme=yourapp;package=com.example.app;end';
} else {
// 触发 PWA install prompt 或跳转下载页
deferredPrompt.prompt();
}
} catch (err) {
console.warn('getInstalledRelatedApps failed:', err);
}
});
真正难的不是调用 API,而是让 Android 的数字资产链接验证通过——90% 的失败都卡在 assetlinks.json 的签名或部署细节上,比如用了反向代理却没透传头信息、证书指纹从 keystore 抽错了 alias、或者 JSON 文件里多了一个不可见的 BOM 字符。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










