App Store 关键词:100 字节还是 100 个字符?

更新于 · LocalePilot

App Store Connect 的关键词字段限制为 100……字节还是字符,取决于你读的是哪个 Apple 页面。对于英文关键词列表,两者没有区别;对于法语、中文、日语或泰语,区别很大。

赶时间?直接在浏览器中按字节统计你的关键词:免费,无需注册,不上传任何内容。

Apple 怎么说(以及大家观察到了什么)

问题听起来简单,Apple 自己的页面却说法不一:

  • App Store Connect 参考文档对关键词字段的描述是:“You can provide up to 100 bytes of content.”(最多可提供 100 字节的内容。)字节。
  • Creating Your Product Page(打造产品页面)一页说的是 100 个字符。
  • 在 2022 年的开发者论坛上,一位 Apple 团队成员通过 API 测试了泰语关键词:100 个字符可以通过,106 个则被拒绝。而 100 个泰文字符远远超过 100 字节。

也就是说,参考文档写的是字节,而至少有一次观察表明实际按字符计算。在 Apple 给出定论之前,你必须选择一条规则。

为什么这个区别很重要

在 UTF-8 中,不带重音的拉丁字母占 1 个字节,重音字母占 2 个字节,中文、日文或泰文字符占 3 个字节。

关键词字符数字节数
shopping88
épicerie89
supermarché1112
Einkaufsliste1313
购物清单412
買い物リスト618
รายการ618

英语不存在这个问题。法语或西班牙语一整个列表也只差几个字节。中文、日语或泰语如果按字节计算,同一个字段只能容纳三分之一的文字:100 字节最多放 33 个汉字。这时选哪条规则,结果就大不一样。

自己动手统计

在终端中对你的 fastlane 文件执行以下命令($(cat …) 会去掉末尾的换行符):

printf '%s' "$(cat fastlane/metadata/fr-FR/keywords.txt)" | wc -c   # bytes
printf '%s' "$(cat fastlane/metadata/fr-FR/keywords.txt)" | wc -m   # characters

wc -m 按终端的 locale 统计字符;如果 locale 不是 UTF-8,它返回的数字与 wc -c 相同。在 Dart 中:

import 'dart:convert';

final keywords = 'courses,épicerie,liste,famille,partagée';
print(utf8.encode(keywords).length); // 41 bytes
print(keywords.runes.length);        // 39 characters

我们采用的规则

按字节计算。这是参考文档的说法,也是最严格的选项:不超过 100 字节的字段必然不超过 100 个字符,因此绝不会被拒绝。LocalePilot 的 App Store 商店页面界面采用这条规则,输入时会显示例如“94 / 100 字节”。

这样做对中文、日语、韩语或泰语确实有代价:可能有一部分空间用不上。如果这些市场对你很重要,可以在 App Store Connect 中尝试更长的列表:超长的字段会被立即拒绝,这样你就能知道目前实际能通过多少。

与单位无关的建议

  • 用逗号分隔,逗号前后不加空格。逗号后的每个空格都会白白占用 1 个字节。
  • 不要重复名称和副标题中的词。大多数 ASO 指南都不建议在关键词中重复这两个字段已经包含的内容。
  • 每种语言一个文件。使用 fastlane 时,每个本地化都有自己的 fastlane/metadata/<locale>/keywords.txt。逐字翻译英文列表,很少能得到用户实际搜索的词:请从目标语言的搜索习惯出发。

常见问题

一个中文字符或重音字母占多少字节?

在 UTF-8 中,重音字母(é、è、à、ç 等)占 2 个字节;中文、日文或泰文字符占 3 个字节。

逗号后面要加空格吗?

不要:关键词之间只用逗号分隔,不加空格,每个空格都会占用空间。

使用 fastlane 时,关键词文件在哪里?

在 fastlane/metadata/<locale>/keywords.txt 中,每种语言一个文件(简体中文为 zh-Hans)。