app-store-review

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

App Store Review Preparation

App Store审核准备

Guidance for catching App Store rejection risks before submission. Apple reviewed 7.7 million submissions in 2024 and rejected 1.9 million. Most rejections are preventable with proper preparation.
用于在提交前排查App Store被拒风险的指导。2024年苹果审核了770万份提交申请,其中190万份被拒绝。大多数拒审情况通过适当准备即可避免。

Top Rejection Reasons and How to Avoid Them

常见被拒原因及规避方法

Guideline 2.1 -- App Completeness

指南2.1 -- 应用完整性

The app must be fully functional when reviewed. Apple rejects for:
  • Placeholder content, lorem ipsum, or test data visible anywhere
  • Broken links or empty screens
  • Features behind logins without demo credentials provided in App Review notes
  • Features that require hardware Apple does not have access to
Prevention:
  • Provide demo account credentials in the App Review Information notes field in App Store Connect
  • Walk through every screen and verify real content is present
  • Test all flows end-to-end, including edge cases like empty states and error conditions
审核时应用必须功能完整。苹果会因以下原因拒审:
  • 任意位置可见占位内容、假文示例或测试数据
  • 链接失效或页面为空
  • 需登录才能使用的功能未在审核备注中提供演示账号凭证
  • 功能需要苹果审核人员无法获取的硬件支持
预防措施:
  • 在App Store Connect的审核信息备注字段中提供演示账号凭证
  • 遍历每个页面确认存在真实有效内容
  • 端到端测试所有流程,包括空状态、错误场景等边缘情况

Guideline 2.3 -- Accurate Metadata

指南2.3 -- 元数据准确性

  • App name must match what the app actually does
  • Screenshots must show the actual app UI, not marketing renders or mockups
  • Description must not contain prices (they vary by region)
  • No references to other platforms ("Also available on Android")
  • Keywords must be relevant -- no competitor names or unrelated terms
  • Category must match the app's primary function
  • 应用名称必须与实际功能匹配
  • 截图必须展示真实应用UI,不得使用营销渲染图或原型图
  • 描述中不得包含价格(价格随地区不同存在差异)
  • 不得提及其他平台(如"也可在Android上使用")
  • 关键词必须相关,不得包含竞品名称或无关术语
  • 分类必须与应用核心功能匹配

Guideline 4.2 -- Minimum Functionality

指南4.2 -- 最低功能要求

Apple rejects apps that are too simple or are just websites in a wrapper:
  • WKWebView-only apps are rejected unless they add meaningful native functionality
  • Single-feature apps may be rejected if the feature is better suited as part of another app
  • Apps that duplicate built-in iOS functionality without significant improvement are rejected
苹果会拒审过于简单或只是网页套壳的应用:
  • 仅使用WKWebView的应用会被拒,除非添加了有价值的原生功能
  • 单一功能应用若更适合作为其他应用的一部分可能会被拒
  • 复制iOS内置功能但无显著改进的应用会被拒

Guideline 2.5.1 -- Software Requirements

指南2.5.1 -- 软件要求

  • Must use public APIs only -- private API usage is an instant rejection
  • Must be built with the current Xcode GM release or later
  • Must support the latest two major iOS versions (guideline, not strict rule)
  • Must not download or execute code dynamically (except JavaScript in WKWebView)
  • 仅可使用公开API,使用私有API会直接被拒
  • 必须使用当前Xcode GM或更高版本构建
  • 需支持最新两个大版本的iOS系统(为指导规则,非强制要求)
  • 不得下载或动态执行代码(WKWebView中的JavaScript除外)

PrivacyInfo.xcprivacy -- Privacy Manifest Requirements

PrivacyInfo.xcprivacy -- 隐私清单要求

This is the fastest-growing rejection category (Guideline 5.1.1). A privacy manifest is required if your app or any of its dependencies uses certain categories of APIs.
这是目前增长最快的拒审类别(指南5.1.1)。如果你的应用或任何依赖使用了特定类别的API,则必须提供隐私清单。

When a Privacy Manifest Is Required

需要提供隐私清单的场景

A
PrivacyInfo.xcprivacy
file must be present if your app uses ANY of these API categories:
  • File timestamp APIs (
    NSPrivacyAccessedAPICategoryFileTimestamp
    )
  • System boot time APIs (
    NSPrivacyAccessedAPICategorySystemBootTime
    )
  • Disk space APIs (
    NSPrivacyAccessedAPICategoryDiskSpace
    )
  • User defaults (
    NSPrivacyAccessedAPICategoryUserDefaults
    ) -- if storing user-identifiable data
  • Active keyboard APIs (
    NSPrivacyAccessedAPICategoryActiveKeyboards
    )
如果你的应用使用了以下任意一类API,则必须包含
PrivacyInfo.xcprivacy
文件:
  • 文件时间戳API
    NSPrivacyAccessedAPICategoryFileTimestamp
  • 系统启动时间API
    NSPrivacyAccessedAPICategorySystemBootTime
  • 磁盘空间API
    NSPrivacyAccessedAPICategoryDiskSpace
  • 用户偏好设置
    NSPrivacyAccessedAPICategoryUserDefaults
    )-- 若存储用户可识别数据
  • 活跃键盘API
    NSPrivacyAccessedAPICategoryActiveKeyboards

Privacy Manifest Structure

隐私清单结构

xml
<!-- PrivacyInfo.xcprivacy -->
<?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>
        <!-- Declare every data type you collect -->
    </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>
xml
<!-- PrivacyInfo.xcprivacy -->
<?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>
        <!-- 声明你收集的所有数据类型 -->
    </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>

Required API Reason Codes

必填API原因码

Each API category requires one or more reason codes explaining why the API is accessed:
API CategoryCodeReason
FileTimestamp
C617.1
Access files inside app container
FileTimestamp
3B52.1
Access user-selected files
FileTimestamp
0A2A.1
Third-party SDK accessed on behalf of user
SystemBootTime
35F9.1
Measure elapsed time between events
DiskSpace
E174.1
Check available space before writes
UserDefaults
CA92.1
Access within your own app
UserDefaults
1C8F.1
Access within same app group
ActiveKeyboards
3EC4.1
Customize UI based on active keyboards
每个API类别都需要一个或多个原因码,说明访问该API的理由:
API类别代码原因
FileTimestamp
C617.1
访问应用沙盒内的文件
FileTimestamp
3B52.1
访问用户选择的文件
FileTimestamp
0A2A.1
第三方SDK代表用户访问
SystemBootTime
35F9.1
测量事件之间的耗时
DiskSpace
E174.1
写入数据前检查可用空间
UserDefaults
CA92.1
在自有应用内访问
UserDefaults
1C8F.1
在同一应用组内访问
ActiveKeyboards
3EC4.1
根据活跃键盘自定义UI

Privacy Manifest Keys Reference

隐私清单键参考

KeyTypePurpose
NSPrivacyTracking
BooleanWhether the app tracks users (triggers ATT requirement)
NSPrivacyTrackingDomains
Array of stringsDomains used for tracking (connected only after ATT consent)
NSPrivacyCollectedDataTypes
Array of dictsEach data type collected, its purpose, and whether it is linked to identity
NSPrivacyAccessedAPITypes
Array of dictsEach required-reason API used and the justification codes
类型用途
NSPrivacyTracking
布尔值应用是否跟踪用户(触发ATT要求)
NSPrivacyTrackingDomains
字符串数组用于跟踪的域名(仅在获得ATT同意后连接)
NSPrivacyCollectedDataTypes
字典数组每个收集的数据类型、用途以及是否关联身份
NSPrivacyAccessedAPITypes
字典数组每个使用的必填原因API及对应的理由码

Third-Party SDK Privacy Manifests

第三方SDK隐私清单

Every third-party SDK must include its own privacy manifest. Apple specifically audits these categories of SDKs:
  • Analytics SDKs (Firebase Analytics, Mixpanel, Amplitude)
  • Advertising SDKs (AdMob, Meta Ads SDK)
  • Crash reporting SDKs (Crashlytics, Sentry)
  • Social SDKs (Facebook SDK, Google Sign-In)
Verification steps:
  1. Check each dependency for a
    PrivacyInfo.xcprivacy
    in its bundle
  2. Confirm the SDK's declared API reasons match your actual usage
  3. Update SDKs to versions that include privacy manifests -- older versions may lack them
每个第三方SDK都必须包含自己的隐私清单。苹果会专门审计以下类别的SDK:
  • 分析SDK(Firebase Analytics、Mixpanel、Amplitude)
  • 广告SDK(AdMob、Meta Ads SDK)
  • 崩溃上报SDK(Crashlytics、Sentry)
  • 社交SDK(Facebook SDK、Google Sign-In)
验证步骤:
  1. 检查每个依赖的包中是否包含
    PrivacyInfo.xcprivacy
  2. 确认SDK声明的API原因与实际使用情况匹配 n3. 将SDK升级到包含隐私清单的版本 -- 旧版本可能没有该文件

Collected Data Types Declaration

收集数据类型声明

When declaring
NSPrivacyCollectedDataTypes
, each entry must specify:
  • NSPrivacyCollectedDataType
    -- the category (e.g.,
    NSPrivacyCollectedDataTypeName
    )
  • NSPrivacyCollectedDataTypeLinked
    -- whether linked to user identity
  • NSPrivacyCollectedDataTypeTracking
    -- whether used for tracking
  • NSPrivacyCollectedDataTypePurposes
    -- array of purposes (e.g.,
    NSPrivacyCollectedDataTypePurposeAnalytics
    )
Apple compares your privacy manifest declarations against your App Store privacy nutrition labels and actual network traffic. Mismatches cause rejection.
声明
NSPrivacyCollectedDataTypes
时,每个条目必须指定:
  • NSPrivacyCollectedDataType
    -- 数据类别(如
    NSPrivacyCollectedDataTypeName
  • NSPrivacyCollectedDataTypeLinked
    -- 是否与用户身份关联
  • NSPrivacyCollectedDataTypeTracking
    -- 是否用于跟踪
  • NSPrivacyCollectedDataTypePurposes
    -- 用途数组(如
    NSPrivacyCollectedDataTypePurposeAnalytics
苹果会将你的隐私清单声明与App Store隐私营养标签、实际网络流量进行对比,不匹配会导致拒审。

Data Use, Sharing, and Privacy Policy (Guideline 5.1.2)

数据使用、共享与隐私政策(指南5.1.2)

  • A privacy policy URL must be set in App Store Connect AND accessible within the app
  • The privacy policy must accurately describe what data you collect, how you use it, and who you share it with
  • App Store privacy nutrition labels must match your actual data collection practices
  • Apple cross-references your privacy manifest, nutrition labels, and observed network traffic
  • 必须在App Store Connect中设置隐私政策URL,且应用内也可访问该政策
  • 隐私政策必须准确描述你收集的数据、使用方式以及共享对象
  • App Store隐私营养标签必须与实际数据收集行为匹配
  • 苹果会交叉验证你的隐私清单、营养标签和观测到的网络流量

In-App Purchase and StoreKit Rules (Guideline 3.1.1)

应用内购与StoreKit规则(指南3.1.1)

IAP rules are strict and heavily enforced.
IAP规则非常严格,执行力度大。

What Requires Apple IAP

需要使用苹果IAP的场景

All digital content and services must use Apple's In-App Purchase system:
  • Premium features or content unlocks
  • Subscriptions to app functionality
  • Virtual currency, coins, gems
  • Ad removal
  • Digital tips or donations
所有数字内容和服务必须使用苹果的应用内购系统:
  • 高级功能或内容解锁
  • 应用功能订阅
  • 虚拟货币、硬币、宝石
  • 广告移除
  • 数字打赏或捐赠

What Does NOT Require IAP

不需要使用IAP的场景

  • Physical products (e-commerce)
  • Ride-sharing, food delivery, real-world services
  • One-to-one services (tutoring, consulting booked through the app)
  • Enterprise/B2B apps distributed through Apple Business Manager
  • 实物商品(电商)
  • 网约车、外卖等现实世界服务
  • 一对一服务(通过应用预约的辅导、咨询)
  • 通过Apple Business Manager分发的企业/B2B应用

Subscription Display Requirements

订阅展示要求

  • Price, duration, and auto-renewal terms must be clearly displayed before purchase
  • Free trials must state what happens when they end (price, billing frequency)
  • No links, buttons, or language directing users to purchase outside the app
  • "Reader" apps (Netflix, Spotify) may link to external sign-up but cannot offer IAP bypass
  • 购买前必须清晰展示价格、时长和自动续费条款
  • 免费试用必须说明到期后的规则(价格、计费频率)
  • 不得有链接、按钮或引导语引导用户在应用外购买
  • "阅读器"类应用(Netflix、Spotify)可以链接到外部注册页面,但不得提供绕过IAP的购买途径

StoreKit Implementation Checklist

StoreKit实现检查清单

  • Consumables, non-consumables, and subscriptions must be correctly categorized in App Store Connect
  • Restore purchases functionality must be present and working
  • Transaction verification should use StoreKit 2
    Transaction.currentEntitlements
    or server-side validation
  • Handle interrupted purchases, deferred transactions, and ask-to-buy gracefully
  • 消耗品、非消耗品和订阅必须在App Store Connect中正确分类
  • 必须存在且可用恢复购买功能
  • 交易验证应使用StoreKit 2的
    Transaction.currentEntitlements
    或服务端校验
  • 优雅处理中断的购买、延迟交易和"购买询问"场景

HIG Compliance Checklist

HIG合规检查清单

Navigation

导航

  • Use
    NavigationStack
    (not the deprecated
    NavigationView
    )
  • Back buttons must use the standard system chevron -- do not replace with "X" unless dismissing a modal
  • Tab bars: maximum 5 tabs; use a "More" tab if additional items are needed
  • Avoid hamburger menus -- Apple strongly discourages them on iOS
  • 使用
    NavigationStack
    (不要用已废弃的
    NavigationView
  • 返回按钮必须使用标准系统 Chevron 图标 -- 除非关闭模态页面,否则不要替换为"X"
  • 标签栏:最多5个标签;如果有更多项需要使用"更多"标签
  • 避免使用汉堡菜单 -- 苹果强烈不建议在iOS上使用该模式

Modals and Sheets

模态页和底部弹窗

  • Sheets must have a clear dismiss mechanism (button or swipe-down gesture)
  • Full-screen modals must have a visible close or done button
  • Alerts must use standard system alerts -- custom alert UI that mimics system alerts is rejected
  • 底部弹窗必须有清晰的关闭机制(按钮或下划手势)
  • 全屏模态页必须有可见的关闭或完成按钮
  • 弹窗必须使用标准系统弹窗 -- 模仿系统弹窗的自定义弹窗UI会被拒

System Feature Support

系统功能支持

  • Dark Mode -- the app must not look broken in Dark Mode. Test all screens.
  • Dynamic Type -- text must scale with the user's preferred text size
  • iPad multitasking -- support Slide Over and Split View unless there is a justified exclusion
  • Dynamic Island and Live Activities -- if used, they must display correctly at all sizes
  • System gestures -- do not disable swipe-from-edge or home indicator gestures
  • 深色模式 -- 应用在深色模式下不能显示异常,需测试所有页面
  • 动态字体 -- 文本必须随用户偏好的字体大小缩放
  • iPad多任务 -- 支持侧拉和分屏浏览,除非有合理的排除理由
  • 灵动岛和实时活动 -- 如果使用了该功能,必须在所有尺寸下都显示正常
  • 系统手势 -- 不要禁用边缘滑动手势或Home指示条手势

Widgets and Live Activities

小组件和实时活动

  • Widgets must show real, useful content -- no "Open app to see more" placeholders
  • Widget timelines must update meaningfully; static widgets that never change are rejected
  • Live Activities must display genuinely live, time-sensitive information
  • Lock Screen widgets must be legible and functional at small sizes
  • 小组件必须展示真实有用的内容 -- 不要使用"打开应用查看更多"这类占位内容
  • 小组件时间线必须有意义地更新;永远不变的静态小组件会被拒
  • 实时活动必须展示真实的、时间敏感的信息
  • 锁屏小组件在小尺寸下必须清晰可读且功能正常

Launch Screen

启动页

  • The launch screen must not be an ad or splash page that delays app usage
  • Use a static launch storyboard or a simple branded screen that transitions quickly
  • 启动页不得是广告或延迟应用使用的闪屏页
  • 使用静态启动故事板或简单的品牌页面,快速过渡到应用内容

Empty States

空状态

  • Every screen that can be empty must show guidance (e.g., a call to action or explanation)
  • "Nothing here yet" without direction is insufficient
  • 每个可能为空的页面都必须提供引导(比如行动号召或说明)
  • 仅显示"暂无内容"没有任何引导是不够的

App Tracking Transparency (ATT)

应用跟踪透明度(ATT)

When ATT Is Required

需要使用ATT的场景

If your app tracks users across other companies' apps or websites, you must:
  1. Request permission via
    ATTrackingManager.requestTrackingAuthorization
    before any tracking occurs
  2. Respect the user's choice -- do not track if the user denies permission
  3. Not gate app functionality behind tracking consent ("Accept tracking or you cannot use this app" is rejected)
  4. Provide a clear purpose string in
    NSUserTrackingUsageDescription
    explaining what tracking is used for
如果你的应用会跨其他公司的应用或网站跟踪用户,你必须:
  1. 在任何跟踪行为发生前,通过
    ATTrackingManager.requestTrackingAuthorization
    请求权限
  2. 尊重用户的选择 -- 如果用户拒绝权限则不得进行跟踪
  3. 不得将应用功能与跟踪同意绑定("接受跟踪才能使用应用"会被拒)
  4. NSUserTrackingUsageDescription
    中提供清晰的用途说明,解释跟踪的用途

When ATT Is NOT Required

不需要使用ATT的场景

If you do not track users across apps or websites, do not show the ATT prompt. Apple rejects unnecessary ATT prompts.
如果你不会跨应用或网站跟踪用户,不要显示ATT弹窗。苹果会拒审不必要的ATT弹窗。

ATT Implementation

ATT实现

swift
import AppTrackingTransparency

func requestTrackingPermission() async {
    let status = await ATTrackingManager.requestTrackingAuthorization()
    switch status {
    case .authorized:
        // Enable tracking, initialize ad SDKs with tracking
        break
    case .denied, .restricted:
        // Use non-personalized ads, disable cross-app tracking
        break
    case .notDetermined:
        // Should not happen after request, handle gracefully
        break
    @unknown default:
        break
    }
}
Timing: Request ATT permission after the app has launched and the user has context for why tracking is being requested. Do not show the prompt immediately on first launch.
swift
import AppTrackingTransparency

func requestTrackingPermission() async {
    let status = await ATTrackingManager.requestTrackingAuthorization()
    switch status {
    case .authorized:
        // 启用跟踪,初始化带跟踪能力的广告SDK
        break
    case .denied, .restricted:
        // 使用非个性化广告,禁用跨应用跟踪
        break
    case .notDetermined:
        // 请求后不会出现该状态,优雅处理即可
        break
    @unknown default:
        break
    }
}
时机: 在应用启动后,用户了解请求跟踪的原因后再申请ATT权限。不要在首次启动时立刻弹出权限申请。

EU Digital Markets Act (DMA) Considerations

欧盟数字市场法案(DMA)注意事项

For apps distributed in the EU:
  • Alternative browser engines are permitted on iOS in the EU
  • Alternative app marketplaces exist -- apps may be distributed outside the App Store
  • External payment links may be allowed under specific conditions, with Apple's commission structure adjusted
  • Notarization is required even for sideloaded apps distributed outside the App Store
  • Apps using alternative distribution must still meet Apple's notarization requirements for security
针对在欧盟分发的应用:
  • 欧盟地区的iOS允许使用替代浏览器引擎
  • 存在替代应用市场 -- 应用可以在App Store外分发
  • 符合特定条件时允许使用外部支付链接,苹果的佣金结构会相应调整
  • 即使是在App Store外分发的侧载应用也需要完成公证
  • 使用替代分发渠道的应用仍然需要满足苹果的公证安全要求

Entitlements and Capabilities

权限与能力

Every entitlement must be justified. Apple reviews these closely:
EntitlementApple Scrutiny
CameraMust explain purpose in
NSCameraUsageDescription
Location (Always)Must have clear, user-visible reason for background location
Push NotificationsMust not be used for marketing without user opt-in
HealthKitMust actually use health data in a meaningful way
Background ModesEach mode (audio, location, VoIP, fetch) must be justified and actively used
App GroupsMust explain what shared data is needed
Associated DomainsUniversal links must actually resolve and function
每个权限都必须有合理理由,苹果会严格审核:
权限苹果审核力度
相机必须在
NSCameraUsageDescription
中说明用途
位置(始终允许)必须有清晰的、用户可见的后台定位使用理由
推送通知未经用户同意不得用于营销
HealthKit必须实际以有意义的方式使用健康数据
后台模式每个模式(音频、定位、VoIP、拉取)都必须有合理理由且实际使用
应用组必须说明需要共享哪些数据
关联域名通用链接必须真实可解析且功能正常

Usage Description Strings

用途说明字符串

Usage descriptions in Info.plist must be specific about what data is accessed and why:
// REJECTED -- too vague
"This app needs your location."

// APPROVED -- specific purpose
"Your location is used to show nearby restaurants on the map."

// REJECTED -- too vague
"This app needs access to your camera."

// APPROVED -- specific purpose
"The camera is used to scan barcodes for price comparison."
Apple rejects vague usage descriptions. Always state what the data is used for in user-facing terms.
Info.plist中的用途说明必须明确说明访问什么数据以及原因:
// 会被拒 -- 太模糊
"该应用需要获取你的位置。"

// 会通过 -- 用途明确
"你的位置用于在地图上展示附近的餐厅。"

// 会被拒 -- 太模糊
"该应用需要访问你的相机。"

// 会通过 -- 用途明确
"相机用于扫描条形码进行价格对比。"
苹果会拒审模糊的用途说明。始终以用户可理解的语言说明数据的使用场景。

Common Mistakes

常见错误

  1. Missing demo credentials. Provide App Review login credentials in App Store Connect notes. Most Guideline 2.1 rejections are from reviewers unable to test behind a login.
  2. Privacy manifest mismatch. Declared data collection in PrivacyInfo.xcprivacy must match App Store privacy nutrition labels and actual network traffic.
  3. Unnecessary ATT prompt. Do not show the App Tracking Transparency prompt unless you actually track users across apps or websites. Apple rejects unnecessary prompts.
  4. Vague usage descriptions. "This app needs your location" is rejected. State the specific feature that uses the data.
  5. External payment links for digital content. Any language or button directing users to purchase digital content outside the app is rejected.
  6. Missing concurrency annotations. Ensure ATT request and StoreKit calls run on
    @MainActor
    or appropriate actor context. Mark shared state types as
    Sendable
    for Swift 6 concurrency safety.
  1. 缺失演示凭证。 在App Store Connect备注中提供审核用的登录凭证。大多数指南2.1的拒审都是因为审核人员无法测试登录后的功能。
  2. 隐私清单不匹配。 PrivacyInfo.xcprivacy中声明的数据收集必须与App Store隐私营养标签、实际网络流量一致。
  3. 不必要的ATT弹窗。 除非你确实会跨应用或网站跟踪用户,否则不要显示应用跟踪透明度弹窗。苹果会拒审不必要的弹窗。
  4. 模糊的用途说明。 "该应用需要你的位置"会被拒,说明使用该数据的具体功能。
  5. 数字内容的外部支付链接。 任何引导用户在应用外购买数字内容的文字或按钮都会被拒。
  6. 缺失并发注解。 确保ATT请求和StoreKit调用在
    @MainActor
    或合适的Actor上下文运行。将共享状态类型标记为
    Sendable
    以满足Swift 6并发安全要求。

Pre-Submission Checklist

提交前检查清单

Completeness

完整性

  • No placeholder content, test data, or lorem ipsum anywhere in the app
  • All features functional without special hardware
  • Demo credentials provided in App Review Information notes
  • No dead-end screens or broken navigation flows
  • 应用中无任何占位内容、测试数据或假文示例
  • 所有功能无需特殊硬件即可正常运行
  • 在审核信息备注中提供了演示凭证
  • 无死胡同页面或失效的导航流程

Metadata

元数据

  • App name matches functionality
  • Screenshots are actual app screenshots (not mockups)
  • Description contains no prices, platform references, or competitor names
  • App category is correct for the primary function
  • 应用名称与功能匹配
  • 截图是真实的应用截图(不是原型图)
  • 描述中没有价格、其他平台提及或竞品名称
  • 应用分类与核心功能匹配

Privacy

隐私

  • PrivacyInfo.xcprivacy
    present with all required API reason codes
  • All third-party SDKs include their own privacy manifests
  • Privacy policy URL set in App Store Connect and accessible in-app
  • App Privacy nutrition labels match actual data collection
  • ATT prompt shown only if tracking occurs, and only before tracking begins
  • NSPrivacyTracking
    set correctly (true only if cross-app tracking occurs)
  • 已提供
    PrivacyInfo.xcprivacy
    ,包含所有必填的API原因码
  • 所有第三方SDK都包含自己的隐私清单
  • App Store Connect中已设置隐私政策URL,且应用内可访问
  • 应用隐私营养标签与实际数据收集行为匹配
  • 仅在需要跟踪且跟踪行为开始前才显示ATT弹窗
  • NSPrivacyTracking
    设置正确(仅在跨应用跟踪时为true)

Payments

支付

  • All digital content uses Apple IAP
  • Subscription terms clearly displayed (price, duration, renewal behavior)
  • No external payment links for digital content
  • Free trial clearly states post-trial pricing
  • Restore purchases button present and functional
  • 所有数字内容都使用苹果IAP
  • 订阅条款清晰展示(价格、时长、续费规则)
  • 没有数字内容相关的外部支付链接
  • 免费试用明确说明试用后的价格
  • 恢复购买按钮存在且功能正常

Design

设计

  • Standard navigation patterns used (
    NavigationStack
    , tab bars)
  • Dark Mode renders correctly on all screens
  • Dynamic Type supported -- text scales properly
  • No custom alerts mimicking system alerts
  • Launch screen is not an ad or extended splash
  • Empty states provide guidance or calls to action
  • 使用标准导航模式(
    NavigationStack
    、标签栏)
  • 所有页面在深色模式下渲染正常
  • 支持动态字体 -- 文本可正常缩放
  • 没有模仿系统弹窗的自定义弹窗
  • 启动页不是广告或过长的闪屏
  • 空状态提供了引导或行动号召

Technical

技术

  • Built with current Xcode GM release
  • No private API usage
  • No dynamic code download or execution
  • All entitlements justified with specific usage descriptions
  • All background modes justified and actively used
  • Minimum deployment target covers latest two major iOS versions
  • 使用当前Xcode GM版本构建
  • 无私有API使用
  • 无动态代码下载或执行
  • 所有权限都有明确的用途说明支撑
  • 所有后台模式都有合理理由且实际使用
  • 最低部署版本覆盖最新两个大版本iOS系统