你传了 build、填好了 demo 账号的用户名密码,一天内提交状态翻成 Rejected(旧状态显示为 Metadata Rejected),Resolution Center 附一句 “We were unable to sign in to the app with the credentials you provided” 或 “login error: invalid credentials”。你自己手机上同账号能用得好好的。审核员从陌生 IP(多半是 Cupertino,或中国区团队走别区的 VPN 出口)、一台干净设备、零缓存会话进你后端,账号要么撞上某条安全策略,要么本来在你测试环境之外就跑不起来。
这是 Guideline 2.1(Information Needed)拒回里最常见的一种,也是最快能修好的,前提是你能精确判断审核员那边到底为什么登不上。
只做一件事的话: 在一台抹干净、关掉自动填充的设备上,照 App Review notes 里的字面冷登一次(下面 Step 1)。约 70% 的拒回会当场复现:要么弹 2FA,要么首页空白,要么账号被锁。看到什么修什么,再重交即可。Demo 账号修复属于 metadata-only,不需要重新打包。
先判断你属于哪一类
| 干净冷登时的现象 | 最可能原因 | 跳到 |
|---|---|---|
| 密码过了,接着弹一个你拿不到的验证码 | 2FA / 短信 / 邮箱验证 | 原因 2、Step 3 |
密码明明对,却回 401 / “invalid credentials” | 后端安全锁(地域 / 限速) | 原因 1、Step 2 |
| 怎么输都登不上 | 账号失效 / 被删,或 notes 抄错 | 原因 3-4、Step 4 |
| 登进去了,但首页一片空白 | 内容有地域锁或没预置数据 | 原因 5、Step 5 + 地域说明 |
| Auth 接口超时 / 连不上 | build 指向挂在 Access/VPN 后的 staging | 原因 6 |
常见原因
按命中率排序,约 70% 是 #1 或 #2。
1. 后端安全策略锁了账号
你的 auth 服务(Auth0、Firebase Auth、Cognito、Supabase 或自建)看到同一账号在异常 geo / IP / user-agent 下反复登录,触发了限速、地域拦截或”可疑活动”自动锁。审核员看到的是一个长得像密码错误的 401,其实是被锁了。
如何判断:去 auth provider 后台查 demo 用户的失败记录,时间锁定在审核窗口。Apple 持有整个 17.0.0.0/8 段,审核流量常从这里来,但 Apple 并未公布官方审核出口段,部分审核还会走云 / VPN 段(中国区审核出口可能在别处)。所以主要靠失败登录的时间戳对齐,不光看 IP。出现 “account locked” 或 “too many attempts” 就是它。
2. demo 账号要 2FA 或 SMS / 邮箱验证
审核员输完密码,App 弹出短信 / 邮箱二次验证,他拿不到那个手机号或邮箱,放弃。你自己手机已经登过,从来没在冷启动设备上验过完整流程。
如何判断:完全登出、抹掉 App 数据、重装,在一台从没登过这个账号的设备上用 demo 凭证登一次。出现 2FA 弹窗就是同一堵墙。
3. 两次提交之间账号过期或被删
v1.0 提交时建的 demo 账号,半年过去你的清理脚本顺手清了非活跃账号,或者密码被轮换,或者某个同事手抖禁用了用户。notes 里的凭证已经失效。
如何判断:管理后台搜 demo 账号,看 last_login、disabled_at、password_changed_at。任何一个比 notes 里的凭证还新,账号就是死的。
4. App Review notes 里的凭证抄错
0 和 O、l 和 1、行尾空格、从文档复制带过来的智能引号、或字段标签写错(写 “username” 但 App 要 email)。审核员就是按你写的一字不差输入。
如何判断:照 App Store Connect Sign-In 字段里的原样取凭证(你的 App → 版本页 → App Review Information → Sign-In required → User Name / Password),粘进生产登录表单。哪怕错一个字符都会被拒。
5. 登录后的功能有地域锁
审核员在美区(或你被分到的审核区),账号基础登录能过,但首页空空如也,因为内容被地域限制锁在审核员去不到的区。他认为登录坏了,因为 App 看起来死了。
如何判断:查你的内容 / 功能 gating 逻辑。如果同区登录用户落地是空状态,你要么给那个区准备样本数据,要么按 Apple 对”审核员够不到的功能”的官方建议,在 Notes 字段里贴一段短演示视频链接,展示被锁功能能正常跑。
6. App 接的是另一套环境(sandbox / staging),审核员根本进不去
你给 App Review 的生产 build 指向 staging,而 staging 域名挂在 Cloudflare Access 或公司 VPN 后。审核员连 auth 接口都打不到。
如何判断:反编译或 strings 一下 build,查 API base URL。如果是 staging.api.yourapp.com 而你有 Cloudflare Access 规则,就是它。
动手前先确认
- 弄清问题是只在 demo 账号上、还是所有账号都登不上。Resolution Center 回复的写法不同:只锁这个账号说明是锁定或凭证失效,所有账号都登不上说明 auth 发布坏了。
- 完整记下审核员原文,“could not sign in” 和 “login failed with error X” 对应的修复方向不同。
- 改 auth 规则前先备份当前配置(限速表、geo-block 表、MFA 强制开关)。
- 确认你的 auth provider 套餐是否还覆盖 demo 用户。有些 provider 在免费 MAU 超额时会静默禁用账号。
需要收集的信息
- 审核员完整原文 + 引用的 Guideline 编号(2.1 vs 4.0 修法不同)。
- 过去 48 小时内 demo 用户在 auth provider 的全部日志。
- App Store Connect Sign-In 字段里凭证的每一个字符(注意行尾空格、智能引号)。
- 当前生效的限速 / geo-block / MFA 强制规则。
- 一台从没登过这个账号的设备,用来重做冷启动测试。
最短修复路径
Step 1:用全新设备冷测凭证
借一台手机或开一个干净模拟器,Settings → General → Reset → Erase All Content and Settings,装上当前生产 build(TestFlight 或 App Store 装上一版),完全按 App Review notes 里的字面登录,禁用 Keychain 自动填充。60 秒内进不到首页就先修这一步。
Step 2:在 auth 后端解锁 demo 用户
Auth0 / Firebase / Cognito / Supabase / 自建库:
# Firebase Auth 示例
firebase auth:export users.json --project your-project
# 找到 demo 用户,确认 disabled=false, emailVerified=true
# 或用 Admin SDK
node -e "const a=require('firebase-admin');a.initializeApp();a.auth().updateUser('UID',{disabled:false,emailVerified:true})"
用户在限速表里就清掉条目;在地域拦截表里就把它单独白名单,或者把 Apple IP 段(17.0.0.0/8)只对这个账号放行。
Step 3:给 demo 用户摘掉 2FA + 验证
用户表里 mfa_enabled = false、requires_phone_verification = false、requires_email_verification = false。如果代码层强制全局 2FA,加一个 feature flag 豁免邮箱匹配 apple-review-*@yourdomain.com 的账号。
Step 4:填好 App Store Connect Sign-In 字段和 Notes
凭证要放进结构化字段,不要埋在大段文字里。你的 App → 版本页 → App Review Information → 勾上 Sign-In required,把准确的 demo 值填进 User Name 和 Password。Notes 字段只用来写上下文(验证码、地域行为、第二个账号)。
Notes 字段粘成:
Demo account: credentials are in the Sign-In fields above.
Login: tap "Sign In" on launch (no separate URL).
This account is reset on each submission and is single-device.
No 2FA is enforced for this user. Region-locked features are
pre-enabled; ignore the location prompt.
如果 App 有多种账号类型(admin vs 普通用户),每套都补写进 Notes;任何账号需要一次性验证码,也在这里贴一个当前有效的码。用直引号、ASCII 字符,避免智能标点,去掉行尾空格。别写 “see attached”——Apple 在审核工具里不一定显示附件,改贴视频链接。
Step 5:给账号预置样本数据 + 排除统计
冷登录后看到空首页照样触发 2.1。给 demo 用户预置 3 条样本文档 / 消息 / 歌单,让首屏有真实内容。同时把账号标 is_internal = true,别污染你的分析数据。
Step 6:重新提交(不需重传 build)
打开被拒的版本,改好 Sign-In 字段和 Notes,点 Submit for Review(老账号可能先显示 Add for Review 再 Submit)。Demo 账号修复属于 metadata-only,不用重新打包。如果审核员是在 Resolution Center 里提的问,记得在那条线程里回复确认你已改,因为闷头重交可能被卡在那条未结线程后面。
怎么确认已经修好
- 用 Sign-In 字段里的凭证在干净设备上登录,30 秒内进到带样本内容的首页。
- Auth provider 日志显示你的非 Apple IP 测试登录成功,未触发锁定或 2FA。
- App Store Connect 的 App Review Information 里凭证和 Notes 渲染正确,没有编码乱码。
- 重交后 1-2 小时内状态从 Rejected 回到 Waiting for Review(截至 2026 年 6 月,多数 demo 账号复审 24 小时内出结果)。
如果还是没修好
- 在 Resolution Center 回复时把凭证再贴一遍,附上(或贴链接)一段 30 秒屏录,证明你冷设备登录成功。
- 让审核员给具体错误码或截图。有时挡住的是 captcha,不是凭证。
- 准备第二个 demo 账号,以防你和审核员同时测把第一个限速了。
- 怀疑 IP geofencing 就通过 Contact App Review 表单问审核员出口地区,再把那个地区加进白名单。
预防建议
- 维护一个永久豁免账号
apple-review@yourdomain.com:用数据库 flag 永久跳过 MFA、限速、地域拦截、不活跃清理。 - 加 CI 步骤:每天用一个非美区 GitHub Actions runner 登一次 demo 账号,失败就告警。
- 每次发版前给 demo 账号重新预置样本数据,让冷登录落地是带内容的首页。
- 在仓库里维护
REVIEW.md记录凭证;每次提交都从这个文件抄进 App Store Connect Sign-In 字段。 - demo 账号不要绑真人手机号或邮箱,用你长期掌控的共享收件箱。
常见问题
修 demo 账号需要重传 build 吗? 不需要。Demo 凭证、Sign-In 开关、Notes 都属于 metadata。在被拒的版本上改完,用同一个二进制再点 Submit for Review 即可。
凭证到底填在 App Store Connect 哪里? 在 App 的版本页打开 App Review Information,勾上 Sign-In required,把值填进 User Name 和 Password 字段。自由文本的 Notes 字段只写上下文(验证码、地域行为、额外账号),不是放主凭证的地方。
账号在我手机上能登,审核员却说登不上,为什么? 你是带着缓存会话、已登记的 2FA 设备和熟悉的 IP 在测。审核员一样都没有。复现他的条件:抹一台设备、关掉自动填充,只用 Sign-In 字段里的内容登一次。
能把 Apple 的审核 IP 加白名单吗?
可以只对 demo 用户放行 17.0.0.0/8 段,但 Apple 没公布官方审核出口段,部分流量来自别的段。比起 IP 白名单,用一个数据库 flag 让 demo 账号永久跳过地域拦截和限速更可靠。
Metadata 重交后多久复审? 截至 2026 年 6 月,demo 账号复审通常 24 小时内出结果,重交后一两小时状态会回到 Waiting for Review。
App 有地域锁,审核员所在区看到空白页怎么办? 给审核员所在区预置样本数据,或在 Notes 字段贴一段短演示视频链接——这是 Apple 对”审核员无法直接够到的功能”推荐的做法。
相关阅读
标签: #排查 #App Store #App 审核 #Demo 账号