# Manifest categories

> categories 清单成员列出 productivity、games 这类分类，帮助用户在应用商店和其他目录中发现你的 Web 应用。

import CompatTable from '@components/CompatTable.astro';

按 MDN，`categories` 清单成员"让你为自己的 Web 应用指定一个或多个分类"，而"这些分类有助于
用户在应用商店中发现你的应用"。定义该成员的 W3C Application Information 注册表把它称为"一个
字符串数组，描述该 Web 应用所属的应用分类……它的用意是作为一个提示，供列出 Web 应用的目录或
商店使用"。

## 支持情况

MDN 把结论说得很直接："`categories` 清单成员是应用商店在发布和列出 Web 应用时使用的，所以浏
览器兼容性并不适用。虽然浏览器可能会解析这个成员，但它是可选的，并不影响应用的功能或呈现。"

<CompatTable feature="manifest-categories" />

这与该注册表对成员的归类是一致的。注册表中的成员"被归类为补充性（supplementary），因为它们不
会在运行时被应用到 Web 应用上（也就是说，它们纯粹是建议性的，不影响用户代理如何呈现一个已安
装的 Web 应用）"。

## 如何使用

按 MDN，它的值是"一个以逗号分隔的字符串数组，其中每个字符串代表一个分类名称"，并且"这些字符
串应当使用小写"。注册表同样写道："鼓励清单作者使用小写。"

MDN 的示例为一个备餐应用做了分类：

```json
{
  "name": "Meal Planner",
  "categories": ["food", "health", "lifestyle"]
}
```

关于取值词表，MDN 指出"W3C 维护着一份标准化分类列表，其中包含 `business`、`education`、
`entertainment`、`finance`、`games`、`productivity` 等常见取值"。MDN 也提示了何时该写多个：
"如果你的应用服务于多种用途，指定多个相关分类可以帮助用户在应用商店的不同板块中发现你的应
用。"

## 如何在运行时检测

没有可供检测的运行时效果。按 MDN，`categories`"是补充性元数据，不影响应用的运行时行为，也不
影响浏览器如何呈现应用"，它的"取值仅在应用商店和其他分发平台中使用，对浏览器或已安装应用中
的用户不可见"。

真正值得检查的是你实际写进去的值——对着你手上已有的清单对象，在构建步骤、测试或评审脚本里
检查。MDN 把该成员描述为可选，所以"没有值"是检查必须处理的一种合法状态，而不是错误：

```js
// 从你手上已有的清单对象中归一化已声明的分类。
function declaredCategories(manifest) {
  const categories = manifest?.categories;
  if (!Array.isArray(categories) || categories.length === 0) {
    // 缺失或为空：MDN 把该成员记录为可选，所以这是合法的清单。
    // 报告"未声明"，并把分类交给商店去做。
    return [];
  }
  // MDN：这些字符串应当使用小写。
  return categories.map((category) => String(category).toLowerCase());
}
```

## 实践清单

- [ ] 预期这是尽力而为的匹配，而不是保证。按注册表，目录和商店"会尽力去寻找合适的分类（或某
      个分类）来列出该 Web 应用"，但"就像搜索引擎与 meta 关键词那样，目录和商店并没有义务遵
      循这个提示"。
- [ ] 为商店自己的分类体系留出余地。按 MDN，"如果没有指定 `categories`，或者所指定的取值未被
      采用，应用商店会依据它们自己的分类体系来为你的 Web 应用归类"。
- [ ] 不要以为用户看到的就是你写的那些字符串。MDN 的提示是："`categories` 成员是可选的，而应
      用商店在呈现你的应用时可能使用不同的取值。"
- [ ] 使用小写。MDN 与注册表都明确这样说。
- [ ] 不要用它来驱动应用内行为：按 MDN，该成员"并不影响应用的功能或呈现"；按注册表，补充性成
      员"不会在运行时被应用到 Web 应用上"。
- [ ] 如果你希望某个分类能在商店列表中被发现，请记住那才是它触达的界面——MDN 的截图显示该分类
      出现在应用商店的"CHART"字段中，以及 Information 板块中一个专门的"Category"字段里。

## 延伸阅读

- [Web App Manifest：categories 支持情况](/zh/compatibility/manifest-categories/)——该成员的
  兼容性条目。
- [Manifest description](/zh/reference/manifest/description/)——同一注册表定义的另一个补充性
  成员。
- [Manifest screenshots](/zh/reference/manifest/screenshots/)——同一注册表定义的又一个面向商
  店列表的成员。