axiom-app-store-ref by charleswiltgen/axiom
npx skills add https://github.com/charleswiltgen/axiom --skill axiom-app-store-refApp Store 提交要求的完整参考:
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
| 术语 | 定义 |
|---|---|
| App Store Connect | 用于管理应用元数据、构建版本、定价、TestFlight 和分析的 Web 门户和 API |
| App Review | Apple 的人工审核流程,根据 App Review 指南评估每个应用更新 |
| Privacy Manifest | PrivacyInfo.xcprivacy 文件,声明数据收集、跟踪域名和必需原因 API 的使用情况 |
| Required Reason API | 需要声明使用原因的系统 API(文件时间戳、磁盘空间、用户默认设置等) |
| Privacy Nutrition Label | App Store 隐私卡片,显示您的应用收集哪些数据以及如何使用 |
| DSA Trader Status | 欧盟数字服务法案分类,确定您是否是向欧盟消费者销售的"交易者" |
| Build String | 每个上传构建版本的唯一标识符(例如 "1.2.3.4"),与版本号分开 |
| Bundle ID | 反向域名标识符(例如 "com.company.app"),在 Apple 生态系统中唯一标识您的应用 |
| 字段 | 必需 | 可本地化 | 最大长度 | 备注 |
|---|---|---|---|---|
| App Name | 是 | 是 | 30 字符 | 在 App Store 上必须唯一 |
| Subtitle | 否 | 是 | 30 字符 | 在搜索结果中显示在应用名称下方 |
| Description | 是 | 是 | 4000 字符 | 纯文本,无 HTML 或富格式 |
| Promotional Text | 否 | 是 | 170 字符 | 无需新提交即可编辑 |
| Keywords | 是 | 是 | 100 字节 | 逗号分隔,每个关键词 >2 字符 |
| What's New | 是* | 是 | 4000 字符 | *除首次版本外,所有版本均需提供 |
| Copyright | 是 | 否 | — | 格式:"YYYY 公司名称" |
| Support URL | 是 | 是 | — | 必须链接到实际联系信息 |
| Marketing URL | 否 | 是 | — | 可选的推广页面 |
| Privacy Policy URL | 是 | 是 | — | HTTPS,可公开访问 |
| 资源 | 必需 | 可本地化 | 规格 |
|---|---|---|---|
| App Icon | 是 | 否 | 1024x1024 PNG,无 alpha 通道,无圆角 |
| Screenshots | 是 | 是 | 按设备尺寸,每种设备每个语言环境 2-10 张 |
| App Preview | 否 | 是 | 每种设备尺寸每个语言环境最多 3 个视频 |
必须为您支持的每种设备尺寸提供截图:
| 设备 | 必需尺寸(纵向) | 必需尺寸(横向) |
|---|---|---|
| iPhone 6.9" | 1320 x 2868 | 2868 x 1320 |
| iPhone 6.7" | 1290 x 2796 | 2796 x 1290 |
| iPhone 6.5" | 1284 x 2778 | 2778 x 1284 |
| iPhone 5.5" | 1242 x 2208 | 2208 x 1242 |
| iPad Pro 13" | 2048 x 2732 | 2732 x 2048 |
| iPad Pro 12.9" | 2048 x 2732 | 2732 x 2048 |
截图必须显示应用的实际使用情况。不允许:仅标题画面、登录屏幕、启动屏幕或其他平台的屏幕。
| 规格 | 要求 |
|---|---|
| Duration | 15-30 秒 |
| Format | H.264, ProRes 422 |
| Audio | 英语或本地化语言;无冒犯性内容 |
| Frame rate | 30 或 60 fps |
| Resolution | 必须与设备的截图尺寸匹配 |
| Content | 必须显示实际应用画面;视频中不允许出现设备边框 |
| Per locale | 每种设备尺寸每个语言环境最多 3 个预览视频 |
| 规格 | 要求 |
|---|---|
| Size | 1024 x 1024 像素 |
| Format | PNG |
| Color space | sRGB 或 P3 |
| Alpha channel | 不允许 |
| Rounded corners | 不允许(系统会自动应用) |
| Layers/transparency | 不允许 |
| Content | 无论应用的实际分级如何,内容必须适合 4+ 分级 |
| 字段 | 必需 | 备注 |
|---|---|---|
| Contact First Name | 是 | 审核员联系人 |
| Contact Last Name | 是 | 审核员联系人 |
| Contact Email | 是 | 必须有人监控 |
| Contact Phone | 是 | 包含国家/地区代码 |
| Notes for Review | 否 | 最多 4000 字节;解释非显而易见的功能 |
| Sign-in Username | 如需登录 | 审核期间不得过期 |
| Sign-in Password | 如需登录 | 审核期间不得过期 |
| Attachment | 否 | 最多 10 个文件,总计最大 512 MB |
| 方面 | 详情 |
|---|---|
| Minimum | 需要主要语言;所有其他本地化可选 |
| Per-locale metadata | 应用名称、副标题、描述、关键词、What's New、截图 |
| Promotional Text | 可本地化且无需新提交即可编辑 |
| Screenshots | 可因语言环境而异(显示本地化 UI) |
| App Previews | 可因语言环境而异(显示本地化音频/UI) |
| URL fields | 支持 URL 和营销 URL 可因语言环境而异 |
本地化时,提供与本地化 UI 匹配的截图。审核员会检查截图是否准确代表每个语言环境中的应用。
| 主要类别 | 次要类别 | 规则 |
|---|---|---|
| Required | Optional | 选择最能描述您应用的类别 |
| Must be accurate | Can complement primary | 不准确的类别是拒绝的理由 (2.3.7) |
| Games have subcategories | — | 游戏还必须选择最多 2 个游戏子类别 |
可用类别:Books, Business, Developer Tools, Education, Entertainment, Finance, Food & Drink, Games, Graphics & Design, Health & Fitness, Lifestyle, Magazines & Newspapers, Medical, Music, Navigation, News, Photo & Video, Productivity, Reference, Shopping, Social Networking, Sports, Travel, Utilities, Weather。
在以下两个位置均需提供:
隐私政策必须说明:
<!-- Top-level keys -->
NSPrivacyTracking <!-- Boolean: Does app track users? -->
NSPrivacyTrackingDomains <!-- Array<String>: Domains used for tracking -->
NSPrivacyCollectedDataTypes <!-- Array<Dictionary>: Data collected -->
NSPrivacyAccessedAPITypes <!-- Array<Dictionary>: Required Reason APIs -->
数组中的每个字典包含:
| 键 | 类型 | 描述 |
|---|---|---|
NSPrivacyCollectedDataType | String | 类别键(例如 "NSPrivacyCollectedDataTypeName") |
NSPrivacyCollectedDataTypePurposes | Array<String> | 此数据类型的用途键 |
NSPrivacyCollectedDataTypeLinked | Boolean | 此数据是否与用户身份关联? |
NSPrivacyCollectedDataTypeTracking | Boolean | 此数据是否用于跟踪? |
数组中的每个字典包含:
| 键 | 类型 | 描述 |
|---|---|---|
NSPrivacyAccessedAPIType | String | API 类别标识符 |
NSPrivacyAccessedAPITypeReasons | Array<String> | 批准的使用原因代码 |
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeEmailAddress</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
</array>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>
| 类别 | 标识符字符串 |
|---|---|
| File timestamp | NSPrivacyAccessedAPICategoryFileTimestamp |
| System boot time | NSPrivacyAccessedAPICategorySystemBootTime |
| Disk space | NSPrivacyAccessedAPICategoryDiskSpace |
| Active keyboard | NSPrivacyAccessedAPICategoryActiveKeyboards |
| User defaults | NSPrivacyAccessedAPICategoryUserDefaults |
Xcode > Product > Archive > Generate Privacy Report
这将生成一个 PDF,总结您的应用和所有嵌入框架的隐私清单。
| 类别 | 涵盖的 API | 常见原因 |
|---|---|---|
| File timestamp | NSFileCreationDate, NSFileModificationDate, NSURLContentModificationDateKey | DDA9.1(向用户显示), C617.1(在应用容器内) |
| System boot time | systemUptime, mach_absolute_time | 35F9.1(测量经过时间) |
| Disk space | NSFileSystemFreeSize, NSFileSystemSize, volumeAvailableCapacityKey | E174.1(写入前检查), 85F4.1(向用户显示) |
| Active keyboard | activeInputModes | 54BD.1(为键盘自定义 UI) |
| User defaults | UserDefaults(所有访问都需要声明) | CA92.1(在应用组内访问), 1C8F.1(在同一应用内访问) |
| 类别 | 示例 |
|---|---|
| Contact Info | 姓名、电子邮件地址、电话号码、物理地址 |
| Health & Fitness | 健康数据、健身数据 |
| Financial Info | 付款信息、信用信息 |
| Location | 精确位置、大致位置 |
| Sensitive Info | 种族或民族数据、性取向、宗教、生物识别数据 |
| Contacts | 通讯录联系人 |
| User Content | 照片、视频、音频、游戏内容、客户支持消息 |
| Browsing History | 网页浏览历史 |
| Search History | 应用内搜索历史 |
| Identifiers | 用户 ID、设备 ID |
| Purchases | 购买历史 |
| Usage Data | 产品交互、广告数据、应用启动、点击、滚动 |
| Diagnostics | 崩溃数据、性能数据 |
| Surroundings | 环境扫描(例如 AR 数据) |
| Body | 手部、头部(例如 visionOS 中的手部追踪) |
| 用途 | 描述 |
|---|---|
| Third-Party Advertising | 显示第三方广告或与广告网络共享 |
| Developer's Advertising/Marketing | 您自己的营销活动 |
| Analytics | 了解用户行为并衡量有效性 |
| Product Personalization | 自定义功能、内容推荐 |
| App Functionality | 应用正常工作所需(例如认证、数据同步) |
| Other | 上述未列出的任何目的 |
"收集" 意味着数据被传输到设备外,并且可访问性超出了服务当前请求所需的范围。仅在设备上处理不属于收集。
"跟踪" 意味着:
如果您的应用根据 Apple 的上述定义进行"跟踪",则需要 ATT。
NSUserTrackingUsageDescription 添加到 Info.plist(解释为什么需要跟踪)ATTrackingManager.requestTrackingAuthorization().authorized — 用户授予跟踪权限.denied — 用户拒绝跟踪;请勿跟踪.notDetermined — 用户尚未被询问.restricted — 设备级限制阻止跟踪在上下文合适的时刻请求,不要在首次启动时请求。
您的应用请求的每个系统权限都必须存在以下 Info.plist 键:
| 权限 | Info.plist 键 |
|---|---|
| Camera | NSCameraUsageDescription |
| Microphone | NSMicrophoneUsageDescription |
| Photo Library (read) | NSPhotoLibraryUsageDescription |
| Photo Library (write) | NSPhotoLibraryAddUsageDescription |
| Location (when in use) | NSLocationWhenInUseUsageDescription |
| Location (always) | NSLocationAlwaysAndWhenInUseUsageDescription |
| Contacts | NSContactsUsageDescription |
| Calendars (full access) | NSCalendarsFullAccessUsageDescription |
| Reminders (full access) | NSRemindersFullAccessUsageDescription |
| Health | NSHealthShareUsageDescription, NSHealthUpdateUsageDescription |
| Motion | NSMotionUsageDescription |
| Bluetooth | NSBluetoothAlwaysUsageDescription |
| Face ID | NSFaceIDUsageDescription |
| Local Network | NSLocalNetworkUsageDescription |
| Tracking | NSUserTrackingUsageDescription |
| Speech Recognition | NSSpeechRecognitionUsageDescription |
| Apple Music | NSAppleMusicUsageDescription |
缺少用途字符串会导致立即被拒。用途字符串文本必须清楚解释在您的应用功能上下文中为什么需要该权限。
Apple 维护了一个需要隐私清单的常用 SDK 列表。从 2024 年春季开始,如果您的应用包含这些没有隐私清单的 SDK,在提交时会被标记。
第三方 SDK 应在其框架包中包含自己的 PrivacyInfo.xcprivacy。聚合隐私报告会合并来自您的应用和嵌入框架的所有清单。
如果第三方 SDK 不包含隐私清单,您必须在应用的隐私清单中声明其数据收集。
有关完整的指南索引(第 1-5 节),请参阅 references/app-review-guidelines.md。
根据 Apple 发布的数据,最常见的被拒原因:
| 排名 | 指南 | 问题 | 预防措施 |
|---|---|---|---|
| 1 | 2.1 | 应用完整性 — 错误、崩溃、占位符内容 | 提交前进行彻底的 QA |
| 2 | 4.3 | 垃圾应用 — 重复应用、千篇一律的模板 | 确保提供真正的独特价值 |
| 3 | 2.3.3 | 截图不准确 | 截图必须与实际应用匹配 |
| 4 | 5.1.1 | 隐私 — 缺少政策或用途字符串 | 完成所有隐私要求 |
| 5 | 4.0 | 设计 — 未达到最低质量标准 | 遵循 HIG,测试所有流程 |
| 6 | 2.5.1 | 私有 API 使用 | 仅使用公共 API |
| 7 | 3.1.1 | 数字商品需要 IAP | 对数字内容使用 IAP |
| 8 | 4.2 | 最低功能 — 应用过于简单 | 提供真正的实用性 |
| 9 | 5.1.1(v) | 缺少账户删除 | 实现完整的账户删除 |
| 10 | 2.3.7 | 应用类别错误 | 选择准确的主要类别 |
| 阶段 | 典型时长 |
|---|---|
| Waiting for Review | 几分钟到几小时 |
| In Review | 几分钟到 24 小时 |
| Total (90th percentile) | 24 小时以内 |
| Total (edge cases) | 最多 7 天 |
| Expedited Review | 当天到 24 小时(如果批准) |
审核时间在节假日和主要 iOS 发布期间会增加。请相应规划提交。
| 分级 | 触发条件 |
|---|---|
| 4+ | 无令人反感的内容 |
| 9+ | 偶尔或轻微:亵渎、卡通/幻想暴力、恐怖/恐惧主题。存在战利品箱 |
| 13+ | 频繁或强烈:亵渎或粗俗幽默。偶尔:酒精/烟草/毒品提及、性内容/裸露、现实暴力 |
| 16+ | 不受限制的网络访问、频繁的医疗/治疗信息、成熟/暗示性主题 |
| 18+ | 频繁或强烈:酒精/烟草/毒品使用、性内容/裸露、现实暴力。包含真实货币元素的模拟赌博 |
| Unrated | 未完成问卷调查的应用无法发布 |
应用必须声明是否包含以下功能:
| 功能 | 何时声明 |
|---|---|
| Messaging/chat | 任何用户之间的应用内消息传递 |
| User-generated content | 用户可以发布、共享或上传其他用户可见的内容 |
| Advertising | 应用显示来自任何广告网络的广告 |
| Parental controls | 应用具有家长限制或家庭功能 |
| Age assurance | 应用验证用户年龄以访问受限内容 |
这些声明与年龄分级一起显示在 App Store 产品页面上,为家长和用户提供额外的透明度。
年龄分级在不同地区的映射方式不同:
| Apple 分级 | 澳大利亚 | 巴西 | 韩国 | 德国 (USK) |
|---|---|---|---|---|
| 4+ | 4+ | L (所有年龄) | 所有 | 0 |
| 9+ | 9+ | A10 | 12+ | 6 |
| 13+ | 13+ | A12 | 15+ | 12 |
| 16+ | 15+ | A16 | 19+ | 16 |
| 18+ | R 18+ | A18 | 19+ | 18 |
年龄分级问卷调查会根据您的答案自动生成相应的地区分级。
问卷调查涵盖以下内容类别:
| 类别 | 选项 |
|---|---|
| Cartoon or Fantasy Violence | 无、偶尔/轻微、频繁/强烈 |
| Realistic Violence | 无、偶尔/轻微、频繁/强烈 |
| Profanity or Crude Humor | 无、偶尔/轻微、频繁/强烈 |
| Mature/Suggestive Themes | 无、偶尔/轻微、频繁/强烈 |
| Alcohol, Tobacco, or Drug Use or References | 无、偶尔/轻微、频繁/强烈 |
| Sexual Content and Nudity | 无、偶尔/轻微、频繁/强烈 |
| Horror/Fear Themes | 无、偶尔/轻微、频繁/强烈 |
| Simulated Gambling | 无、偶尔/轻微、频繁/强烈 |
| Medical/Treatment Information | 无、偶尔/轻微、频繁/强烈 |
| Unrestricted Web Access | 是/否 |
系统会根据您的答案自动计算您的应用在所有地区的年龄分级。
Does your app use encryption?
├── No → Set ITSAppUsesNonExemptEncryption = NO in Info.plist → Done
├── Only HTTPS/TLS/URLSession?
│ ├── Yes → Exempt, set ITSAppUsesNonExemptEncryption = NO → Done
│ │ (May need annual self-classification report to BIS)
│ └── No (custom encryption) →
│ Set ITSAppUsesNonExemptEncryption = YES →
│ Upload compliance documentation to App Store Connect →
│ Receive encryption compliance code →
│ Set ITSEncryptionExportComplianceCode in Info.plist → Done
<!-- Most apps: HTTPS only -->
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<!-- Apps with custom encryption -->
<key>ITSAppUsesNonExemptEncryption</key>
<true/>
<key>ITSEncryptionExportComplianceCode</key>
<string>YOUR_COMPLIANCE_CODE</string>
以下情况免于出口文档要求(但仍可能需要年度自我分类):
以下情况需要合规文档:
支持账户创建的应用必须提供账户删除功能。要求:
| 要求 | 详情 |
|---|---|
| Full deletion | 必须完全删除账户,而不仅仅是停用 |
| Easy to find | 必须可从应用设置中访问;不能隐藏在支持工单后面 |
| Inform timeline | 告知用户删除需要多长时间 |
| Confirm completion | 删除完成后通知用户 |
| Delete shared UGC | 必须处理与其他用户共享的用户生成内容 |
| Revoke SIWA tokens | 对于使用"通过 Apple 登录"的账户,调用 Apple 的撤销令牌端点 |
| Handle subscriptions | 警告有关活跃订阅;引导至订阅管理 |
// Server-side: revoke SIWA tokens when account deleted
// POST https://appleid.apple.com/auth/revoke
// Parameters: client_id, client_secret, token, token_type_hint
在账户删除期间未能撤销 SIWA 令牌是常见的被拒原因。
在以下情况下必需: 您的应用提供任何第三方或社交登录选项(Google、Facebook、Twitter、通过第三方提供商的电子邮件/密码)。
当需要 SIWA 时,必须将其作为与其他登录方法同等突出的选项提供。不能隐藏或给予较少的视觉权重。
| 步骤 | 详情 |
|---|---|
| 1. Add UI entry point | 设置屏幕,明确标记为"删除账户" |
| 2. Explain consequences | 显示将删除的内容(数据、订阅、购买) |
| 3. Require confirmation | 用户必须明确确认删除 |
| 4. Handle active subscriptions | 引导用户在删除前取消活跃订阅 |
| 5. Process deletion | 从您的服务器删除所有用户数据 |
| 6. Revoke SIWA tokens | 如果使用了 SIWA,调用 Apple 的撤销端点 |
| 7. Confirm to user | 删除完成后发送电子邮件或应用内确认 |
| 8. Define timeline | 说明删除需要多长时间(立即、30 天等) |
Apple 特别拒绝以下应用:
应用内购买有独立于应用提交的审核流程:
| 场景 | 行为 |
|---|---|
| First IAP ever | 必须与新应用版本提交捆绑 |
| Subsequent IAPs | 可独立于应用更新提交 |
| IAP metadata change | 独立提交审核 |
| IAP price change | 无需审核即可生效 |
| 字段 | 必需 | 备注 |
|---|---|---|
| Reference Name | 是 | 内部名称(对用户不可见) |
| Product ID | 是 | 唯一,删除后不能重复使用 |
| Type | 是 | 消耗型、非消耗型、自动续订订阅、非续订订阅 |
| Price | 是 | 从 Apple 的价格等级中选择 |
| Display Name | 是 | 可本地化,显示给用户 |
| Description | 是 | 可本地化,显示给用户 |
| Screenshot | 是 | 一张显示 IAP 上下文的截图 |
| Review Notes | 否 | 解释 IAP 解锁的内容 |
Missing Metadata → Ready to Submit → Waiting for Review → In Review → Approved
→ Rejected
IAP 必须处于"Ready to Submit"状态才能包含在应用提交中。
| 规则 | 详情 |
|---|---|
| Ongoing value | 订阅必须随时间提供持续价值 |
| Minimum duration | 最短订阅周期为 7 天 |
| Cross-device | 必须在用户安装应用的所有设备上可用 |
| Transparent terms | 清楚说明价格、时长、自动续订和取消方式 |
| No removing features | 不能移除先前已付费的功能以强制订阅 |
| Grace period | 支持账单宽限期(重试期间用户保留访问权限) |
| Upgrade/downgrade | 必须在订阅组内支持计划变更 |
提供战利品箱或随机物品机制的应用必须在购买前披露获得每种类型物品的概率。
| 类别 | 指南 | 允许的内容 |
|---|---|---|
| Reader apps | 3.1.3(a) | 链接到网站以访问先前购买的内容(杂志、报纸、书籍、音频、音乐、视频) |
| Multiplatform services | 3.1.3(b) | 跨平台订阅(例如 Netflix、Spotify) |
| Enterprise services | 3.1.3(c) | 面向组织的 B2B 应用,而非个人消费者 |
| Person-to-person | 3.1.3(d) | 实时一对一服务(辅导、咨询、网约车) |
| Physical goods/services | 3.1.3(e) | 在应用外消费的商品(食品配送、服装、实体订阅) |
这些类别中的应用可以接受 IAP 系统之外的支付。
| 概念 | 详情 |
|---|---|
| Subscription Group | 相关订阅等级的集合(例如 Basic、Pro、Premium) |
| Service Level | 组内的排名;决定升级/降级行为 |
| Upgrade | 移动到更高的服务等级(立即生效,按比例计算) |
| Downgrade | 移动到更低的服务等级(在下次续订时生效) |
| Crossgrade | 相同服务等级,不同时长(月度 ↔ 年度) |
| Family Sharing | 可按订阅组启用 |
| 功能 | 详情 |
|---|---|
| Price tiers | Apple 在 175+ 个商店中提供 900+ 个价格点 |
| Price equalization | Apple 自动平衡跨货币的价格 |
| Custom pricing | 为每个商店设置自定义价格 |
| Introductory offers | 免费试用、按需付费、预付费 |
| Promotional offers | 针对现有/流失的订阅者;需要服务器签名的 JWS |
| Win-back offers | 针对流失的订阅者;由系统自动显示 |
| Offer codes | 可分发用于免费/折扣访问的代码 |
所有订阅应用必须实现恢复购买功能。这在 App Review 期间会进行测试。通过以下方式实现:
try await AppStore.sync()
如果缺少恢复购买功能或功能不正常,应用将被拒绝。
| 实践 | 详情 |
|---|---|
| Duration display | 在用户承诺前清楚显示试用时长 |
| Post-trial pricing | 显示试用结束后将收取的价格 |
| Cancellation | 解释如何在试用结束前取消 |
| No dark patterns | 不要让取消变得困难或难以找到 |
| Reminder | 考虑在试用结束前发送推送通知 |
适用于: 在欧盟(27 个成员国)分发的所有应用
时间线: 自 2025 年 2 月 17 日起,未声明交易者状态的应用将从欧盟 App Store 中移除。
自我评估:您是作为"交易者"(向欧盟消费者销售商品/服务)还是非交易者(爱好、开源、非商业)?Apple 无法为您确定这一点。
如果您声明为交易者,则必须提供:
| 字段 | 必需 | 验证 |
|---|---|---|
| Legal name | 是 | — |
| Address | 是 | — |
| Phone number | 是 | 通过 2FA 验证 |
| Email address | 是 | 通过 2FA 验证 |
| Company registration | 如适用 | — |
| VAT ID | 如适用 | — |
此联系信息显示在您的欧盟产品页面上。
App Store Connect > Users and Access > Developer Profile > Trader Status
为每个应用选择您的交易者状态。如果您同时拥有付费和免费应用,每个应用可能有不同的交易者分类。
根据数字市场法案 (DMA),Apple 允许在欧盟进行替代应用分发:
这些需要单独的商业条款(替代条款附录)和额外的合规步骤。详情请参阅 Apple 的欧盟开发者文档。
在这些地区分发的任何应用都需要 DSA 合规:
奥地利、比利时、保加利亚、克罗地亚、塞浦路斯、捷克共和国、丹麦、爱沙尼亚、芬兰、法国、德国、希腊、匈牙利、爱尔兰、意大利、拉脱维亚、立陶宛、卢森堡、马耳他、荷兰、波兰、葡萄牙、罗马尼亚、斯洛伐克、斯洛文尼亚、西班牙、瑞典。
如果您的应用在"所有地区"(默认)可用,则意味着在欧盟可用,因此需要 DSA 合规。
| 方法 | 最适合 |
|---|---|
| Xcode (recommended) | 大多数开发者;与 Archive 工作流集成 |
| Xcode Cloud | 具有自动构建和分发的 CI/CD |
| Transporter | 用于批量上传的独立 macOS 应用 |
| altool (CLI) | 脚本化的 CI/CD 流水线 |
| App Store Connect API | 完全自动化的工作流 |
| 标识符 | 用途 | 示例 | 规则 |
|---|---|---|---|
| Bundle ID | 唯一标识您的应用 | com.company.app | 设置一次,不能更改 |
| Version Number | 面向用户的版本 | 2.1.0 | 每个版本必须递增 |
| Build String | 区分同一版本的不同构建 | 2.1.0.42 | 每个版本每个平台必须唯一 |
| 生效日期 | 要求 |
|---|---|
| April 2025 (current) | Xcode 16, iOS 18 SDK |
| April 28, 2026 (upcoming) | Xcode 26, iOS 26 SDK |
使用过时 SDK 构建的应用在生效日期后提交新版本将被拒绝。商店上的现有应用在提交更新前不受影响。
上传后,Apple 会处理您的构建版本:
常见的处理失败:
所有应用必须在仅 IPv6 网络上工作。Apple 的审核环境使用 IPv6。常见问题:
Complete reference for every App Store submission requirement:
| Term | Definition |
|---|---|
| App Store Connect | Web portal and API for managing app metadata, builds, pricing, TestFlight, and analytics |
| App Review | Apple's human review process that evaluates every app update against the App Review Guidelines |
| Privacy Manifest | PrivacyInfo.xcprivacy file declaring data collection, tracking domains, and Required Reason API usage |
| Required Reason API | System APIs (file timestamps, disk space, user defaults, etc.) that require declared usage reasons |
| Privacy Nutrition Label | App Store privacy cards showing what data your app collects and how it uses it |
| DSA Trader Status | EU Digital Services Act classification determining if you are a "trader" selling to EU consumers |
| Build String | Unique identifier for each uploaded build (e.g., "1.2.3.4"), separate from version number |
| Bundle ID |
| Field | Required | Localizable | Max Length | Notes |
|---|---|---|---|---|
| App Name | Yes | Yes | 30 chars | Must be unique on the App Store |
| Subtitle | No | Yes | 30 chars | Appears below app name in search results |
| Description | Yes | Yes | 4000 chars | Plain text, no HTML or rich formatting |
| Promotional Text | No | Yes | 170 chars | Editable without new submission |
| Keywords | Yes | Yes | 100 bytes | Comma-separated, each keyword >2 chars |
| What's New | Yes* |
| Asset | Required | Localizable | Specification |
|---|---|---|---|
| App Icon | Yes | No | 1024x1024 PNG, no alpha, no rounded corners |
| Screenshots | Yes | Yes | Per device size, 2-10 per locale per device |
| App Preview | No | Yes | Up to 3 videos per device size per locale |
Screenshots must be provided for each device size you support:
| Device | Required Size (portrait) | Required Size (landscape) |
|---|---|---|
| iPhone 6.9" | 1320 x 2868 | 2868 x 1320 |
| iPhone 6.7" | 1290 x 2796 | 2796 x 1290 |
| iPhone 6.5" | 1284 x 2778 | 2778 x 1284 |
| iPhone 5.5" | 1242 x 2208 | 2208 x 1242 |
| iPad Pro 13" | 2048 x 2732 | 2732 x 2048 |
| iPad Pro 12.9" | 2048 x 2732 | 2732 x 2048 |
Screenshots must show the app in actual use. Not permitted: title art alone, login screens, splash screens, or screens from other platforms.
| Specification | Requirement |
|---|---|
| Duration | 15-30 seconds |
| Format | H.264, ProRes 422 |
| Audio | English or localized; no offensive content |
| Frame rate | 30 or 60 fps |
| Resolution | Must match screenshot dimensions for the device |
| Content | Must show actual app footage; no device frames allowed in video |
| Per locale | Up to 3 preview videos per device size per locale |
| Specification | Requirement |
|---|---|
| Size | 1024 x 1024 pixels |
| Format | PNG |
| Color space | sRGB or P3 |
| Alpha channel | Not allowed |
| Rounded corners | Not allowed (system applies automatically) |
| Layers/transparency | Not allowed |
| Content | Must be appropriate for 4+ rating regardless of app's actual rating |
| Field | Required | Notes |
|---|---|---|
| Contact First Name | Yes | Reviewer contact |
| Contact Last Name | Yes | Reviewer contact |
| Contact Email | Yes | Must be monitored |
| Contact Phone | Yes | Include country code |
| Notes for Review | No | Up to 4000 bytes; explain non-obvious features |
| Sign-in Username | If login required | Must not expire during review |
| Sign-in Password | If login required | Must not expire during review |
| Attachment | No | Up to 10 files, max 512 MB total |
| Aspect | Details |
|---|---|
| Minimum | Primary language required; all other localizations optional |
| Per-locale metadata | App name, subtitle, description, keywords, What's New, screenshots |
| Promotional Text | Localizable and editable without new submission |
| Screenshots | Can differ per locale (show localized UI) |
| App Previews | Can differ per locale (show localized audio/UI) |
| URL fields | Support URL and Marketing URL can differ per locale |
When localizing, provide screenshots that match the localized UI. Reviewers check that screenshots accurately represent the app in each locale.
| Primary Category | Secondary Category | Rules |
|---|---|---|
| Required | Optional | Choose the category that best describes your app |
| Must be accurate | Can complement primary | Inaccurate category is grounds for rejection (2.3.7) |
| Games have subcategories | — | Games must also select up to 2 game subcategories |
Available categories: Books, Business, Developer Tools, Education, Entertainment, Finance, Food & Drink, Games, Graphics & Design, Health & Fitness, Lifestyle, Magazines & Newspapers, Medical, Music, Navigation, News, Photo & Video, Productivity, Reference, Shopping, Social Networking, Sports, Travel, Utilities, Weather.
Required in BOTH locations:
The privacy policy must identify:
<!-- Top-level keys -->
NSPrivacyTracking <!-- Boolean: Does app track users? -->
NSPrivacyTrackingDomains <!-- Array<String>: Domains used for tracking -->
NSPrivacyCollectedDataTypes <!-- Array<Dictionary>: Data collected -->
NSPrivacyAccessedAPITypes <!-- Array<Dictionary>: Required Reason APIs -->
Each dictionary in the array contains:
| Key | Type | Description |
|---|---|---|
NSPrivacyCollectedDataType | String | Category key (e.g., "NSPrivacyCollectedDataTypeName") |
NSPrivacyCollectedDataTypePurposes | Array<String> | Purpose keys for this data type |
NSPrivacyCollectedDataTypeLinked | Boolean | Is this data linked to user identity? |
NSPrivacyCollectedDataTypeTracking | Boolean | Is this data used for tracking? |
Each dictionary in the array contains:
| Key | Type | Description |
|---|---|---|
NSPrivacyAccessedAPIType | String | API category identifier |
NSPrivacyAccessedAPITypeReasons | Array<String> | Approved reason codes for usage |
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>NSPrivacyTracking</key>
<false/>
<key>NSPrivacyTrackingDomains</key>
<array/>
<key>NSPrivacyCollectedDataTypes</key>
<array>
<dict>
<key>NSPrivacyCollectedDataType</key>
<string>NSPrivacyCollectedDataTypeEmailAddress</string>
<key>NSPrivacyCollectedDataTypeLinked</key>
<true/>
<key>NSPrivacyCollectedDataTypeTracking</key>
<false/>
<key>NSPrivacyCollectedDataTypePurposes</key>
<array>
<string>NSPrivacyCollectedDataTypePurposeAppFunctionality</string>
</array>
</dict>
</array>
<key>NSPrivacyAccessedAPITypes</key>
<array>
<dict>
<key>NSPrivacyAccessedAPIType</key>
<string>NSPrivacyAccessedAPICategoryUserDefaults</string>
<key>NSPrivacyAccessedAPITypeReasons</key>
<array>
<string>CA92.1</string>
</array>
</dict>
</array>
</dict>
</plist>
| Category | Identifier String |
|---|---|
| File timestamp | NSPrivacyAccessedAPICategoryFileTimestamp |
| System boot time | NSPrivacyAccessedAPICategorySystemBootTime |
| Disk space | NSPrivacyAccessedAPICategoryDiskSpace |
| Active keyboard | NSPrivacyAccessedAPICategoryActiveKeyboards |
| User defaults | NSPrivacyAccessedAPICategoryUserDefaults |
Xcode > Product > Archive > Generate Privacy Report
This produces a PDF summarizing privacy manifests from your app and all embedded frameworks.
| Category | APIs Covered | Common Reasons |
|---|---|---|
| File timestamp | NSFileCreationDate, NSFileModificationDate, NSURLContentModificationDateKey | DDA9.1 (display to user), C617.1 (inside app container) |
| System boot time | systemUptime, mach_absolute_time | 35F9.1 (measure elapsed time) |
| Disk space | NSFileSystemFreeSize, NSFileSystemSize, |
| Category | Examples |
|---|---|
| Contact Info | Name, email address, phone number, physical address |
| Health & Fitness | Health data, fitness data |
| Financial Info | Payment info, credit info |
| Location | Precise location, coarse location |
| Sensitive Info | Racial or ethnic data, sexual orientation, religion, biometrics |
| Contacts | Address book contacts |
| User Content | Photos, videos, audio, gameplay content, customer support messages |
| Browsing History | Web browsing history |
| Search History | In-app search history |
| Identifiers | User ID, device ID |
| Purchases | Purchase history |
| Usage Data | Product interaction, advertising data, app launches, taps, scrolls |
| Diagnostics | Crash data, performance data |
| Purpose | Description |
|---|---|
| Third-Party Advertising | Displaying third-party ads or sharing with ad networks |
| Developer's Advertising/Marketing | Your own marketing campaigns |
| Analytics | Understanding user behavior and measuring effectiveness |
| Product Personalization | Customizing features, content recommendations |
| App Functionality | Required for app to work (e.g., authentication, data sync) |
| Other | Any purpose not listed above |
"Collected" means data is transmitted off-device and accessible beyond what is needed to service the current request. On-device-only processing is NOT collection.
"Tracking" means:
Required if your app "tracks" per Apple's definition above.
NSUserTrackingUsageDescription to Info.plist (explains why tracking is needed)ATTrackingManager.requestTrackingAuthorization() before tracking.authorized — User granted permission to track.denied — User denied tracking; do not track.notDetermined — User has not yet been asked.restricted — Device-level restriction prevents trackingRequest at a contextually appropriate moment, not at first launch.
These Info.plist keys must be present for each system permission your app requests:
| Permission | Info.plist Key |
|---|---|
| Camera | NSCameraUsageDescription |
| Microphone | NSMicrophoneUsageDescription |
| Photo Library (read) | NSPhotoLibraryUsageDescription |
| Photo Library (write) | NSPhotoLibraryAddUsageDescription |
| Location (when in use) | NSLocationWhenInUseUsageDescription |
| Location (always) | NSLocationAlwaysAndWhenInUseUsageDescription |
Missing purpose strings cause immediate rejection. Purpose string text must clearly explain why the permission is needed in the context of your app's functionality.
Apple maintains a list of commonly used SDKs that require privacy manifests. Starting spring 2024, if your app includes these SDKs without privacy manifests, it will be flagged during submission.
Third-party SDKs should include their own PrivacyInfo.xcprivacy in their framework bundle. The aggregate privacy report combines all manifests from your app and embedded frameworks.
If a third-party SDK does not include a privacy manifest, you must declare its data collection in your app's privacy manifest.
For the complete guideline index (Sections 1-5), see references/app-review-guidelines.md.
Based on Apple's published data, the most frequent rejection reasons:
| Rank | Guideline | Issue | Prevention |
|---|---|---|---|
| 1 | 2.1 | App Completeness — bugs, crashes, placeholder content | Thorough QA before submission |
| 2 | 4.3 | Spam — duplicate apps, cookie-cutter templates | Ensure genuine unique value |
| 3 | 2.3.3 | Inaccurate screenshots | Screenshots must match actual app |
| 4 | 5.1.1 | Privacy — missing policy or purpose strings | Complete all privacy requirements |
| 5 | 4.0 | Design — not meeting minimum quality bar | Follow HIG, test all flows |
| 6 | 2.5.1 | Private API usage | Only use public APIs |
| 7 | 3.1.1 | IAP required for digital goods |
| Stage | Typical Duration |
|---|---|
| Waiting for Review | Minutes to hours |
| In Review | Minutes to 24 hours |
| Total (90th percentile) | Under 24 hours |
| Total (edge cases) | Up to 7 days |
| Expedited Review | Same day to 24 hours (if approved) |
Review times increase during holidays and major iOS release periods. Plan submissions accordingly.
| Rating | Triggers |
|---|---|
| 4+ | No objectionable material |
| 9+ | Infrequent or mild: profanity, cartoon/fantasy violence, horror/fear themes. Loot boxes present |
| 13+ | Frequent or intense: profanity or crude humor. Infrequent: alcohol/tobacco/drugs references, sexual content/nudity, realistic violence |
| 16+ | Unrestricted web access, frequent medical/treatment info, mature/suggestive themes |
| 18+ | Frequent or intense: alcohol/tobacco/drugs use, sexual content/nudity, realistic violence. Simulated gambling with real-money elements |
| Unrated | App cannot be published without completing the questionnaire |
Apps must declare if they include these capabilities:
| Capability | When to Declare |
|---|---|
| Messaging/chat | Any in-app messaging between users |
| User-generated content | Users can post, share, or upload content visible to others |
| Advertising | App displays ads from any ad network |
| Parental controls | App has parental restrictions or family features |
| Age assurance | App verifies user age for restricted content |
These declarations appear alongside the age rating on the App Store product page, giving parents and users additional transparency.
Age ratings map differently across regions:
| Apple Rating | Australia | Brazil | Korea | Germany (USK) |
|---|---|---|---|---|
| 4+ | 4+ | L (All ages) | All | 0 |
| 9+ | 9+ | A10 | 12+ | 6 |
| 13+ | 13+ | A12 | 15+ | 12 |
| 16+ | 15+ | A16 | 19+ | 16 |
| 18+ | R 18+ | A18 | 19+ | 18 |
The age rating questionnaire automatically generates the appropriate regional ratings based on your answers.
The questionnaire covers these content categories:
| Category | Options |
|---|---|
| Cartoon or Fantasy Violence | None, Infrequent/Mild, Frequent/Intense |
| Realistic Violence | None, Infrequent/Mild, Frequent/Intense |
| Profanity or Crude Humor | None, Infrequent/Mild, Frequent/Intense |
| Mature/Suggestive Themes | None, Infrequent/Mild, Frequent/Intense |
| Alcohol, Tobacco, or Drug Use or References | None, Infrequent/Mild, Frequent/Intense |
| Sexual Content and Nudity | None, Infrequent/Mild, Frequent/Intense |
| Horror/Fear Themes | None, Infrequent/Mild, Frequent/Intense |
| Simulated Gambling | None, Infrequent/Mild, Frequent/Intense |
| Medical/Treatment Information | None, Infrequent/Mild, Frequent/Intense |
| Unrestricted Web Access | Yes/No |
The system automatically calculates your app's age rating across all regions based on your answers.
Does your app use encryption?
├── No → Set ITSAppUsesNonExemptEncryption = NO in Info.plist → Done
├── Only HTTPS/TLS/URLSession?
│ ├── Yes → Exempt, set ITSAppUsesNonExemptEncryption = NO → Done
│ │ (May need annual self-classification report to BIS)
│ └── No (custom encryption) →
│ Set ITSAppUsesNonExemptEncryption = YES →
│ Upload compliance documentation to App Store Connect →
│ Receive encryption compliance code →
│ Set ITSEncryptionExportComplianceCode in Info.plist → Done
<!-- Most apps: HTTPS only -->
<key>ITSAppUsesNonExemptEncryption</key>
<false/>
<!-- Apps with custom encryption -->
<key>ITSAppUsesNonExemptEncryption</key>
<true/>
<key>ITSEncryptionExportComplianceCode</key>
<string>YOUR_COMPLIANCE_CODE</string>
These are exempt from export documentation (but may still require annual self-classification):
These require compliance documentation:
Apps that support account creation must offer account deletion. Requirements:
| Requirement | Details |
|---|---|
| Full deletion | Must fully delete the account, not just deactivate |
| Easy to find | Must be accessible from app settings; not buried behind support tickets |
| Inform timeline | Tell user how long deletion takes |
| Confirm completion | Notify user when deletion is complete |
| Delete shared UGC | Must handle user-generated content shared with others |
| Revoke SIWA tokens | Call Apple's revoke token endpoint for Sign in with Apple accounts |
| Handle subscriptions | Warn about active subscriptions; direct to subscription management |
// Server-side: revoke SIWA tokens when account deleted
// POST https://appleid.apple.com/auth/revoke
// Parameters: client_id, client_secret, token, token_type_hint
Failing to revoke SIWA tokens during account deletion is a common rejection reason.
Required when: Your app offers ANY third-party or social login option (Google, Facebook, Twitter, email/password via third-party provider).
When SIWA is required, it must be offered as an equally prominent option alongside other sign-in methods. It cannot be hidden or given less visual weight.
| Step | Details |
|---|---|
| 1. Add UI entry point | Settings screen, clearly labeled "Delete Account" |
| 2. Explain consequences | Show what will be deleted (data, subscriptions, purchases) |
| 3. Require confirmation | User must explicitly confirm deletion |
| 4. Handle active subscriptions | Direct user to cancel active subscriptions before deletion |
| 5. Process deletion | Delete all user data from your servers |
| 6. Revoke SIWA tokens | Call Apple's revoke endpoint if SIWA was used |
| 7. Confirm to user | Send email or in-app confirmation when deletion is complete |
| 8. Define timeline | State how long deletion takes (immediately, 30 days, etc.) |
Apple specifically rejects apps that:
In-app purchases have a separate review process from app submissions:
| Scenario | Behavior |
|---|---|
| First IAP ever | Must be bundled with a new app version submission |
| Subsequent IAPs | Can be submitted independently of app updates |
| IAP metadata change | Submitted for review independently |
| IAP price change | Takes effect without review |
| Field | Required | Notes |
|---|---|---|
| Reference Name | Yes | Internal name (not visible to users) |
| Product ID | Yes | Unique, cannot be reused after deletion |
| Type | Yes | Consumable, non-consumable, auto-renewable, non-renewing |
| Price | Yes | Select from Apple's price tiers |
| Display Name | Yes | Localizable, shown to users |
| Description | Yes | Localizable, shown to users |
| Screenshot | Yes | One screenshot showing the IAP in context |
| Review Notes | No | Explain what the IAP unlocks |
Missing Metadata → Ready to Submit → Waiting for Review → In Review → Approved
→ Rejected
IAP must be in "Ready to Submit" status before it can be included in an app submission.
| Rule | Details |
|---|---|
| Ongoing value | Subscriptions must provide continuing value over time |
| Minimum duration | 7 days minimum subscription period |
| Cross-device | Must work across all user's devices where app is available |
| Transparent terms | Clearly state price, duration, auto-renewal, and cancellation |
| No removing features | Cannot remove previously paid functionality to force subscription |
| Grace period | Support billing grace period (user retains access during retry) |
| Upgrade/downgrade | Must support plan changes within subscription group |
Apps offering loot boxes or random item mechanics must disclose the odds of receiving each type of item before purchase.
| Category | Guideline | What's Allowed |
|---|---|---|
| Reader apps | 3.1.3(a) | Link to website for previously purchased content (magazines, newspapers, books, audio, music, video) |
| Multiplatform services | 3.1.3(b) | Cross-platform subscriptions (e.g., Netflix, Spotify) |
| Enterprise services | 3.1.3(c) | B2B apps for organizations, not individual consumers |
| Person-to-person | 3.1.3(d) | Real-time one-to-one services (tutoring, consulting, ride-sharing) |
| Physical goods/services | 3.1.3(e) | Goods consumed outside the app (food delivery, clothing, physical subscriptions) |
Apps in these categories may accept payment outside the IAP system.
| Concept | Details |
|---|---|
| Subscription Group | Collection of related subscription tiers (e.g., Basic, Pro, Premium) |
| Service Level | Rank within a group; determines upgrade/downgrade behavior |
| Upgrade | Moving to higher service level (immediate, prorated) |
| Downgrade | Moving to lower service level (effective at next renewal) |
| Crossgrade | Same service level, different duration (monthly ↔ annual) |
| Family Sharing | Can be enabled per subscription group |
| Feature | Details |
|---|---|
| Price tiers | Apple provides 900+ price points across 175+ storefronts |
| Price equalization | Apple auto-equalizes prices across currencies |
| Custom pricing | Set custom prices per storefront |
| Introductory offers | Free trial, pay-as-you-go, pay-up-front |
| Promotional offers | For existing/lapsed subscribers; requires server-signed JWS |
| Win-back offers | For lapsed subscribers; displayed by system automatically |
| Offer codes | Distributable codes for free/discounted access |
All subscription apps must implement Restore Purchases functionality. This is tested during App Review. Implement via:
try await AppStore.sync()
If Restore Purchases is missing or non-functional, the app will be rejected.
| Practice | Details |
|---|---|
| Duration display | Clearly show trial length before user commits |
| Post-trial pricing | Show what price will be charged after trial ends |
| Cancellation | Explain how to cancel before trial ends |
| No dark patterns | Don't make cancellation difficult or hard to find |
| Reminder | Consider sending a push notification before trial ends |
Applies to: ALL apps distributed in the EU (27 member states)
Timeline: Since February 17, 2025, apps without declared trader status are subject to removal from the EU App Store.
A self-assessment: are you acting as a "trader" (selling goods/services to EU consumers) or a non-trader (hobby, open-source, non-commercial)? Apple cannot determine this for you.
If you declare as a trader, you must provide:
| Field | Required | Verification |
|---|---|---|
| Legal name | Yes | — |
| Address | Yes | — |
| Phone number | Yes | Verified via 2FA |
| Email address | Yes | Verified via 2FA |
| Company registration | Where applicable | — |
| VAT ID | Where applicable | — |
This contact information is displayed on your EU product page.
App Store Connect > Users and Access > Developer Profile > Trader Status
Select your trader status for each app. If you have both paid and free apps, each app may have a different trader classification.
Under the Digital Markets Act (DMA), Apple allows alternative app distribution in the EU:
These require separate business terms (Alternative Terms Addendum) and additional compliance steps. See Apple's EU developer documentation for details.
Apps distributed in any of these territories require DSA compliance:
Austria, Belgium, Bulgaria, Croatia, Cyprus, Czech Republic, Denmark, Estonia, Finland, France, Germany, Greece, Hungary, Ireland, Italy, Latvia, Lithuania, Luxembourg, Malta, Netherlands, Poland, Portugal, Romania, Slovakia, Slovenia, Spain, Sweden.
If your app is available in "All Territories" (the default), it is available in the EU and DSA compliance is required.
| Method | Best For |
|---|---|
| Xcode (recommended) | Most developers; integrated with Archive workflow |
| Xcode Cloud | CI/CD with automatic builds and distribution |
| Transporter | Standalone macOS app for batch uploads |
| altool (CLI) | Scripted CI/CD pipelines |
| App Store Connect API | Fully automated workflows |
| Identifier | Purpose | Example | Rules |
|---|---|---|---|
| Bundle ID | Uniquely identifies your app | com.company.app | Set once, cannot change |
| Version Number | User-facing version | 2.1.0 | Must increment for each release |
| Build String | Distinguishes builds of same version | 2.1.0.42 | Must be unique per version per platform |
| Effective Date | Requirement |
|---|---|
| April 2025 (current) | Xcode 16, iOS 18 SDK |
| April 28, 2026 (upcoming) | Xcode 26, iOS 26 SDK |
Apps built with outdated SDKs will be rejected after the effective date for new submissions. Existing apps on the store are not affected until they submit an update.
After upload, Apple processes your build:
Common processing failures:
All apps must work on IPv6-only networks. Apple's review environment uses IPv6. Common issues:
Use URLSession or Network.framework to ensure IPv6 compatibility automatically.
| Topic | Status |
|---|---|
| Bitcode | Deprecated since Xcode 14; no longer accepted |
| App Thinning | Active; Apple generates device-specific variants |
| On-Demand Resources | Active; tag resources for download on demand |
| Asset catalogs | Used for app thinning of images (1x/2x/3x) |
Certain features require entitlements configured in Xcode and provisioning profiles:
| Capability | Entitlement | Common Issues |
|---|---|---|
| Push Notifications | aps-environment | Certificate expiry, missing provisioning |
| App Groups | com.apple.security.application-groups | Shared container ID mismatch |
| Associated Domains | com.apple.developer.associated-domains | AASA file not served correctly |
| HealthKit | com.apple.developer.healthkit | Missing required capabilities |
| Background Modes | UIBackgroundModes |
TestFlight builds also go through a review process, though lighter than App Store:
| Aspect | Internal Testing | External Testing |
|---|---|---|
| Testers | Up to 100 App Store Connect users | Up to 10,000 external testers |
| Review required | No | Yes (first build per version) |
| Review time | — | Usually under 24 hours |
| Duration | 90 days from upload | 90 days from upload |
| Groups | — | Organize testers into groups |
| Feedback | Crash reports only | Screenshots, feedback, crash reports |
Group multiple items into a single draft submission:
When a build is rejected due to metadata issues (not binary issues), you can reuse the same build without re-uploading. Previously, rejected builds required a new build string.
Builds are no longer removed from App Store Connect after certain rejection types. You can fix metadata issues and resubmit with the same build.
New App Store metadata for accessibility features:
Apple generates descriptive tags for your app using AI:
Product pages can now have unique keywords:
Offer codes now support all IAP types:
Apple generates AI summaries of user reviews:
100+ new analytics metrics including:
Five-tier system with new capability declarations (see Part 4 for full details).
Custom product pages allow different App Store presentations for different audiences:
| Feature | Details |
|---|---|
| Maximum | Up to 35 custom product pages per app |
| Customizable | Screenshots, app previews, promotional text |
| NOT customizable | App name, icon, description, What's New |
| URL | Unique URL per custom page for attribution |
| Keywords | New in WWDC25: unique keywords per custom product page |
| Analytics | Impressions, downloads, conversion rates per page |
| Feature | Details |
|---|---|
| 900+ price points | Expanded from original 87 tiers |
| Global equalization | Automatic currency conversion with regional pricing |
| Custom pricing | Override auto-equalization for specific storefronts |
| Price increases | Existing subscribers notified; must consent for >50% increase |
| Regional pricing | Set prices optimized for each market's purchasing power |
For the comprehensive 9-section submission checklist, see references/expert-review-checklist.md. For the discipline-focused pre-flight workflow, see app-store-submission.
---|---|---|---
1 | "Missing Compliance" on build | Export compliance questions not answered | App Store Connect > build > answer encryption questions
2 | Build not appearing in ASC | Processing delay or failure | Wait 15-60 min; check email for processing errors
3 | "Add for Review" button grayed | Missing required metadata | Check all required fields in App Information and Version Information
4 | Screenshots wrong size | Device spec mismatch | Use exact pixel dimensions for each device size class
5 | Privacy policy URL invalid | Not HTTPS or not publicly accessible | Must be https:// URL accessible without login
6 | IAP not available for review | IAP not in "Ready to Submit" status | Complete all IAP metadata including screenshot; set status
7 | Age rating warnings | Questionnaire incomplete or capabilities not declared | Complete questionnaire; answer new capability questions
8 | DSA trader status incomplete | Email or phone not verified | Complete 2FA verification for both email and phone
9 | Build string conflict | Duplicate build string for same version | Each build upload must have a unique build string
10 | "In Review" for extended period | Complex review or holiday backlog | 90% of apps reviewed in <24h; use expedited review for critical/urgent issues
Request via App Store Connect when:
Apple reviews expedited requests case-by-case. Not guaranteed. Provide clear justification.
| Option | When to Use | How |
|---|---|---|
| Fix and resubmit | Issue is clear and fixable | Fix the issue, upload new build or update metadata, resubmit |
| Reply in Resolution Center | Need clarification or want to explain | App Store Connect > Resolution Center |
| Appeal | Believe rejection is incorrect | App Review Board appeal via Resolution Center |
| Contact App Review | Need guidance on a specific guideline | Phone or online request |
For automated submission workflows:
| Endpoint | Purpose |
|---|---|
POST /v1/appStoreVersions | Create new version |
PATCH /v1/appStoreVersions/{id} | Update version metadata |
POST /v1/appStoreVersionSubmissions | Submit version for review |
GET /v1/apps/{id}/appStoreVersions | List all versions |
POST /v1/appScreenshots | Upload screenshots |
POST /v1/appPreviews |
Authentication requires an API key from App Store Connect (Users and Access > Integrations > App Store Connect API).
| Test | What to Verify |
|---|---|
| Fresh install | App works on clean device with no prior data |
| Upgrade path | App works when upgrading from previous version |
| Network conditions | App handles offline, slow, and interrupted connections |
| Low storage | App handles low disk space gracefully |
| Background/foreground | App resumes correctly from background |
| Accessibility | VoiceOver navigation works for all key flows |
| All device sizes | UI adapts to smallest and largest supported devices |
| Dark mode | UI renders correctly in both light and dark appearance |
| All supported languages | No truncation or layout issues in localized versions |
| Permission denial | App handles denied permissions without crashing |
| IAP restore | Restore Purchases works on fresh device |
| Account deletion | Full account deletion flow works end to end |
WWDC : 2022-10166, 2025-224, 2025-241, 2025-252, 2025-328
Docs : /app-store/review/guidelines, /app-store/submitting, /app-store/app-privacy-details, /help/app-store-connect
Skills : app-store-submission, app-store-diag, privacy-ux, storekit-ref, accessibility-diag
Weekly Installs
44
Repository
GitHub Stars
610
First Seen
Feb 18, 2026
Security Audits
Gen Agent Trust HubPassSocketPassSnykPass
Installed on
codex41
opencode40
github-copilot39
gemini-cli39
kimi-cli38
amp38
PRD到实施计划转换工具:使用垂直切片法将产品需求文档分解为分阶段开发计划
4,100 周安装
| Reverse-domain identifier (e.g., "com.company.app") uniquely identifying your app across Apple's ecosystem |
| Yes |
| 4000 chars |
| *Required for all versions except first |
| Copyright | Yes | No | — | Format: "YYYY Company Name" |
| Support URL | Yes | Yes | — | Must link to actual contact information |
| Marketing URL | No | Yes | — | Optional promotional page |
| Privacy Policy URL | Yes | Yes | — | HTTPS, publicly accessible |
volumeAvailableCapacityKey| E174.1 (check before writing), 85F4.1 (display to user) |
| Active keyboard | activeInputModes | 54BD.1 (customize UI for keyboard) |
| User defaults | UserDefaults (all access requires declaration) | CA92.1 (access within app group), 1C8F.1 (access within same app) |
| Surroundings | Environment scanning (e.g., AR data) |
| Body | Hands, head (e.g., hand tracking in visionOS) |
| Contacts | NSContactsUsageDescription |
| Calendars (full access) | NSCalendarsFullAccessUsageDescription |
| Reminders (full access) | NSRemindersFullAccessUsageDescription |
| Health | NSHealthShareUsageDescription, NSHealthUpdateUsageDescription |
| Motion | NSMotionUsageDescription |
| Bluetooth | NSBluetoothAlwaysUsageDescription |
| Face ID | NSFaceIDUsageDescription |
| Local Network | NSLocalNetworkUsageDescription |
| Tracking | NSUserTrackingUsageDescription |
| Speech Recognition | NSSpeechRecognitionUsageDescription |
| Apple Music | NSAppleMusicUsageDescription |
| Use IAP for digital content |
| 8 | 4.2 | Minimum functionality — app too simple | Provide genuine utility |
| 9 | 5.1.1(v) | Missing account deletion | Implement full account deletion |
| 10 | 2.3.7 | Wrong app category | Choose accurate primary category |
| Using modes without justification |
| Sign in with Apple | com.apple.developer.applesignin | Missing from provisioning profile |
| CloudKit | com.apple.developer.icloud-services | Container ID mismatch |
| In-App Purchase | — | Enabled by default; StoreKit config needed for testing |
| Upload app preview videos |
GET /v1/apps/{id}/builds | List processed builds |