新应用信息包 是做什么的?
将苹果的“我们需要更多信息”请求转化为一个文件。用户在 App Store Connect 中回复该文件,并将其粘贴到 App 审核信息的“备注”字段中,以便未来的提交也能包含此信息。录制部分是唯一需要用户自行完成的部分。
苹果要求的六项内容
每个信息包都会按以下顺序回答全部六项(编号 1-6),即使苹果发来的消息中缺少某项或表述不同。如果苹果的消息中添加或更改了某项,请遵循苹果的版本,并注明差异。
| # | 苹果要求的内容 | 回答来源 |
|---|---|---|
| 1 | 在运行最新操作系统的物理设备上捕获的屏幕录像。录像必须从启动应用开始,展示典型的用户流程,包括(如果应用包含):账户注册、登录和账户删除;用户生成内容及其举报和屏蔽功能;以及访问付费内容或功能。 | 第 1 部分(镜头列表)+ 回复 §1 |
| 2 | 应用的目的和目标受众:它解决的问题和提供的价值。 | 回复 §2 |
| 3 | 设置和访问主要功能的说明,包括任何必需的登录凭据或示例文件。 | 回复 §3 |
| 4 | 用于核心功能的外部服务、工具或平台(数据提供商、认证、支付处理器、AI 服务)。 | 回复 §4 |
| 5 | 功能或内容上的任何地区差异,或确认应用在所有地区功能一致。 | 回复 §5 |
| 6 | 针对高度受监管行业或受保护第三方材料:显示授权的文档或凭据。 | 回复 §6 |
硬性规则
- 录制必须在物理设备上进行,使用最新操作系统,一次完成无编辑的正常速度拍摄,从点击应用图标开始。 切勿提供模拟器录制或加速编辑版本作为提交材料。你无法操控用户的手机,因此录制工作由用户自行完成;你的工作是提供镜头列表。
- 仅陈述构建中实际包含的内容。 每个功能、服务和语言都必须来自代码,而非计划或笔记。
- 不适用也是答案。 用一句话给出,并说明原因(例如“应用无账户注册或登录功能”)。
- 账户: 如果用户可以创建账户,则必须提供账户删除功能,且必须在录像中展示;如果缺失,请将其报告为阻塞项。如果存在登录功能,则第 3 项需要提供演示凭据(每种账户类型一套):告知用户在 App Store Connect 中输入这些凭据。切勿在文件中写入真实密码。
- 切勿在 App Store Connect 中发送、提交或编辑任何内容。 用户粘贴回复并附加视频。
- 尽可能从仓库或设备中填写每个占位符。 列出剩余的占位符及其需要填写的内容。
第 1 步:阅读苹果的消息
如果用户粘贴了苹果的消息,请检查其编号项与上表的对应关系,并注意哪些录制条件(账户、用户生成内容、付费内容)适用于此应用。
第 2 步:基于代码进行分析
读取已提交构建版本的代码,而非工作副本(先锁定该版本,如第 6 步 → 审核构建,第 0 步所述)。工作副本通常是一个包含未发布功能的分支,向苹果描述这些功能相当于声称某个他们尚未看到的构建中包含这些功能。使用 git grep <模式> <提交> -- <路径> 和 git show <提交>:<路径>。
在每次搜索中排除 build、Pods、.dart_tool、node_modules 和 .git。
| 项目 | 查找位置 |
|---|---|
| 1, 3:从启动开始的主要流程 | 路由器和屏幕;引导流程;核心循环 |
| 1, 3:账户、登录、删除 | firebase_auth、sign_in_with_apple、supabase、Auth、login、signUp、deleteAccount、delete.*data |
| 1:用户生成内容 | 发帖、评论、聊天、上传;report、block、flag |
| 1, 3:付费内容 | purchases_flutter、revenuecat、StoreKit、product_id、付费墙页面。找出哪些功能被限制、是否有免费试用、付费墙何时出现以及“恢复购买”功能的位置。 |
| 1:屏幕截图拦截 | no_screenshot、isSecureTextEntry 技巧、UIScreen.capturedDidChange、FLAG_SECURE。被拦截的屏幕在录像中显示为空白,因此回复必须说明原因。 |
| 2:目的和受众 | App Store 描述文本、品牌或语音文档、README、发布清单、引导流程文案(.arb、.strings、strings.xml) |
| 3:示例文件 | 文件导入、文档选择器、QR/条码扫描、应用所需的硬件 |
| 4:外部服务 | 依赖项(pubspec.yaml、Podfile、package.json、Gradle)和构建定义(--dart-define、密钥文件、发布脚本)。对于每个服务:说明其功能以及它获取了哪些数据。仅列出发布版本实际启用的 SDK。 |
| 5:地区 | 已上架的本地化语言包;区域检查(locale、countryCode、region);特定地区的价格、功能或内容。 |
| 6:受监管或受保护 | 健康、医疗、金融、赌博、法律或儿童相关的内容和声明;许可内容、音乐、图片、字体及其许可证。 |
| 联系方式 | 设置中的支持邮箱、隐私文档和网站文件。 |
| 平台 | IPHONEOS_DEPLOYMENT_TARGET、TARGETED_DEVICE_FAMILY(仅 iPhone,或也包含 iPad) |
检查第 4 项中的分析措辞是否与仓库中的隐私政策匹配。如果不匹配,或无法确认 App Store Connect 中 App 隐私权限的回答,请标记出来。
第 3 步:设备和操作系统(第 1 项)
xcrun devicectl list devices显示已配对的设备。选择用户可用且正在使用的 iPhone。xcrun devicectl device info details --device <id> | grep -i osVersion显示其 iOS 版本。- 在网上搜索最新的 iOS 版本。如果手机系统版本落后,请告知用户:用户在录制前需前往“设置” → “通用” → “软件更新”进行更新,然后你再次读取版本。更新手机系统是用户的责任。
- 如果没有手机配对,请保留
[iOS 版本]占位符,并告知用户在哪里可以找到此信息(“设置” → “通用” → “关于本机”)。
第 4 步:预防常见问题
检查苹果列出的每个常见问题,并将结果报告给用户。这些检查是给用户看的,不属于回复内容。
| 指南 | 检查项目 |
|---|---|
| 2.1 Bug 和崩溃 | 录像使用的是已提交版本的 TestFlight 构建,且在真实设备上运行。从 TARGETED_DEVICE_FAMILY 确认支持的平台:如果支持 iPad,告知用户也应在 iPad 上进行测试。 |
| 2.1 访问应用 | 登录 → 演示凭据已在 App Store Connect 中输入(每种账户类型一套),并且仍正常工作。 |
| 2.3.3 屏幕截图 | 列出商店截图(例如 app-store-assets/*screenshots*)。标记任何看起来仅包含标题图、启动画面或登录页面的截图。 |
| 3.1.1 内购 | 代码中的每个产品 ID 都已配置在 App Store Connect 中,并关联到此提交。列出 ID 供用户检查。 |
| 3.2 其他商业模式 | 如果应用是针对单一企业、组织或其员工,则标记该应用可能需要不同的分发选项(自定义应用或非公开分发)。 |
第 5 步:编写文件
如果 app-store-assets/ 文件夹存在,则将文件写入 app-store-assets/new-app-info.md,否则写入 ./new-app-info.md。保持以下格式(完整示例见 examples/seven-minute-math/new-app-info.md):
# App 审核信息 — <应用名称>
在 App Store Connect 中使用第 2 部分进行回复,并附上录像。然后将第 2 部分粘贴到
App 审核信息 → 备注中,以便未来的提交也能包含此信息。
<仍需填写的占位符(如有)。>
## 第 1 部分 — 屏幕录像(第 1 项;请自行录制)
原因:物理设备、最新操作系统、一次拍摄、正常速度、从点击图标开始。
设置(默认:从 Mac 安装的发布版本;参见“审核构建”):
创建一个沙盒测试员(App Store Connect → 用户和访问 → 沙盒 → 测试账户);
从手机上删除应用;你构建并安装审核构建版本;在控制中心打开屏幕录制(关闭麦克风);
开启勿扰模式;使用沙盒测试员账户登录苹果的购买面板(显示“沙盒”字样是正常的)。
按编号列出镜头:点击图标 → 引导流程 → 完整的典型用户流程 → 结果 →
所有适用的录制条件(注册、登录、删除账户;发帖、举报、屏蔽;
付费墙、沙盒购买、解锁的功能、恢复购买)→ 用户如何删除其数据 → 停止。
任何将显示为空白(因截图拦截)的屏幕及其原因。
## 第 2 部分 — 回复(粘贴此部分)
问候语,以及录制使用的设备和 iOS 版本。
**1. 屏幕录像** … **6. 受监管行业/第三方材料**:每个项目一个加粗标题。
结尾行包含支持邮箱。
编写时注意:
- §1:说明录像展示的内容、哪些录制条件不适用及其原因,以及任何空白屏幕。
- §2:说明目标用户、要解决的问题、应用如何解决该问题以及其价值。三到四句话。
- §3:说明开始使用所需的内容(凭据放在 App Store Connect 中,切勿放入文件),然后以简短列表形式说明主要功能,区分免费与付费功能以及付费墙出现时机。
- §4:每个服务一个项目符号,说明其功能。然后一行说明应用未使用的服务(如 AI、数据提供商、认证),前提是情况属实。
- §5:说明语言和任何地区差异,或“在所有地区功能一致”。
- §6:提供文档,或说明“不适用”并附上原因。
- 语言应简洁、基于事实且礼貌。避免营销性语言。
第 6 步:完整流程视频(第 1 项)
审核构建
录制当前正在审核的精确版本的发布构建,该版本需从 Mac 直接安装到手机上。你负责构建和安装,用户负责录制。
- 锁定已提交的版本。 向用户询问 App Store Connect 中当前审核提交的版本号和构建号(例如 1.0.0 (1)),除非用户已提供。找到生成该版本的提交:发布标签、发布或主分支、包含“shipped to the App Store”等信息的提交消息,或设置该版本和构建号的
pubspec.yaml/Info.plist所在提交。如果有两个提交可能匹配,请询问用户选择哪一个。切勿从工作副本构建: 它通常位于包含未提交更改的特性分支上,苹果尚未见过。应在隔离的工作树中构建(git worktree add --detach <scratch>/review-build <commit>)。使用cp命令复制任何被 git 忽略的密钥文件(如keys.json)到其中,不要读取文件内容。告知用户你正在构建哪个提交,以及哪些较新分支上的内容不会出现在视频中。 - 查找项目正常的设备构建方式(运行脚本、
tool/*.sh、Makefile、Fastlane)。移除所有模拟购买的标记,例如DUMMY_PURCHASES、MOCK、FAKE、USE_TEST_STORE、RevenueCat 的test_密钥或 StoreKit 配置文件。模拟购买永远不会显示苹果的购买面板,如果审核员看到付费功能在未出现此面板的情况下解锁,可能会视为规避内购(3.1.1)。通过密钥前缀(例如 `grep -q '