iOS应用Touch ID启用开关实现方案咨询:需自定义plist属性吗?
最佳解决方案:自定义Touch ID开关状态管理
嘿,刚好做过类似的功能,给你理清楚这个问题:
首先明确一点:系统并没有提供现成的isEnableTouchId属性,这个开关状态需要我们自己来管理,而plist文件的作用和这个不是一回事,下面分两部分给你讲:
一、用户开关状态的存储(核心)
用户通过Switch控件选择是否开启Touch ID,这个属于用户偏好设置,最合适的存储方式是用UserDefaults,它能持久化保存用户的选择,下次打开应用还能读取到状态。
具体实现步骤:
- 给Switch控件绑定一个切换事件(IBAction),把状态存入UserDefaults:
@IBAction func touchIdSwitchChanged(_ sender: UISwitch) { // 用一个自定义的key来存储,比如"isTouchIDEnabled" UserDefaults.standard.set(sender.isOn, forKey: "isTouchIDEnabled") // 可选:立即同步(不过UserDefaults默认会自动同步,这里加不加都行) UserDefaults.standard.synchronize() }
- 在需要触发Touch ID验证的地方,先读取这个状态,再决定是否执行验证:
// 读取用户设置的开关状态,默认值可以设为true(即默认开启) let isTouchIDEnabled = UserDefaults.standard.bool(forKey: "isTouchIDEnabled") if isTouchIDEnabled { // 执行Touch ID/Face ID验证逻辑 let context = LAContext() var authError: NSError? // 先检查设备是否支持生物识别 if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &authError) { let reason = "验证你的身份以继续操作" context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason) { [weak self] success, error in DispatchQueue.main.async { guard let self = self else { return } if success { // 验证成功,处理后续逻辑 print("Touch ID验证通过") } else { // 验证失败,提示用户 print("Touch ID验证失败:\(error?.localizedDescription ?? "未知错误")") } } } } else { // 设备不支持生物识别,或者用户未设置 print("设备不支持Touch ID/Face ID") } } else { // 用户关闭了Touch ID,直接跳过验证,执行后续逻辑 print("用户已关闭Touch ID验证") }
二、plist文件的作用(别搞混)
plist文件里不需要新建什么isEnableTouchId属性,它的作用是配置应用使用生物识别的权限描述——如果你的应用要调用Touch ID/Face ID,必须在Info.plist中添加对应的描述字段,否则会崩溃:
- 支持Face ID(iOS 11+):添加
NSFaceIDUsageDescription,值为你要向用户说明的使用原因(比如"用于快速登录你的账号") - 仅支持Touch ID(iOS 10及以下):添加
NSBiometricUsageDescription,同样填写使用原因
总结最佳实践
- 用
UserDefaults存储用户的Touch ID开关状态,这是最符合iOS偏好设置设计的方式 - plist只用来配置必要的生物识别权限描述,不要用它存动态的用户设置
内容的提问来源于stack exchange,提问作者Diogenes
相关产品推荐
相关产品推荐

