mcpField
A
asc-new-app-release

asc-new-app-release

github.com/tddworks开发576 次安装6 周前更新
代码仓库

关于 asc-new-app-release

面向开发者的工作流技能,用于将全新的 iOS 或 macOS 应用首次提交至 App Store。通过 asc 命令行涵盖应用设置、元数据、合规、构建上传、就绪检查和提交。

主要功能

  1. 01注册 Bundle ID 并创建应用
  2. 02商店元数据与本地化
  3. 03定价、隐私与合规步骤
  4. 04归档并上传构建版本
  5. 05就绪检查与提交

适用场景

  1. 01在 App Store Connect 注册首个应用
  2. 02准备商店页面和审核资料
  3. 03上传并关联首个构建版本
  4. 04提交审核前检查要求

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/tddworks/asc-cli-skills --skill asc-new-app-release

安装后在 Claude Code 中输入/asc-new-app-release确认已加载。

附带文件references/categories.md

详细介绍

首次发布到 App Store

此工作流会将一个全新的应用从零开始推进到提交至 App Store。它会处理常规发布工作流(asc-release-workflow)不会处理的所有事项——仅在首次提交时进行的一次性设置。

开始之前

向用户收集以下信息(或从项目中获取):

信息查找位置示例
Bundle IDXcode 项目或 .xcconfigcom.mycompany.myapp
应用名称用户希望在 App Store 上使用的名称My Cool App
平台iOS、macOS 或两者ios
类别参见类别参考EDUCATION
描述由用户提供或由你起草功能列表段落
支持 URLGitHub 仓库、网站等https://github.com/...
定价免费或付费免费
SKU唯一字符串(如未提供则生成)myapp-ios-2026

工作流概览

Phase 1: Identity        → Bundle ID + App creation
Phase 2: Metadata        → Category, description, keywords, URLs
Phase 3: Compliance      → Age rating, pricing, privacy labels, review contact
Phase 4: Build           → Archive, upload, link to version
Phase 5: Readiness       → Check all requirements, fix gaps
Phase 6: Submit          → Submit for App Review

阶段 1:身份信息

步骤 1.1:注册 Bundle ID

检查 Bundle ID 是否已存在:

asc bundle-ids list

如果不存在,则注册:

asc bundle-ids create \
  --name "<APP_NAME>" \
  --identifier "<BUNDLE_ID>" \
  --platform IOS   # or UNIVERSAL for iOS + macOS
步骤 1.2:在 App Store Connect 上创建应用

使用 iris API(通过 Web 会话访问的私有 API),因为它可以通过一次调用创建应用、版本和本地化信息:

asc iris apps create \
  --name "<APP_NAME>" \
  --bundle-id "<BUNDLE_ID>" \
  --sku "<SKU>"

保存返回的 App ID——后续每条命令都会用到它。

如果名称已被占用(返回带有 DUPLICATE.DIFFERENT_ACCOUNT 的 409 错误),请让用户提供其他名称。常见的解决办法:添加“App”、“Studio”、“AI”或其他有辨识度的词。

如果 iris 不可用(没有 Web 会话),则改用 REST API:

# This requires the bundle ID to already be registered
asc apps create \
  --name "<APP_NAME>" \
  --bundle-id-id "<BUNDLE_ID_RESOURCE_ID>" \
  --sku "<SKU>" \
  --primary-locale "en-US"
步骤 1.3:验证应用并获取 ID
# Get app info ID (needed for categories, localizations)
asc app-infos list --app-id <APP_ID>
# Save: APP_INFO_ID

# Get version ID (needed for screenshots, build linking)
asc versions list --app-id <APP_ID>
# Save: VERSION_ID (the one in PREPARE_FOR_SUBMISSION state)

# Get version localization ID (needed for description, keywords)
asc version-localizations list --version-id <VERSION_ID>
# Save: LOCALIZATION_ID

阶段 2:元数据

步骤 2.1:设置类别

询问用户最适合的类别。完整列表请参见类别参考。

asc app-infos update \
  --app-info-id <APP_INFO_ID> \
  --primary-category <CATEGORY>

常见类别:EDUCATION、DEVELOPER_TOOLS、PRODUCTIVITY、UTILITIES、BUSINESS、ENTERTAINMENT、PHOTO_AND_VIDEO。

步骤 2.2:设置版本元数据

填写描述、关键词和 URL:

asc version-localizations update \
  --localization-id <LOCALIZATION_ID> \
  --description "<DESCRIPTION>" \
  --keywords "<COMMA_SEPARATED_KEYWORDS>" \
  --support-url "<SUPPORT_URL>" \
  --marketing-url "<MARKETING_URL>"

描述提示:

  • 第一行是吸引用户的亮点——要写得引人入胜
  • 用项目符号列出 5-7 项主要功能(使用 •)
  • 控制在 4000 个字符以内
  • 不要包含定价信息或竞品名称

关键词提示:

  • 总长度最多 100 个字符,以逗号分隔
  • 不要重复应用名称(它已经会被索引)
  • 使用单数形式(例如使用“photo”,而不是“photos”)
  • 以 8-12 个关键词为宜

注意: 首个版本不要设置 --whats-new——Apple 不允许这样做。该字段仅用于更新。

步骤 2.3:设置应用级元数据(可选)

副标题和隐私政策 URL 设置在应用信息的本地化内容中(而非版本中):

# List app info localizations
asc app-info-localizations list --app-info-id <APP_INFO_ID>
# Save: APP_INFO_LOC_ID

# Update subtitle and privacy URL
asc app-info-localizations update \
  --localization-id <APP_INFO_LOC_ID> \
  --subtitle "<SHORT_SUBTITLE>" \
  --privacy-policy-url "<PRIVACY_POLICY_URL>"

阶段 3:合规性

步骤 3.1:年龄分级

默认年龄分级(NONE = 4+)通常适用于工具类/效率类应用。请确认:

asc age-rating get --app-info-id <APP_INFO_ID>

如果应用包含成熟内容,请更新分级:

asc age-rating update --declaration-id <APP_INFO_ID> \
  --age-rating-override SEVENTEEN_PLUS
步骤 3.2:定价、可用性和内容权利

应用设置好价格之前,提交会被拒绝;新应用也无法在设置好可用性之前于任何地区销售。询问用户定价(如果应用通过 App 内购买或订阅获得收入,通常选择免费),以及销售地区(通常选择所有地区)。

# Price: pick a point in the base territory; Apple equalizes the rest. customerPrice 0.0 = Free.
FREE=$(asc apps price-points list --app-id <APP_ID> | jq -r '.data[] | select(.customerPrice == "0.0") | .id')
asc apps prices set --app-id <APP_ID> --base-territory USA --price-point-id "$FREE"

# Availability (App Store Connect's "Set Up Availability")
asc app-availability create --app-id <APP_ID> --all-territories --available-in-new-territories

# Content rights — a legal declaration, so ask the user which is true
asc apps update --app-id <APP_ID> --content-rights-declaration DOES_NOT_USE_THIRD_PARTY_CONTENT   # or USES_THIRD_PARTY_CONTENT

发布前,所有地区均显示 CANNOT_SELL + AVAILABLE_FOR_SALE_UNRELEASED_APP;这是预期情况。

步骤 3.3:审核联系信息
asc version-review-detail update \
  --version-id <VERSION_ID> \
  --contact-email "<EMAIL>" \
  --contact-phone "<PHONE>"

向用户询问联系邮箱和电话号码。App Review 需要这些信息,以便在有疑问时联系用户。

步骤 3.4:隐私营养标签

App 隐私问答没有公开的 App Store Connect API,只能在 App Store Connect 网页中发布(或通过网页会话发布)。发布前,提交会因“您必须已发布有关 App 数据使用情况的问答”而被拒绝。

如果 App 不会收集任何用户数据,请告知用户:App Store Connect > App > App 隐私 > 开始使用 >“否,我们不会收集此 App 的数据”> 发布。

如果 App 会收集数据,请逐一确认每种数据类型。类别请参阅 Apple 隐私文档。


阶段 4:构建

步骤 4.1:归档并上传
# Get the next build number
BUILD_NUMBER=$(asc builds next-number \
  --app-id <APP_ID> \
  --version <VERSION_STRING> \
  --platform <PLATFORM>)

# Archive + upload in one step
asc builds archive \
  --scheme <SCHEME> \
  --platform <PLATFORM> \
  --signing-style automatic \
  --team-id <TEAM_ID> \
  --upload \
  --app-id <APP_ID> \
  --version <VERSION_STRING> \
  --build-number "$BUILD_NUMBER"

如果用户已经有 IPA/PKG:

asc builds upload \
  --app-id <APP_ID> \
  --file <PATH_TO_IPA> \
  --version <VERSION_STRING> \
  --build-number "$BUILD_NUMBER" \
  --wait
步骤 4.2:等待处理
asc builds uploads get --upload-id <UPLOAD_ID>

轮询,直到 state 为 COMPLETE。常见失败原因:

  • 缺少图标 → 修复资源目录
  • 缺少权利 → macOS 需要 App Sandbox
  • CFBundleVersion 不匹配 → 二进制文件中的构建号必须匹配
步骤 4.3:将构建版本关联到版本
# Find the build (match by build number)
asc builds list --app-id <APP_ID>

# Link to the version
asc versions set-build \
  --version-id <VERSION_ID> \
  --build-id <BUILD_ID>

阶段 5:就绪情况检查

asc versions check-readiness --version-id <VERSION_ID>

仔细检查输出。首次提交的 App 常见的缺失项:

检查项可能的状态修复方法
stateCheck通过应为 PREPARE_FOR_SUBMISSION
buildCheck尚未上传时失败上传并关联一个构建版本(阶段 4)
pricingCheck失败asc apps prices set(步骤 3.2)
reviewContactCheck失败asc version-review-detail update(步骤 3.3)
localizationCheck缺少屏幕截图时失败上传屏幕截图
screenshotSetCount: 0失败每种设备至少需要一个屏幕截图集
屏幕截图

首次提交必须提供屏幕截图。如果用户有屏幕截图技能或自动化工具:

# Create screenshot set for a device
asc screenshot-sets create \
  --localization-id <LOCALIZATION_ID> \
  --display-type APP_IPHONE_67

# Upload screenshot
asc screenshots create \
  --screenshot-set-id <SET_ID> \
  --file <PATH_TO_SCREENSHOT>

所需的显示类型取决于平台。iOS 至少需要:

  • APP_IPHONE_67(6.7" — iPhone Pro Max)
  • APP_IPHONE_61(6.1" — iPhone Pro)— 可由 6.7" 的屏幕截图生成

macOS:APP_DESKTOP


阶段 6:提交

当 isReadyToSubmit 为 true 时:

新 App 的 App 内购买项目和订阅属于首次上架产品,因此必须随此版本一并送审。先预览并与用户确认,然后提交:

asc versions submit --version-id <VERSION_ID> --with-products --dry-run --output table
asc versions submit --version-id <VERSION_ID> --with-products

检查试运行列表中是否包含用户预期的所有产品——仍处于 MISSING_METADATA 状态的产品不会包含在内。如果 Apple 拒绝提交,错误信息会列出每个原因(缺少设备屏幕截图、内容权利、App 隐私问答、定价);请参阅 submit-with-products.md。

告知用户:“您的 App 已提交审核!Apple 通常会在 24-48 小时内完成审核。获批(或有问题需要处理)时,您会收到电子邮件通知。”


快速参考:完整命令序列

适用于不收集数据的免费 iOS App:

# 1. Register bundle ID
asc bundle-ids create --name "My App" --identifier "com.me.myapp" --platform IOS

# 2. Create app
asc iris apps create --name "My App" --bundle-id "com.me.myapp" --sku "myapp-2026"
# → APP_ID

# 3. Get IDs
asc app-infos list --app-id $APP_ID           # → APP_INFO_ID
asc versions list --app-id $APP_ID             # → VERSION_ID
asc version-localizations list --version-id $VERSION_ID  # → LOC_ID

# 4. Category
asc app-infos update --app-info-id $APP_INFO_ID --primary-category EDUCATION

# 5. Description + keywords
asc version-localizations update --localization-id $LOC_ID \
  --description "..." --keywords "..." --support-url "..." --marketing-url "..."

# 5b. Price (free), availability, content rights — App Privacy is published in the web UI
FREE=$(asc apps price-points list --app-id $APP_ID | jq -r '.data[] | select(.customerPrice == "0.0") | .id')
asc apps prices set --app-id $APP_ID --base-territory USA --price-point-id "$FREE"
asc app-availability create --app-id $APP_ID --all-territories --available-in-new-territories
asc apps update --app-id $APP_ID --content-rights-declaration DOES_NOT_USE_THIRD_PARTY_CONTENT

# 6. Review contact
asc version-review-detail update --version-id $VERSION_ID \
  --contact-email "[email protected]" --contact-phone "+1-555-0100"

# 7. Archive + upload
BUILD=$(asc builds next-number --app-id $APP_ID --version 1.0 --platform IOS)
asc builds archive --scheme MyApp --platform ios --signing-style automatic \
  --team-id XXXXXXXXXX --upload --app-id $APP_ID --version 1.0 --build-number $BUILD

# 8. Link build
asc versions set-build --version-id $VERSION_ID --build-id $BUILD_ID

# 9. Check readiness
asc versions check-readiness --version-id $VERSION_ID

# 10. Submit, with any in-app purchases and subscriptions (first-time products)
asc versions submit --version-id $VERSION_ID --with-products --dry-run
asc versions submit --version-id $VERSION_ID --with-products

评论

支持 Markdown