Swift 如何实现带二次确认的App内Passcode登录验证逻辑
实现方案
整套实现根本不需要重复开发Passcode页面,只需要做两个底层适配就行:用本地持久化标记判断Passcode设置状态,给已有的Passcode页面加场景枚举适配不同流程,零额外开发量就能跑通全流程。
一、通过本地持久化判断用户是否完成Passcode设置
不需要关联系统权限,用App自带的本地轻量存储(比如iOS的UserDefaults、Android的SharedPreferences/MMKV)存两个固定key的值即可:
kIsPasscodeSetupCompleted:布尔值,标记用户是否完成了Passcode设置全流程kStoredPasscodeHash:字符串,存储加密加盐后的Passcode哈希值
注意:绝对不要明文存储Passcode原文,存储前做一次固定算法的哈希加盐处理,验证时把用户输入的内容做同样的哈希计算,和存储值比对即可,避免本地数据泄露带来的安全问题。
判断逻辑非常简单:App启动时先读kIsPasscodeSetupCompleted的值,如果值为true说明用户已经完成设置,走启动验证流程;如果值为false或者key不存在,说明是首次使用,走创建引导流程。
二、通过场景枚举实现同一个Passcode页面的全流程复用
你已经写好的Passcode输入、键盘交互逻辑完全不需要改,只需要给这个页面加一层可配置的场景标识,不用为创建、确认、验证三个流程单独写三套页面:
- 先定义场景枚举,把所有可能用到Passcode页面的状态列出来:
enum PasscodeScene { case setupFirstInput // 首次创建:引导用户输入第一遍Passcode case setupConfirmInput // 二次确认:校验两次输入是否一致 case verifyOnLaunch // 启动验证:对比本地已存储的Passcode } - 给Passcode页面加几个对外可配置的属性:
- 当前所处的场景类型(上面的枚举值)
- 一个临时暂存属性,用来存首次设置时用户第一遍输入的Passcode值,方便二次确认时做比对
- 输入完成后的回调,把用户输入的Passcode透传给外层逻辑处理
- 不同场景的流转逻辑全部在页面交互里完成,完全复用同一个页面类:
- 场景为
setupFirstInput时:用户输完第一遍Passcode,先把内容暂存到页面的临时属性里,再弹出同一个Passcode页面类的新实例,把新实例的场景设为setupConfirmInput,同时把暂存的第一遍输入值传过去,页面提示文案自动切换为“请再次输入确认Passcode”即可。 - 场景为
setupConfirmInput时:把当前用户输入的内容和暂存的第一遍输入值做比对:如果一致,就把哈希后的Passcode存到本地,把kIsPasscodeSetupCompleted标记设为true,dismiss所有Passcode相关页面,进入App主界面;如果不一致,触发震动提示,清空输入框,留在当前页让用户重输。 - 场景为
verifyOnLaunch时:把用户输入的内容做哈希计算,和本地存储的kStoredPasscodeHash值比对:匹配成功就dismiss页面进入主界面;匹配失败就震动提示、清空输入框,让用户重输。
- 场景为
三、App启动时的路由判断流程
在App启动完成、初始化根窗口的时候,直接按状态跳转对应的Passcode页面即可:
- 如果判断用户还没完成Passcode设置:把Passcode页面的场景设为
setupFirstInput,作为根视图展示,自动走“第一遍输入→二次确认→进入主界面”的流程 - 如果判断用户已经完成设置:把Passcode页面的场景设为
verifyOnLaunch,作为根视图展示,等用户验证通过后再换成App主界面
几个实用的落地注意点
- 所有Passcode页面的UI、输入交互、键盘逻辑都是复用同一套代码,仅靠场景枚举切换提示文案和校验规则,没有重复开发量
- 不要把Passcode的存储、校验逻辑硬写在Passcode页面内部,页面只负责收集用户输入的内容,具体的校验、存储操作通过回调交给外层处理,降低耦合度
- 可以额外加一个逻辑:当App从后台回到前台时,自动在主界面上层盖一层
verifyOnLaunch场景的Passcode页面,避免用户切后台时泄露敏感内容
内容的提问来源于stack exchange,提问作者miki
相关产品推荐
相关产品推荐

