你是在说“问题/需求编号 652:PotatoChat 手机版面容解锁”吗?还是仅想了解如何在 PotatoChat 手机上实现“面容解锁”这一功能?我可以做三件事:帮你(A)给出实现方案和示例代码;(B)写一份产品/需求说明(可作为 issue #652 的具体实现文档);或(C)排查已实现但出现的问题。先确认你想要哪一种?下面先给出一个简明的实现与注意事项概要,供参考。

实现思路(跨平台要点)
- 不要自己采集或存储面容图像/模板:必须使用操作系统提供的生物识别框架(iOS 的 Face ID/LocalAuthentication,Android 的 BiometricPrompt/AndroidX Biometric),以保证安全与合规。
- 用生物识别作为“解锁凭证”去解锁一个在安全存储中的密钥(Keychain/Android Keystore)。真正的敏感数据(会话 token、私钥等)用该密钥加解密保存。这样即使设备被攻破,也难以直接得到明文。
- 提供备用解锁方式(PIN/密码/指纹)并在首次启用时要求用户设置备选方案。
- 明确告知用户隐私与权限:不上传面部数据、不共享给第三方,仅在设备上用于认证。
- 兼容性:iOS 上检测是否支持 Face ID/Touch ID;Android 上检测设备是否支持生物识别并兼容不同供应商的实现(有的 Android 设备没有面部硬件或实现差异)。
iOS(Face ID)要点与示例(Swift)
- 使用 LocalAuthentication 框架(LAContext)。
- 检查 canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics) 并判断 biometryType == .faceID。
- 调用 evaluatePolicy,成功后访问 Keychain 中受保护的条目或解密会话数据。
简单示例(伪代码): - 创建 LAContext,调用 canEvaluatePolicy,错误处理(未启用、未注册生物识别等)。
- evaluatePolicy(…, localizedReason: "…") -> 成功回调进行解锁逻辑。
注意:不要在代码中保存生物识别结果,及时处理错误码(用户取消、系统取消、未注册等)。
Android 要点与示例(Kotlin)
- 使用 androidx.biometric.BiometricPrompt(兼容 Android 6+)。
- 构造 BiometricPrompt.PromptInfo(标题、说明、允许的认证方式)。
- 为更安全,结合 Android Keystore:生成一个要求用户认证才可使用的对称密钥(setUserAuthenticationRequired/ setUserAuthenticationValidityDurationSeconds)。
- 处理各种回调(onAuthenticationSucceeded, onAuthenticationError, onAuthenticationFailed)。
注意:Android 上“面部解锁”依赖设备实现;某些面部识别并非硬件级安全(实现差异应在产品说明中注明)。
安全实现建议(要点)
- 使用系统 Keychain/Keystore,不把敏感数据与生物识别数据混存。
- 对重要操作设置短时有效的用户认证(例如 requireSecureHardware, 或要求每次认证)。
- 处理“生物识别被重新注册/改变”的情况:若系统返回 KEY_INVALIDATED_BY_BIOMETRIC_ENROLLMENT(Android)或类似信号,应要求重新登录并重新绑定密钥。
- 日志避免包含敏感信息;合规性提示:根据地区(GDPR 等)在隐私政策中说明。
产品与 UX 建议
- 首次进入设置时明确询问是否启用“面容解锁”,并展示备选 PIN/密码。
- 在应用锁定界面提供清晰的取消/切换选项。
- 对失败多次的情况给出合适的降级(PIN 解锁或重新登录)。
- 提供“在锁屏时允许/不允许面容解锁”之类的开关(如果需要更高安全等级,允许用户禁用锁屏直接解锁)。
测试要点
- 在真实设备上测试 Face ID(iPhone 带 TrueDepth)与多款 Android 设备(不同厂商)。
- 测试用户取消、系统取消、未注册 biometrics、重启设备、生物识别注册变更等边界场景。
- 测试 Keychain/Keystore 被覆盖或应用数据被清除时的行为。
如果你需要,我可以进一步提供:
- 具体的 iOS/Swift 或 Android/Kotlin 代码示例(完整实现用于解锁并访问 Keychain/Keystore 的片段)。
- 一份 RFC/PRD 风格的需求文档,适合提交到 issue #652。
- 针对你当前遇到的错误日志或问题做排查(请贴上错误信息与设备型号/系统版本)。
你希望我接着哪一步?(例如“给我 iOS 的示例代码”或“把这做成 issue #652 的实现方案文档”)