导语
iOS 8 引入了 Touch ID 认证的方式来解决输入密码的麻烦操作,Swift 最低需要 iOS 8,因此本文会用 Swift 来实现 Touch ID 功能
环境
macOS Sierra 10.12.4
Xcode 8.3.1
Swift 3.0
iPhone 6S 10.1.1
Touch ID 需要硬件支持
LocalAuthentication.framework
Touch ID 认证依赖的框架,引入即可
LAContext
Touch ID 认证的上下文对象
有两个方法
能不能?
1 | open func canEvaluatePolicy(_ policy: LAPolicy, error: NSErrorPointer) -> Bool |
LAPolicy
1 | public enum LAPolicy : Int { |
具体用那种策略去验证。
NSErrorPointer
1 | public typealias NSErrorPointer = AutoreleasingUnsafeMutablePointer<NSError?>? |
流程(显示什么,结果如何?)
1 | open func evaluatePolicy(_ policy: LAPolicy, localizedReason: String, reply: @escaping (Bool, Error?) -> Swift.Void) |
localizedReason
要求 Touch ID 验证的原因
reply
返回的结果后的回调
LAError
失败的原因有
- 认证失败(比如用了未被认证的手指)
- 用户取消
- 用户取消选择了输入密码
- 系统取消(比如另一个程序切换至前台)
- 未设置密码
- 设备不支持
- 未设置 Touch ID (手指没设置)
iOS 9 上又添加了 3 种情况
- 失败次数过多
- 被取消 ( 上一次认证过程还未结束 )
- LAContext 上下文对象有不合法
具体详情可以查看 LAError 枚举的定义
Code
1 | func authenticateUser() { |
总结
Touch ID 功能的设计其实比较直观,实现也挺容易的,遇到的干扰主要是 Swift 由于版本迭代语法上的差异。