包住一切的认证守卫
Lovable、Bolt 和 v0 的脚手架常常把整个路由器包在受保护的路由里,于是应用的第一个页面就是登录表单。
App Store 审核被拒
如果您的应用强制用户先注册账号,才能使用与账号毫无关系的功能,Apple 就会依据 5.1.1(v) 拒审。AI 应用构建工具默认把整个应用都放在登录之后,所以这种情况很常见。修复方法是:开放不需要账号的部分,需要账号的部分保留登录,并在审核备注中清楚说明哪些属于哪一类。
每个平台一次性 $109 起,或由我们的团队全程代劳,$698 起。
准则 5.1.1 中关于账号登录的部分规定:没有重要的基于账号功能的应用,应允许用户在不登录的情况下使用。除非与核心功能直接相关或法律有要求,应用不得要求用户提供个人信息才能运行。支持注册账号的应用,必须在应用内提供账号删除功能。此外,如果核心功能与某个特定社交网络无关,用户必须能在不登录该社交网络的情况下使用应用;获取个人资料数据、分享和邀请好友都不算核心功能。
5.1.1 的其他部分(隐私政策、用途说明文本、数据最小化)请参阅5.1.1 隐私指南。本页讨论的是登录墙。
这条备注通常说,应用要求用户先注册或登录,才能访问并非基于账号的功能,并建议让用户自由使用这些功能,只对与账号相关的功能要求注册。一种常见的变体是说应用要求提供核心功能并不需要的个人信息,例如电话号码、生日或性别。另一种变体与购买有关:应用强制要求用户先注册,才能购买并非基于账号的应用内购买项目。
| 功能 | 是否基于账号? | 是否放在登录之后? |
|---|---|---|
| 浏览目录、阅读文章、查看菜谱 | 否 | 否,设为公开 |
| 计算器、转换器、生成器、有限的免费 AI 体验 | 否 | 否,或使用访客会话 |
| 收藏、历史记录、跨设备同步 | 是 | 是;在用户保存内容时再询问 |
| 发帖、聊天、关注其他用户 | 是 | 是 |
| 订单、预订、发票、团队工作区 | 是 | 是 |
| 面向某项服务现有会员、员工或客户的应用 | 是,账号就是核心 | 是;在审核备注中说明并提供演示账号 |
| 同样可在网页上使用的订阅 | 是,跨平台 | 是;在审核备注中说明 |

我的iOS WebView应用终于通过审核了。谢谢!!
Lovable、Bolt 和 v0 的脚手架常常把整个路由器包在受保护的路由里,于是应用的第一个页面就是登录表单。
营销页面是网站的公开部分,所以很多人把 webviewurl 设为应用区域,而它会直接重定向到登录页。
“以防万一”生成的电话、生日、性别和公司字段,都是核心功能并不需要的个人信息。
只有“Continue with Google”,意味着没有社交账号的人根本进不来。请添加邮箱登录或Sign in with Apple,并考虑提供访客入口。
逐一检查每个页面。通常来说,发现和阅读是公开的;保存、发帖、与账号绑定的购买以及个人数据仅限账号使用。
在 Config.swift 中把 webviewurl 设为一个无需登录即可使用的页面,例如 yourdomain.com/app 或 /explore,而不是 /login。修改它需要新的构建版本。
公开路由对所有人渲染;只有账号路由才重定向到登录页(代码见下文)。把“登录”放在页眉中或第一次保存时,而不是挡在内容前面。
如果访客应能保存进度,请使用 Supabase 匿名登录、Firebase 匿名认证或本地存储,并在注册时把访客转换为正式账号,这样就不会丢失任何数据。用验证码和行级安全(row-level security)保护匿名注册;Supabase 检查清单列出了相关设置。
邮箱和密码(或 Sign in with Apple),如果确实需要,再加一个姓名。其他信息等到某项功能需要时再询问,并把可选字段明确标为可选。
以大多数 AI 构建工具生成的 React Router 代码为例,外加一个用于保存的 Supabase 访客会话。
// 修改前(典型的 AI 脚手架):所有路由都在 <RequireAuth /> 之后
// <Route element={<RequireAuth />}> ...所有路由... </Route>
// 修改后:发现类内容公开,账号功能放在守卫之后
<Routes>
<Route path="/" element={<Explore />} /> {/* 无需账号 */}
<Route path="/recipes/:id" element={<Recipe />} /> {/* 无需账号 */}
<Route path="/login" element={<Login />} />
<Route element={<RequireAuth />}>
<Route path="/favorites" element={<Favorites />} /> {/* 基于账号 */}
<Route path="/settings/account" element={<Account />} />
</Route>
</Routes>
// 访客点按“保存”:启动匿名会话,之后再升级
async function saveAsGuest(recipeId) {
const { data } = await supabase.auth.getSession();
if (!data.session) await supabase.auth.signInAnonymously();
await supabase.from("favorites").insert({ recipe_id: recipeId }); // user_id 默认为 auth.uid()
showBanner("已保存。创建一个免费账号,即可在所有设备上保留您的收藏。");
}
// 之后升级:supabase.auth.updateUser({ email }) 会把匿名用户转为永久用户让 AI 来完成重构,但在它修改代码之前,先审查它列出的公开路由和仅限账号路由。
按照 App Store 准则 5.1.1(v) 重构身份验证。 1) 列出每一个路由,并将其归类为公开(无需账号即可使用)或仅限账号(保存、发帖、与账号绑定的购买、个人数据)。在修改代码之前,先把这份清单给我看。 2) 移除全局认证守卫,只把它应用到仅限账号的路由上。 3) 把 / 设为公开的起始页面,无需登录即可显示核心内容。 4) 当访客尝试仅限账号的操作时,显示一个友好的弹出面板:“创建一个免费账号来保存这项内容”,提供 Sign in with Apple、邮箱注册以及“以后再说”选项。 5) 对需要保存状态的访客使用 Supabase 匿名登录,并在注册时把他们转换为永久账号,不丢失任何数据。所有表都保持启用行级安全(row-level security)。 6) 把注册表单精简为邮箱、密码和可选的姓名。除非有功能需要,否则删除电话、生日和性别字段。 7) 保留设置中现有的“删除账号”流程。
如果您开放了应用,用方案 A;如果登录确实必不可少,用方案 B。无论哪种都要具体。模板保留英文,因为 Apple 审核人员阅读的是英文。
Hello App Review team, Thank you for reviewing [App name] [version] ([build]). [Option A: guest access added] Users can now [browse / read / use the calculator] without an account. The app opens on [Explore], and an account is requested only when a user wants to [save favorites / post / sync across devices], which are account-based features. Sign-up now asks only for email and password, or Sign in with Apple. [New build: [number].] [Option B: login is essential] [App name] is a [client portal / team workspace] for [existing customers of X / members of Y]. Every feature works on the user's own account data: [list the main features]. There is no content that could be shown without an account. Accounts are created [at sign-up in the app / by the customer's organization]. A demo account is provided in App Review Information. Account deletion is available in [Settings > Account > Delete account]. Best regards, [Name], [email]
webviewurl 指向公开页面,而不是登录页面。如果每项功能都基于客户自己的账号数据,就不需要。请在审核备注中说明这一点并提供演示账号。为尚未成为客户的人提供一个展示应用用途的公开页面,则是锦上添花。
没有固定的位置要求。重要的是新用户无需注册就能使用非账号功能。一个公开的起始页面,在页眉中放一个“登录”按钮,通常是最简洁的方案。
如果购买与账号绑定,例如同时解锁网页版的订阅,可以,请在审核备注中说明。对于只在本设备上生效的购买,审核人员希望注册是可选的。
有可能:如果您的核心功能与 Google 毫无关系,用户就必须能在不使用 Google 登录的情况下使用应用。访客访问或邮箱登录可以解决这个问题,而准则 4.8 还要求在 Google 旁边提供 Sign in with Apple 或类似选项。
删除要求适用于用户创建的账号。对于匿名会话,在设置中提供“清除我的数据”选项是一种好做法;一旦访客转换为正式账号,就适用常规的“删除账号”流程。
结果相同,只是您需要投入的工作量不同。三种方式都附带审核通过保证和 7×24 小时人工支持。
$109 每个平台,一次性付费
WebViewGold 许可证:一个现成的 Xcode 或 Android Studio 项目。粘贴您的 URL,设置名称和图标,开启所需功能,构建并提交。永久免费更新。
在主页查看方案$349 每个许可证,一次性附加购买
无需 Mac、Xcode 或 Android Studio:在浏览器中完成配置,我们在云端构建两个应用,并将其交付到 App Store Connect 和 Play Console。
Cloud Builder 如何运作 试用免费演示$698 每个平台 $798
把您的 URL 和图标发给我们。我们的团队在 72 小时内完成配置、构建并交付您的应用,白标,附源码项目。两个平台共 $1,158。
Full Service 详情 服务提供方:冬季特惠价格有效期至 2026年12月31日。
App Store & Google Play 审核通过保证 – 否则 14 天内退款
想直接交给我们?Full Service:我们在 72 小时内完成配置、构建并交付,每个平台 $698 起。有疑问?通过 7×24 小时在线聊天联系我们。
退款依据我们 FAQ 中列出的条件:应用因非内容原因被 Apple 和/或 Google 拒审,并在购买后 14 天内提出申请。