跳转到内容

Manifest · 清单成员

categories 清单成员

发布于 更新于

categories 是一个字符串数组,列出 Web 应用所属的商店分区,例如 "productivity" 或 "games"。W3C Application Information 注册表把它定义为给目录和商店的提示;浏览器引擎会解析 该成员,但应用的安装、启动与渲染方式不会因它发生任何变化。

由于引擎内部没有任何环节消费它,browser-compat-data 没有为任何浏览器记录支持版本(BCD html.manifest.categories)。Chromium 的清单解析器(manifest_parser.cc)接受该成员并把每个 字符串转为小写;Firefox 157 与 Safari 27 解析后直接丢弃。真正的消费者是分发渠道:PWABuilder 这类商店打包工具在生成 Microsoft Store 或 Play Store 封装的列表元数据时会读取这个数组。

  • 类型:字符串数组。注册表公布了一组已知值:business、education、entertainment、 finance、fitness、food、games、government、health、kids、lifestyle、 magazines、medical、music、navigation、news、personalization、photo、 politics、productivity、security、shopping、social、sports、travel、 utilities 与 weather。其他字符串也合法;商店会把它们映射到自己的分类体系或忽略。
  • 默认值:空数组。找不到可用分类的商店会自行归类。
  • 示例值:["food", "health", "lifestyle"]。

值的比较不区分大小写:注册表要求作者写小写,Chromium 解析器在存储前也会把每一项转为小写。 值不是数组时,解析器用通用的类型提示 property 'categories' ignored, type array expected. 丢弃它,清单的其余部分不受影响。

该成员在两个方向上都只是建议。商店可以把应用列在清单没有提到的分区下;清单列出的分类也不会 出现在已安装应用或浏览器安装对话框的任何位置。

该成员只是声明,没有运行时表面,所以示例覆盖的是怎么写、以及怎么检查上线的值。

一款膳食规划应用适合不止一个分区。列出三个分类,支持多分类列表的商店可以把它放进每一个分区; 只支持单一分类的商店取它认得的第一个。

{
"name": "Meal Planner",
"short_name": "Meals",
"start_url": "/",
"display": "standalone",
"categories": ["food", "health", "lifestyle"]
}

把最贴切的分类放在第一位:必须选出唯一主分类的打包工具没有别的依据可用。

没有任何 API 能报告浏览器或商店是否采用了该成员,所以有用的检查是在构建或测试阶段对将要部署的 清单做断言。下面的函数按 Chromium 解析器的方式归一化数组,并标出注册表已知列表之外的值。

const KNOWN = new Set([
'business', 'education', 'entertainment', 'finance', 'fitness', 'food', 'games',
'government', 'health', 'kids', 'lifestyle', 'magazines', 'medical', 'music',
'navigation', 'news', 'personalization', 'photo', 'politics', 'productivity',
'security', 'shopping', 'social', 'sports', 'travel', 'utilities', 'weather',
]);
export function checkCategories(manifest) {
const raw = manifest.categories;
if (raw === undefined) return { declared: [], unknown: [] }; // 可选成员
if (!Array.isArray(raw)) throw new Error("categories must be an array of strings");
const declared = raw.map((c) => String(c).toLowerCase());
const unknown = declared.filter((c) => !KNOWN.has(c));
return { declared, unknown };
}

缺少该成员的清单是合法的,所以函数返回空列表而不是失败;未知值只报告、不拒绝,因为商店接受 自由格式的字符串。

对于镜像商店元数据的设置页或“关于”页,可以抓取文档链接的清单并读取数组。回退分支处理没有 清单链接的页面。

async function declaredCategories() {
const link = document.querySelector('link[rel="manifest"]');
if (!link) return []; // 该文档没有链接清单
const manifest = await fetch(link.href).then((r) => r.json());
return Array.isArray(manifest.categories) ? manifest.categories : [];
}

它只能确认站点声明了什么,不能说明商店是否真的把应用列在了那些分区下。

规范

规范状态
Web 应用清单:categoriesW3C 草案
  • 图例
  • 支持
  • 部分支持
  • 需开启标志
  • 不支持
  • 未知
浏览器 / 平台支持版本置信度来源备注
Chrome (Desktop)— 不适用—中来源1
Chrome (Android)— 不适用—中来源2
Edge (Desktop)— 不适用—中来源3
Samsung Internet— 不适用—中来源4
Firefox (Desktop)— 不适用—中来源5
Safari (iOS)— 不适用—中来源6
  1. 不适用:categories 是安装 / 分发渠道读取的应用商店元数据,浏览器引擎本身从不渲染或处理它。
  2. 不适用:categories 是安装 / 分发渠道读取的应用商店元数据,浏览器引擎本身从不渲染或处理它。
  3. 不适用:categories 是安装 / 分发渠道读取的应用商店元数据,浏览器引擎本身从不渲染或处理它。
  4. 不适用:categories 是安装 / 分发渠道读取的应用商店元数据,浏览器引擎本身从不渲染或处理它。
  5. 不适用:categories 是安装 / 分发渠道读取的应用商店元数据,浏览器引擎本身从不渲染或处理它。
  6. 不适用:categories 是安装 / 分发渠道读取的应用商店元数据,浏览器引擎本身从不渲染或处理它。

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

来源: 规范 · MDN · 最近核验 2026-09-04 · 置信度: 中 (由来源计算)