后端与接口
用 asc 批量本地化 App Store…
当需要在 App Store Connect 的多个语言区域批量创建或更新订阅、订阅组和内购的显示名称(及描述)时,用 asc 命令行替代手动逐语言点击。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 59/100 ×0.15
适用场景
用 asc 批量本地化 App Stor特定
解决思路
- 先配置认证(`asc auth login` 或 `ASC_*` 环境变量),并确认 app ID(`ASC_APP_ID` 或 `--app`),且订阅组和订阅已存在。
- 优先选择 API 4.4.1 的版本作用域资源:所有新的本地化工作都使用 `asc ... versions localizations ...`,不要使用产品级或组级的 v1 本地化命令(已被弃用并会输出迁移警告),也绝不要把产品、订阅或组 ID 传给版本作用域命令。
- 先解析或创建版本:用 `asc iap versions list --iap-id "IAP_ID" --state PREPARE_FOR_SUBMISSION --paginate --output table`、`asc subscriptions versions list --subscription-id "SUB_ID" --state PREPARE_FOR_SUBMISSION --paginate --output table`、`asc subscriptions groups versions list --group-id "GROUP_ID" --state PREPARE_FOR_SUBMISSION --paginate --output table` 分别列出。
- 对每个列表结果独立分支:零匹配则创建,一个匹配则复用该版本 ID,多个匹配则停止并要求用户提供明确的版本 ID。
- 仅在对应列表零匹配时创建版本:`asc iap versions create --iap-id "IAP_ID" --output json`、`asc subscriptions versions create --subscription-id "SUB_ID" --output json`、`asc subscriptions groups versions create --group-id "GROUP_ID" --output json`。
- 注意三个版本族都没有删除命令:列出并复用唯一的 `PREPARE_FOR_SUBMISSION` 版本,仅在零匹配时创建,多匹配时停止;不要假设删除父级会级联清理为测试创建的版本。
- 使用 App Store Connect 支持的本地化区域列表:ar-SA, ca, cs, da, de-DE, el, en-AU, en-CA, en-GB, en-US, es-ES, es-MX, fi, fr-CA, fr-FR, he, hi, hr, hu, id, it, ja, ko, ms, nl-NL, no, pl, pt-BR, pt-PT, ro, ru, sk, sv, th, tr, uk, vi, zh-Hans, zh-Hant。
- 批量本地化订阅版本(v2):先 `asc subscriptions versions localizations list --version-id "VERSION_ID" --paginate --output table` 列出已有本地化,再对缺失区域执行 `asc subscriptions versions localizations create --version-id "VERSION_ID" --locale "LOCALE" --name "Display Name" --description "Description"`,最后再次 list 验证。
- 更新订阅版本本地化:`asc subscriptions versions localizations update --id "LOC_ID" --name "New Name" --description "Updated description"`;不要同时使用值标志和对应的 `--clear-name` 或 `--clear-description`。
- 注意 Apple 线上服务当前拒绝订阅版本本地化的空 `--description` 和 `--clear-description`(描述必须至少一个字符),因此创建缺失的订阅版本本地化必须提供非空描述;仅改显示名称的运行可以更新已有本地化,但在用户提供非空的区域特定或共享回退描述前不得创建缺失区域。
- 批量本地化订阅组版本(v2):`asc subscriptions groups versions localizations list --version-id "VERSION_ID" --paginate --output table`,`asc subscriptions groups versions localizations create --version-id "VERSION_ID" --locale "LOCALE" --name "Group Display Name" --custom-app-name "My App"`,`asc subscriptions groups versions localizations update --id "LOC_ID" --name "Updated Group Display Name" --custom-app-name "My App"`,最后再次 list 验证。
- 清除元数据是单独的显式操作:确认用户想移除已有 custom app name 后,运行 `asc subscriptions groups versions localizations update --id "LOC_ID" --clear-custom-app-name`;标准批量本地化流程中不要包含 `--clear-name` 或 `--clear-custom-app-name`,仅在确实需要 JSON `null` 时使用,省略标志则保持该属性不变。
- 批量本地化 IAP 版本(v2):`asc iap versions localizations list --version-id "VERSION_ID" --paginate --output table`,`asc iap versions localizations create --version-id "VERSION_ID" --locale "LOCALE" --name "Display Name" --description "Description"`,`asc iap versions localizations update --localization-id "LOC_ID" --description "Updated description"`,最后再次 list 验证。
- 注意 Apple 线上服务同样拒绝 IAP 版本本地化的空描述和 `--clear-description`(尽管 4.4.1 schema 允许 JSON `null`);与订阅一样,仅改显示名称的运行可以更新已有 IAP 本地化,但在有非空描述前不得创建缺失区域。
- 批量本地化 app 内所有订阅版本:先用 `asc subscriptions groups list --app "APP_ID" --paginate --output json` 和 `asc subscriptions groups versions list --group-id "GROUP_ID" --state PREPARE_FOR_SUBMISSION --paginate --output json` 列出组并解析每个组唯一的可变版本,再对每个组版本执行 list 和 create;然后用 `asc subscriptions list --group-id "GROUP_ID" --paginate --output json` 和 `asc subscriptions versions list --subscription-id "SUB_ID" --state PREPARE_FOR_SUBMISSION --paginate --output json` 列出订阅并解析每个订阅唯一的可变版本,再对每个订阅版本执行 list 和 create。
- 对每个版本列表应用零/一/多规则:零匹配创建版本,一个匹配复用,多个匹配停止并要求明确 ID。
- 只使用版本作用域的 v2 资源进行新的本地化工作,并始终把版本 ID 与产品、订阅、组 ID 分开。
- 始终先列出已有本地化以避免重复创建错误;对缺失区域执行创建,对已有但值不同的本地化按解析出的 ID 执行更新,值已匹配则不做任何操作。
- 当用户只提供一个显示名称时,对所有区域使用同一名称;当用户提供各区域翻译名称时,按区域使用对应名称。
- 对订阅版本和 IAP 版本本地化,每次创建都要求非空 `--description`;若用户只提供显示名称,则按解析出的 ID 更新已有本地化,跳过缺失区域的创建,并在创建前询问区域特定描述或一个非空回退描述。
- 更新已有的订阅版本或 IAP 版本本地化时,除非用户提供了新的非空值,否则省略 `--description`;绝不推断为空值或清除它。
- 订阅组版本本地化没有描述字段:正常创建或更新其名称,仅在用户提供该值时使用 `--custom-app-name`。
- 验证步骤使用 `--output table` 以便用户目视确认;中间自动化步骤使用显式 `--output json`(输出默认值会感知 TTY)。
- 批量写入后始终运行 list 命令验证完整性。
- 对于订阅很多的 app,按组顺序逐个处理以保持输出可读。
- 如果某个区域的 create 或 update 调用失败,记录该区域和错误,然后继续处理剩余区域;批次完成后统一报告所有失败,便于用户处理。
- 注意订阅显示名称是用户在订阅管理页和购买对话框中看到的名称;为已存在的区域创建本地化会失败,因此先 list,需要变更时更新解析出的 ID;没有批量 API,每个区域都需要单独的 create 调用;list 命令使用 `--paginate` 确保返回所有已有本地化;如果只有 app 名称而没有 ID,使用 `asc-id-resolver` 技能。
适用边界 · 注意事项
- 未配置 asc 认证或不知道 app ID、订阅组/订阅尚未存在时。
- 仍在使用已弃用的产品级或组级 v1 本地化命令,或把产品/订阅/组 ID 传给版本作用域命令时。
- 用户只提供显示名称却需要创建订阅或 IAP 版本本地化、且无法提供非空描述(区域特定或共享回退)时。