您的位置:首页 > 其它

Touch ID身份认证

2015-12-22 17:11 495 查看
TouchID是苹果公司在iOS 7中引入并在iPhone 5s上使用的新特性,是允许用户解锁设备和在App Store购物的生物识别技术。

现在好多app以及利用此特性进行登录,例如QQ登录、支付宝登录等.另外支付宝支付时,也可以代替输入支付密码。

在新手机激活的过程中会让用户录入指纹。另外可以在 “设置”-> "Touch ID 与密码" 中添加指纹。



应用程序使用TouchID作为验证机制是很容易的,下面就简单介绍一下在app启动后登录验证。

1.用到的库是 LocalAuthentication framework

2.用到的函数也只有两个:

  // 用来判断设备是否支持Touch ID

/// @return YES if the policy can be evaluated, NO otherwise.
   
public func canEvaluatePolicy(policy:
LAPolicy, error: NSErrorPointer) ->
Bool

    返回true表示设备支持指纹识别;false表示不支持。

  // 真正验证身份的函数

    /// Typical error codes returned by this call are:

   
/// @li          LAErrorUserFallback if user tapped the fallback button

   
/// @li          LAErrorUserCancel if user has tapped the Cancel button

   
/// @li          LAErrorSystemCancel if some system event interrupted the evaluation (e.g. Home button pressed).
   
public func evaluatePolicy(policy:
LAPolicy, localizedReason:
String, reply: (Bool,
NSError?) -> Void)

调起验证界面,如下图



3.

它支持一系列的错误类型,这些错误都能给出错误的原因,并能给出选项供开发者在每一种情况下做出处理。错误类型是用枚举实现的:@available(iOS 8.0, *)
public enum LAError : Int {
/// 在用户没有提供正确验证的情况下返回该错误类型,例如使用一个错误的手指。
case AuthenticationFailed
/// 在用户有意终止验证的时候返回该类型。
case UserCancel
/// 在用户有意不使用TouchID验证并且回到自定义的输入验证方式时返回。
case UserFallback
/// 在这种情况下,系统终止验证处理,因为另一个应用被激活了。
case SystemCancel
/// 当用户没有在设备Settings中设定密码时返回。
case PasscodeNotSet
/// 设备不支持TouchID。
case TouchIDNotAvailable
/// 在设备支持TouchID但没有录入指纹的时候返回。
case TouchIDNotEnrolled
/// 太多次的错误使Touch ID锁住。
@available(iOS 9.0, *)
case TouchIDLockout
/// app取消认证
@available(iOS 9.0, *)
case AppCancel
/// LAContext 失效
@available(iOS 9.0, *)
case InvalidContext
}
下面是调用方法
func authenticateUser(){
//获取认证上下文环境
let content:LAContext = LAContext()
var error:NSError?
var reasonString = "通过验证指纹解锁TouchIdDemo."

//检测设备是否支持touch id
if content.canEvaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, error: &error){//支持Touch ID
//调用验证
[content .evaluatePolicy(LAPolicy.DeviceOwnerAuthenticationWithBiometrics, localizedReason: reasonString, reply: {( success:Bool, evalPolicyError:NSError?) -> Void in
if success{
//验证成功

}else{
//如果认证失败弹出提示
print(evalPolicyError?.localizedDescription)
switch evalPolicyError!.code{
case LAError.SystemCancel.rawValue :
print("系统取消认证。")
case LAError.UserCancel.rawValue:
print("用户取消认证。")
case LAError.UserFallback.rawValue:
print("用户选择输入密码。")
NSOperationQueue.mainQueue().addOperationWithBlock({() -> Void in
})
default:
print("认证失败。")
}
}
})]
}
else{//不支持Touch ID
switch error!.code{
case LAError.TouchIDNotEnrolled.rawValue:
print("TouchID is not enrolled")
case LAError.PasscodeNotSet.rawValue:
print("A passcode has not been set")
default:
print("TouchID not available")
}
print(error?.localizedDescription)
}
}弹出界面如下图



其中

该alert可定制的只有两处:

1.”通过验证指纹解锁TouchIdDemo.”提示文字是由localizedReason参数指定的,用来向用户说明使用Touch ID的目的.

2.”Enter Password”可由LAContext的localizedFallbackTitle属性设置(LAContext目前只有这一个属性),如果不设置的话,默认是”Enter Password”.值得注意的是,如果该属性设置为@“”(空字符串),该按钮会被隐藏。

最后,在viewDidLoad()中调用

override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
authenticateUser()
}

参考资料:
在iOS 8 SDK中使用Touch ID API(上)

在iOS 8 SDK中使用Touch ID API(下)

iOS 8使用Touch ID进行身份认证

      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: