iOS 账号删除功能:提交 Apple 审核前要测的流程
作者:Mehdi Azizi
更新于 ,7分钟
删除按钮、关联数据、订阅和重新登录:提交 App Review 前逐项测试账号删除流程。
光有按钮不够:要确认哪些东西真的被删了
如果你的 app 允许创建账号,Apple 要求用户能在 app 内发起删除账号。仅仅停用账号不满足这个要求。这个流程要容易找到,并说明删除的后果。如果有一部分要在网页上完成,链接必须直接跳到对应的页面。来源:Apple 关于账号删除的说明。
所以工作不只是在设置里放一个红色按钮。你要盘点数据,在服务器端执行删除,处理错误,再确认用户之后看到的是什么。这篇指南给出一套产品和技术层面的测试方案;有法定保留义务的数据,需要根据你的业务做相应处理。
先画一张数据地图
拿一个虚构的读书笔记 app 来举例。它有账号、个人资料、私人笔记,还有用户自己添加的封面照片。下面的例子描述的是一个待验证的方案,而不是某个 Devoria app 上已经执行过的删除。
- **登录身份:**删除之后,怎么让这个账号无法再使用?
- **个人资料和笔记:**哪些数据行属于这个人,怎么删除?
- **存储的照片:**用什么流程删除文件以及对它们的引用?
- **手机缓存:**界面是否只在操作真正成功后才清除本地数据?
- **第三方服务:**和这个账号相关的数据是否需要单独删除?
- **需要保留的数据:**哪些数据、出于什么义务保留,又怎样告知用户?
有了这张地图,你就不会事后才发现用户记录已经没了,照片却还能访问。它也给了你测试时要逐一检查的对象。
一个清晰的流程,分四个状态
下面是为这个虚构 app 设计的方案,请根据你产品的实际后果调整:
- 账号设置。“删除我的账号”入口始终可以找到。
- **确认。**界面说明涉及哪些数据,并提供一个和删除操作一样容易理解的取消操作。
- **处理中。**按钮防止重复提交,界面提示操作正在进行。
- **结果。**确认成功后进入未登录状态。失败时保留有用的提示和重试方式,不要声称账号已经删除。
如果处理需要时间,Apple 接受延迟完成的流程,前提是告知用户并在完成后确认。只是记录了请求的时候,app 不能让人以为删除已经完成。同一份 Apple 文档还说明了需要重新验证身份的情况,以及受严格监管行业的例外。
用 Supabase 要提前考虑的事
删除一个 Auth 用户,本身并不能证明你产品里的所有对象都已处理。Supabase 特别说明,拥有 Storage 对象的用户,在这个问题解决之前无法被删除。文档还指出,删除用户不会立刻让所有已签发的 JWT 失效:设计时要考虑它们的有效期。来源:Supabase 用户管理。
所以要设计一个服务器端流程,验证请求者的身份以及属于他的资源。不要依赖手机随意发来的某个 ID 来决定删除哪个账号。管理员权限留在服务器端,参见 Supabase 密钥文档。
如果流程分好几步,要想好:第一步成功、下一步失败时,重试应该怎么做。比如文件已经删掉了,新的请求不能仅仅因为文件不存在就报错。这是测试前要写好的场景,而不是靠猜的行为。
账号和订阅:两项独立的检查
用户可能删了账号,Apple 订阅却还在继续。Apple 要求说明账单之后会怎样,并提供管理订阅的入口。如果你用了 Sign in with Apple,还要安排好相应的令牌撤销。这些要点在 Apple 关于删除的指引里有详细说明。
所以在测试计划里,要把账号删除、付费权限状态和订阅管理分开测。订阅还是一次性买断这篇指南能帮你把这个流程放进你的商业模式里考虑。
在测试 build 上执行的测试清单
只用测试账号和虚构数据。每项检查都记下 build、设备、观察到的结果和局限。
- **取消。**账号和数据仍然可以访问。
- **删除一个有数据的账号。**最终状态和说明的处理一致;相关数据确实被删除。
- **断网。**app 不会显示虚假的成功。
- **部分失败后重试。**请求可以完成,且不会波及其他数据。
- **打开第二个会话。**旧的访问按照设计好的机制处理。
- **用同一邮箱重新注册(如果允许)。**以前的私人数据不会重新出现。
把这些用例加进 Devoria 测试清单。要分发给测试人员,参考 TestFlight 指南。控制台没有报错,不能代替对数据和流程的检查。
准备提交 App Review
在审核备注里,说明操作入口在哪里、怎么测试。如果某一步依赖某个服务,确保审核期间它可用。不要在备注里承诺提交的 build 中还不存在的功能。
如果已经被指出问题,被 Apple 拒绝的 app 这个页面能帮你组织回复。要准备回复,Apple Review Kit 帮你找到被引用的规则、它的要求,以及修改和回复的示例。
如果你在准备第一次提交,免费诊断会告诉你还差什么,并把我的防拒审清单发给你,账号删除也包括在内。如果 Apple 已经拒了你的 app,和我预约一小时:我们视频连线,一起看那条消息。
常见问题
iOS app 必须提供账号删除功能吗?
是的,只要你的 app 允许创建账号:Apple 要求用户能在 app 内发起删除账号。仅仅停用账号不满足这个要求。这个流程要容易找到,并说明删除的后果。如果有一部分要在网页上完成,链接必须直接跳到对应的页面。
用户删除账号时要删掉哪些东西?
属于这个人的一切,而不只是用户记录。列一张清单:登录身份、个人资料和创建的内容、存储的文件及其引用、手机缓存、第三方服务里的数据。还要记下需要保留的数据、出于什么义务,并告知用户。没有这份盘点,用户记录没了,照片却可能还能访问。
Apple 接受不是立即完成的账号删除吗?
接受。如果处理需要时间,Apple 接受延迟完成的流程,前提是告知用户并在完成后确认。只是记录了请求的时候,app 不能让人以为删除已经完成。失败时保留有用的提示和重试方式,不要声称账号已经删除。
用户删除账号后,订阅会怎样?
账号删除后,Apple 订阅可能继续。Apple 要求说明账单之后会怎样,并提供管理订阅的入口。如果你用了 Sign in with Apple,还要安排好相应的令牌撤销。在测试计划里,把账号删除、付费权限状态和订阅管理分开测。
在 Supabase Auth 里删除用户就够了吗?
不够,删除一个 Auth 用户并不能证明你产品里的所有对象都已处理。根据 Supabase 文档,拥有 Storage 对象的用户,在这个问题解决之前无法被删除。删除用户也不会立刻让所有已签发的 JWT 失效。要设计一个服务器端流程来验证请求者的身份。
提交给 Apple 之前怎么测试账号删除?
在测试 build 上使用测试账号和虚构数据。执行六个用例:取消、删除有数据的账号、断网、部分失败后重试、打开第二个会话、在允许的情况下用同一邮箱重新注册。检查数据和流程:控制台没有报错并不够。要分发 build,参考 TestFlight 指南。