你传了 build、在 App Review notes 里填好了 demo 账号的用户名密码,24 小时内提交状态翻成 Metadata Rejected,附一句 “We were unable to sign in to the app with the credentials you provided” 或 “login error: invalid credentials”。你自己手机上同账号能用得好好的。审核员从陌生 IP(多半是 Cupertino,或中国区团队的北京 VPN 出口)、一台干净设备、零缓存会话进你后端,账号要么撞上某条安全策略,要么本来在你测试环境之外就跑不起来。
这是 Guideline 2.1 拒回里最常见的一种,也是最快能修好的——前提是你能精确判断审核员那边到底为什么登不上。
常见原因
按命中率排序,约 70% 是 #1 或 #2。
1. 后端安全策略锁了账号
你的 auth 服务(Auth0、Firebase Auth、Cognito、Supabase 或自建)看到同一账号在异常 geo / IP / user-agent 下反复登录,触发了限速、地域拦截或”可疑活动”自动锁。审核员看到的是一个长得像密码错误的 401,其实是被锁了。
如何判断:去 auth provider 后台查 demo 用户的失败记录,时间锁定在审核窗口。看是否有 Apple IP 段(Cupertino 17.0.0.0/8)或中国区审核 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 → App Information → Review notes 里复制凭证,粘进生产登录表单。哪怕错一个字符都会被拒。
5. 登录后的功能有地域锁
审核员在美区(或你被分到的审核区),账号基础登录能过,但首页空空如也,因为内容被地域限制锁在审核员去不到的区。他认为登录坏了,因为 App 看起来死了。
如何判断:查你的内容 / 功能 gating 逻辑。如果同区登录用户落地是空状态,你要么给那个区准备样本数据,要么在 notes 里写 VPN 指引。
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 里不同。
- 完整记下审核员原文,“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 Review notes 里凭证的每一个字符(注意空格、引号)。
- 当前生效的限速 / 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 Review notes,凭证明明白白
App Store Connect → 你的 App → App Information → App Review Information,粘成:
Demo account
Login URL: (in-app, tap "Sign In" on launch)
Email: apple-review-2026@yourdomain.com
Password: ReviewPass-Spring2026!
This account is monogamous (single device) but reset on each submission.
No 2FA. Region-locked features are pre-enabled for this user; ignore
the location prompt.
用直引号、ASCII 字符,避免智能标点。别写 “see attached”——Apple 在审核工具里不一定显示附件。
Step 5:给账号预置样本数据 + 排除统计
冷登录后看到空首页照样触发 2.1。给 demo 用户预置 3 条样本文档 / 消息 / 歌单,让首屏有真实内容。同时把账号标 is_internal = true,别污染你的分析数据。
Step 6:重新提交(不需重传 build)
App Store Connect → App Store 标签 → 点 build → Submit for Review。Demo 账号修复属于 metadata-only,不用重新打包。
怎么确认已经修好
- 用 App Review notes 里的凭证在干净设备上登录,30 秒内进到带样本内容的首页。
- Auth provider 日志显示你的非 Apple IP 测试登录成功,未触发锁定或 2FA。
- App Store Connect 里 App Review notes 预览渲染正确,没有编码乱码。
- 重交后 1-2 小时内状态从 Metadata Rejected 回到 Waiting for Review。
如果还是没修好
- 在 Resolution Center 回复时把凭证再贴一遍,附上一段 30 秒的 QuickTime 屏录,证明你冷设备登录成功。
- 让审核员给具体错误码或截图——有时挡住的是 captcha,不是凭证。
- 准备第二个 demo 账号,以防你和审核员同时测把第一个限速了。
- 怀疑 IP geofencing 就通过 Contact App Review 表单问审核员出口地区,把那个地区加进白名单。
预防建议
- 维护一个永久豁免账号
apple-review@yourdomain.com:用数据库 flag 永久跳过 MFA、限速、地域拦截、不活跃清理。 - 加 CI 步骤:每天用一个非美区 GitHub Actions runner 登一次 demo 账号,失败就告警。
- 每次发版前给 demo 账号重新预置样本数据,让冷登录落地是带内容的首页。
- 在仓库里维护
REVIEW.md记录凭证;每次提交都从这个文件抄到 App Review notes。 - demo 账号不要绑真人手机号或邮箱——用你长期掌控的共享收件箱。
相关阅读
标签: #排查 #App Store #App 审核 #Demo 账号