跳转到内容

Manifest · 清单成员

id 清单成员

发布于

有限可用不支持的浏览器: Firefox (Desktop)、Firefox (Android)W3C

id 是标识 Web 应用的字符串。在这个成员出现之前,各浏览器从别的东西推导身份,通常是 start_url,于是改动启动 URL 就让清单变成了另一个应用,之后的安装会与旧的并存。设置 id 后, 身份与启动 URL 是两个独立的值:start_url 可以搬动,身份保持不变。

Chrome 96、Edge 96、Samsung Internet 17.0、iOS 上的 Safari 16.4 以及 macOS 上的 Safari 17 处理该 成员(BCD html.manifest.id)。Firefox 157 能解析它但不起作用,因为桌面版 Firefox 不从清单安装 Web 应用。忽略 id 的浏览器沿用原先的身份规则,所以加上该成员不会破坏其他平台上的安装。

  • 类型:字符串,相对 start_url 的源按 URL 解析。解析到其他源的值会被拒绝;Chromium 记录 property 'id' ignored, should be same origin as document. 并退回默认值。
  • 默认值:解析后的 start_url。id 缺失、为空或无法解析时,身份就与启动 URL 绑在一起,而这 正是该成员要避免的情况。
  • 示例值:"/?homescreen=1",对 https://example.com 上的应用解析为 https://example.com/?homescreen=1。

处理清单时,解析后的值会与每个已安装应用的身份比较。匹配意味着“更新这个应用”;不匹配意味着“新 应用”。比较的是完整解析后的 URL,所以 "/" 与 "/?v=2" 是两个不同的应用,值应当选定一次后不再 动。Chromium 对已安装应用每天检查一次更新,多数字段的改动要等该应用的所有窗口关闭后才应用 (web.dev,“How Chrome handles updates to the web app manifest”);只有 id 存在且未变时,改动 start_url 才会被当作更新接受。

navigator.getInstalledRelatedApps() 读不到 id:它报告相关的原生应用,以及(Chrome 80+)在 related_applications 中以 platform: "webapp" 列出的 PWA,匹配依据是清单 URL 而不是 id。

下面的清单依次展示首次发布前该选什么值、id 让哪种改动变得安全,以及如何为一个没带 id 就发布 的应用找回身份。

一个短的根相对路径就够了;该成员相对 start_url 的源解析,写上协议和主机没有意义。启动 URL 带 着一个分析参数,以后可以改而不触及身份。

{
"name": "Ledger",
"id": "/",
"start_url": "/app/?source=pwa",
"scope": "/app/",
"display": "standalone"
}

Chrome 96+ 与 Safari 16.4+ 把身份记录为 https://example.com/;之后一份 "start_url": "/dashboard/?source=pwa" 的清单会更新已安装的应用,而不是再装一个。

身份固定后,改动启动路径的改版只需编辑 start_url 与 scope。身份那一行是不能动的。

{
"name": "Ledger",
"id": "/",
"start_url": "/home/",
"scope": "/",
"display": "standalone"
}

在 Chrome 155 上,已安装应用在下一次每日清单检查时拿到新的 start_url,并在最后一个应用窗口关闭 后应用它;在忽略 id 的浏览器上,只要该浏览器从未以 start_url 作为身份键,同样的改动也能正常 工作。

在声明 id 之前安装的应用,其身份是 Chromium 从 start_url 算出来的。要保住这些安装,把 id 设为 DevTools 显示的那个精确计算值;下面的脚本读取页面链接的清单并打印可供复制的值,清单抓取 失败时给出提示。

async function suggestedId() {
const link = document.querySelector('link[rel="manifest"]');
if (!link || !('fetch' in window)) return null; // 没有可检查的东西。
const manifest = await fetch(link.href).then((r) => r.json()).catch(() => null);
if (!manifest) return null;
if (manifest.id) return new URL(manifest.id, location.origin).href;
return new URL(manifest.start_url ?? '/', link.href).href; // Chromium 的默认身份。
}
const id = await suggestedId();
console.log(id ? `Set "id" to ${new URL(id).pathname + new URL(id).search}` : 'Manifest not readable');

对 "start_url": "/app/?source=pwa",打印出的值是 /app/?source=pwa;把这个字符串声明为 id 就冻结了现有用户已经拥有的身份,此后 start_url 可以自由更改。

规范

规范状态
Web 应用清单:idW3C
Web Application Manifest: start_url memberW3C
  • 图例
  • 支持
  • 部分支持
  • 需开启标志
  • 不支持
  • 未知
浏览器 / 平台支持版本置信度来源备注
Chrome (Desktop)支持96高来源—
Chrome (Android)支持96高来源1
Edge (Desktop)支持96高来源2
Firefox (Desktop)不支持—高来源3
Firefox (Android)不支持—高来源4
Safari (macOS)支持17高来源—
Safari (iOS)支持16.4高来源—
Samsung Internet支持17.0高来源5
WebView (Android)支持96高来源6
  1. 由 browser-compat-data 镜像自 Chrome 的数据推导。
  2. 由 browser-compat-data 镜像自 Chrome 的数据推导。
  3. 该属性可以解析,但没有任何效果。
  4. browser-compat-data 未记录 Firefox for Android 的支持。
  5. 由 browser-compat-data 镜像自 Chrome Android 的数据推导。
  6. 由 browser-compat-data 镜像自 Chrome Android 的数据推导。

源数据: /compatibility/manifest-id.json · 全球使用占比: 90 % (StatCounter 2026-05)

来源: 规范 · MDN · 最近核验 2026-10-03 · 置信度: 高 (由来源计算)