Chrome 在 Windows 11 中调用 getInstalledRelatedApps() 为何为空?
结论
根据问题中的修复备注,本例的解决办法是将 related_applications 条目中的 url 从 "/_new/manifest.json" 改为 "/",其他字段保持原样。
这一修复针对当前案例,不能据此推断所有 PWA 都必须使用 "/"。现有材料也不足以确定 assetlinks.json 是否为当前检测场景的必要条件。
先修改已指出的问题配置
在 https://www.swisswebcams.ch/_new/manifest.json 中,将对应配置改为:
{
"related_applications": [
{
"id": "https://www.swisswebcams.ch/",
"platform": "webapp",
"url": "/"
}
]
}
这是需要合并到原 Manifest 中的配置片段。Manifest 文件仍位于 /_new/manifest.json,无需移动;这里修改的是 related_applications[0].url。
原示例包含这一行:
"url": "/_new/manifest.json" // Using just "/" solved the issue
注释记录了修复线索。实际发布的 Manifest 必须是合法 JSON,不能保留 // 注释。如果注释只是在提问时添加的说明,就无需将其视为线上故障原因。
为什么存在这个 API,结果却仍然为空?
原调用中的判断:
'getInstalledRelatedApps' in navigator
只能确认当前 navigator 暴露了这个属性,不能保证调用结果包含应用。
返回 [] 表示本次调用没有返回应用条目,不能据此判断 Web App 没有安装,也不能认定这是 Chrome 的缺陷。
根据修复记录,related_applications 的 URL 配置是本例最直接的排查线索。材料没有提供修改前后的完整检测结果或浏览器内部匹配记录,因此无法确定具体是哪条匹配规则导致了差异。
修改后如何验证?
先确认浏览器实际获取到的 Manifest 已包含新的 url,再重新打开 Web App 并执行检测。下面的代码可以区分接口不存在、返回空数组和调用失败:
async function checkInstalledRelatedApps() {
if (!('getInstalledRelatedApps' in navigator)) {
console.warn('当前环境未提供 getInstalledRelatedApps');
return;
}
try {
const apps = await navigator.getInstalledRelatedApps();
console.log('返回的应用数量:', apps.length);
console.log(apps);
} catch (error) {
console.error('getInstalledRelatedApps 调用失败:', error);
}
}
checkInstalledRelatedApps();
为便于比较,先只修改 related_applications[0].url,并在相同浏览器、相同调用位置下记录修改前后的结果。如果仍然返回空数组,再检查页面实际关联的 Manifest 是否就是这份文件,以及已安装应用是否来自当前测试的站点。
assetlinks.json 是否需要修改?
所给文件声明了 delegate_permission/common.handle_all_urls,目标是 https://www.swisswebcams.ch。仅凭这段配置,无法确定它是否满足当前 API 检测所需的关联条件,也无法认定它导致了空数组。
原始材料指出的修复发生在 Manifest 的 url 字段,没有提供修改 assetlinks.json 后产生效果的记录。因此,本例应先验证给出的 Manifest 修复。是否需要 assetlinks.json,应结合具体检测场景确认;文件存在本身不能保证检测成功。
备注:内容仅供参考。
