App Store 的拒审大多不是难题。按我们的经验,多半是没人仔细看过的小事:副标题里多了一个词,内购没挂到版本上,一张截图带了透明通道。提交前在真机上手动把这样一份清单过一遍会很有帮助,顺序就是实际操作的顺序。每一项都写了原因和去哪里查。
为什么是这个顺序
- 先查构建。 换了构建,所有依赖构建的东西都得重查:权限文案、隐私清单、截图里的界面。
- 再查文案和素材。 版本进入“等待审核”之后,App Store Connect 不允许再上传或修改截图和预览视频,图错了只能先把版本撤出审核。
- 最后查内购和备注。 它们依赖最终的构建和最终的文案,也是最后十分钟里最容易忘的。
构建
- 用的是发布签名。 开发签名的构建可以正常上传,提交后却可能变成 Invalid Binary(无效二进制)。用我们的 描述文件查看器 打开内嵌的描述文件,确认是 App Store 类型,且权限列表里没有
get-task-allow。 - 每一项权限(entitlement)都说得出理由。 一句话解释不清的就删掉。权限开得过宽,在 Mac App Store 上本身就是拒审理由,见 Mac App Store 提审清单。
- 隐私清单在包里。 Apple 文档写明,自 2024 年 5 月 1 日起,用到“需要声明原因的 API”(required reason API)却没在
PrivacyInfo.xcprivacy里写明原因的应用,App Store Connect 不再接收。可以用 隐私清单生成器 生成或检查。 - 每个权限都有用途说明,而且是在解释。 代码碰到的每一类受保护资源,Apple 都要求有用途说明(purpose string)。写清楚拿来做什么,不要施压(“不允许就用不了”),那在 5.1.1 下会被视为强迫授权。用 IPA 检查器 直接从
.ipa里读出这些文案核对。 - 出口合规键已经设置。
Info.plist里没有ITSAppUsesNonExemptEncryption的话,每次上传 App Store Connect 都会让你重新回答出口合规问题。只有确实不用加密、或只用豁免加密时才设成NO。 - 调试开关不进正式包。 测试时用来解锁付费功能、或显示占位价格的开关,必须放在
#if DEBUG里。指南 2.5.19 禁止隐藏或未说明的功能,正式包里留着一个免费解锁开关,正好就是这种情况。 - 图标来自同一张不透明的 1024 × 1024 原图。 用 App 图标生成器 一次生成整套,避免某个尺寸是旧图或带透明。
- 通用链接能打开。 如果用了 associated domains,在审核员点链接之前,先用 AASA 校验工具 检查线上的
apple-app-site-association文件。 - 列出的每种语言都翻译完了。 把字符串目录拖进 xcstrings 翻译进度。完成度 70% 的语言,界面中间会突然冒出英文。
- 冷启动没问题,iPhone 和 iPad 都试过。 在干净的设备上安装,拒绝所有权限,在没有数据的情况下走一遍首次路径。在我们的送审记录里,只支持 iPhone 的应用也是在 iPad Air 上审的;指南 2.4.1 也写了 iPhone 应用应尽可能能在 iPad 上运行。详见 2.1:App 完整性。
商店文案
- 每个字段都在 Apple 的长度限制内。 名称 30 字符,副标题 30,推广文本 170,描述 4000,更新说明 4000,关键词 100。把每个语言粘进 App Store 元数据检查工具。
- 关键词字段里没有浪费的词。 名称或副标题里已有的词、已有词的复数形式,都是浪费。完整规则见 关键词字段怎么填。
- 没有价格词。 名称、副标题或截图里出现“免费”“5 折”或价格,会招来 2.3.7。见 价格词指南。
- 没有别人的品牌。 副标题或关键词里写竞品名字,是 4.1(c) 或 5.2.5 的问题。见 元数据里的品牌名。
- 商店名和图标下面的名字一致, 每种语言都要一致。见 2.3.8:名字对不上。
- 付费功能有标注。 描述里提到需要购买的功能,要写明。见 2.3.2:付费功能。
- 更新说明写的是真实改动。 指南 2.3.12 只允许 bug 修复和小改进用笼统的说明。
- 推广文本不是第二个关键词栏。 Apple 明确说推广文本不影响搜索排名,用它写当下的新内容就好。
- 技术支持和隐私政策链接都能打开。 Apple 把失效链接列为最常见的审核问题之一。
截图与预览
- 截图尺寸被接受,且没有 alpha 通道。 App Store Connect 要求至少一张“带灵动岛的 iPhone(中尺寸屏)”截图,支持 iPad 的话还要 13 英寸 iPad 截图;帮助文档也写明图片不能带 alpha 通道或透明。用 截图尺寸工具 检查并修正。
- 截图拍的是真实应用,是免费用户看到的样子。 不是启动页,也不是这个构建里没有的功能。见 2.3.3:截图。
- 预览视频符合规格。 15 到 30 秒,最高 30 帧每秒,内容只能是应用本身的录屏(指南 2.3.4)。用 预览视频检查工具 查一下文件。
App 内购买
- 每个商品都和版本在同一个提交里。 Apple 帮助文档的原话是,版本、订阅组和所有要一起审的内购 "must all be added to the same draft submission before you click Submit for Review"(必须在点提交之前加进同一个草稿提交);每种类型的第一个内购必须随新版本一起提交。你不加,它们就不会跟着走。我们漏过一个,结果就是一封 2.1(b) 拒审。
- 付费墙在真机和 iPad 上都能用。 商品能加载,购买按钮有反应,恢复购买正常。付费墙卡住是 2.1(a),而审核员手里可能是一台 iPad。
- 价格是想清楚之后定的。 用 佣金计算器 算一下扣掉 Apple 分成后你实际拿到多少。
审核备注和演示账号
- 备注里写清楚不好找的东西。 付费功能在哪里;每一种后台模式拿来做什么(见 2.5.4:后台模式);如果应用的网络功能看起来像 VPN,说明它实际做什么(见 VPN 问卷)。备注最多 4000 字节。
- 演示账号能登录,而且不会过期。 应用没有登录的话,确认没有勾选“需要登录”。联系电话要按国际格式填,不带国家代码的纯数字填不进去。
提交之后
- 别去动它。 Apple 说通常至少 50% 的提交在 24 小时内审完,90% 在 48 小时内。版本发布方式(手动、过审即发布、指定日期)在提交前选好,别等过审再想。
- 如果被拒, 先看清条款编号再动手。一步步的处理方法见 被拒之后怎么办。
- 上架之后, 用我们的 App Store 排名查询 看应用在各国榜单里的位置;卖订阅的话,用 订阅指标计算器 跟踪数据。
一分钟自检
如果只有一分钟,就做最容易漏掉的三件事:打开版本页,确认每个内购都在这次提交里;把每个语言的副标题粘进 元数据检查工具;在 iPad 模拟器上启动一次构建。更多发版用的浏览器工具在 工具箱页面。
以上参考了 Obelisk Club 自己的应用收到过的拒审。Apple 的措辞和 App Store Connect 都会变,提交前请以当前 App Review 指南和 App Store Connect 帮助文档为准。