最近在app端开发增加一个功能:设备锁 就是进入app时验证指纹或者锁屏密码。
首先看下翻译的官网文档 https://www.cnblogs.com/peterYong/p/12434683.html
Android端
指纹验证
系统默认每段时间内验证指纹次数为5次,如果5次后还没验证成功,则关闭验证,并且30秒内不允许再次验证,即使你调api也没用。
锁屏密码验证
参考:【确认凭证】
https://docs.microsoft.com/zh-cn/xamarin/android/platform/marshmallow
注意:
- 跳转系统解锁页面只能在5.0以上的设备使用,5.0以下的不支持
- 如果不对设备进行设置密码判断,intent就会返回一个null, 一定要对null值进行判断
核心是:调用系统的锁屏密码界面,输入密码,判断返回结果是否正确,正确则执行后续逻辑
KeyguardManager keyguardManager = (KeyguardManager)GetSystemService(Context.KeyguardService); Intent intent = keyguardManager.CreateConfirmDeviceCredentialIntent("输入锁屏密码", null); if (intent != null) { StartActivityForResult(intent, REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS); } protected override async void OnActivityResult(int requestCode, Result resultCode, Intent data) { if (requestCode == REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS && resultCode == Result.Ok) { if (resultCode == Result.Ok) { HUD hUD = new HUD(); hUD.ShowProgress(AppResource.加载中); await Task.Delay(500); StartMainActivity(); hUD.Dismiss(); } else { Toast.MakeText(this, "密码错误,请重试。", ToastLength.Long).Show(); } } }
Activity跳转及传递参数,参考:
startActivity与startActivityForResult的使用小结
生物识别
到了AndroidP(Android9.0),FingerprintManager
就正式退役了,系统新增了BiometricPrompt
接口(包括面部识别)【暂未对接】
问题:
1、在实际运行中,碰到后续逻辑是比较耗时的情况,想提前关闭打开的锁屏界面,FinishActivity(REQUEST_CODE_CONFIRM_DEVICE_CREDENTIALS);
但是一直不生效。而且想打开一个进度圈提醒用户也不生效。
方案:于是将OnActivityResult 改为异步方法,等待500毫秒,再去打开进度圈。
2、CreateConfirmDeviceCredentialIntent 打开系统的锁屏密码输入框
对于Android10和以上版本的系统,会自动打开含指纹和密码的验证框;
对于Android10以下的,只会打开密码的验证框。想打开指纹验证框,需要自定义,见 Android的Fingerprint Authentication
IOS端
基本功能
canEvaluatePolicy:error:
方法用来检查当前设备是否可用touchID,返回一个BOOL值;不会弹验证指纹密码框evaluatePolicy:localizedReason:reply:
调用验证方法,会弹验证指纹密码框
没有设置指纹,则会自动回退到锁屏密码框,都是调系统的弹窗!
指纹验证
1、说明
虽然安装iOS 7系统的5s机型可以使用系统提供的指纹解锁功能,但由于API并未开放,所以理论上第三方软件不可使用。
指纹验证功能的最低硬件支持为iPhone5s,iPad 6,iPad mini 3这些有touch ID硬件支持的设备。
2、TouchID 的校验方式
- LAPolicyDeviceOwnerAuthenticationWithBiometrics:指纹验证。首次启动有三次验证的机会,失败后TouchID校验的弹框会消失。再次启动有两次机会,如果还失败,TouchID就会被锁定,后面再启动程序TouchID就不会在弹出。这里我们需要用下面一种校验方式来解除TouchID的锁定
- LAPolicyDeviceOwnerAuthentication:指纹验证+系统密码验证。如果TouchID正常录入则优先使用TouchID,如果出现上面那种情况,TouchID被锁定,就需要用系统密码校验来解除锁定(调用此方法,重新发起验证)。
LAPolicyDeviceOwnerAuthenticationWithBiometrics :
生物指纹识别。验证弹框有两个按钮,第一个是取消按钮,第二个按钮可以自定义标题名称(输入密码)。只有在第一次指纹验证失败后才会出现第二个按钮,这种鉴定方式的第二个按钮的功能自定义。前三次指纹验证失败,指纹验证框不再弹出。再次重新进入验证,还有两次验证机会,如果还是验证失败,TOUCH ID 被锁住不再继续弹出指纹验证框。以后的每次验证都将会弹出设备密码输入框直至输入正确的设备密码方可解除TOUCH ID锁。
LAPolicyDeviceOwnerAuthentication:
生物指纹识别或系统密码验证。如果TOUCH ID 可用,且已经录入指纹,则优先调用指纹验证。其次是调用系统密码验证,如果没有开启设备密码,则不可以使用这种验证方式。指纹识别验证失败三次将弹出设备密码输入框,如果不进行密码输入。再次进来还可以有两次机会验证指纹,如果都失败则TOUCH ID被锁住,以后每次进来验证都是调用系统的设备密码直至输入正确的设备密码方可解除TOUCH ID锁。
验证错误枚举:
-1=LAErrorAuthenticationFailed, // 验证信息出错,就是说你指纹不对。【授权失败,代表连续三次指纹识别错误】
-2=LAErrorUserCancel // 用户取消了验证 【在TouchID对话框中点击了 取消按钮】
-3=LAErrorUserFallback // 用户点击了手动输入密码的按钮,所以被取消了
-4=LAErrorSystemCancel // 被系统取消,就是说你现在进入别的应用了【TouchID对话框被系统取消,例如按下Home或者电源键】
-5=LAErrorPasscodeNotSet // 用户设备没有设置密码
-6=LAErrorTouchIDNotAvailable // 用户设备不支持TouchID
-7=LAErrorTouchIDNotEnrolled // 用户没有设置手指指纹
-8=LAErrorTouchIDLockout // 用户错误次数太多,现在被锁住了 【三次之后,又错了两次,下一次需要输入系统密码】
-9=LAErrorAppCancel // 在验证中被其他app中断 【如突然来了电话,电话应用进入前台,APP被挂起啦】
-10=LAErrorInvalidContext // 请求验证出错
3、常见问题
版本问题
-
iOS 9 之前是没有
LAErrorTouchIDLockout
锁定这个选项的,默认错误5次后;第6次验证是自动弹出输入密码界面; -
iOS 9 之后(现在设备大多是这个版本)锁定指纹识别之后,如果需要立即弹出输入密码界面需要使用
LAPolicyDeviceOwnerAuthentication
这个属性重新发起验证 - 如果输入了锁屏密码,指纹解密锁定会默认解除
EvaluatePolicy函数中第二个参数localizedReason
var localizedReason = new NSString("Verify fingerprint"); //验证指纹【下图再试一次下面的文字】,(参数不能为空,否则报错)
feedback按钮显示
- 默认第一次识别只有取消按钮
- 错误一次之后,会显示 feedBack 按钮
- 如果不想显示 feedback 按钮,可以设置
feedBackTitle = @""
指纹识别慢的问题
- 指纹识别启动过程有时需要2s 左右的时间,如果发现启动比较慢,这个是正常现象
- 支付宝和微信为了消除用户的紧张情绪,在开启指纹识别的时候都有放 HUD
- 指纹识别完成后,需要返回主线程进行相应的操作;否者你会发现有时候识别完4-5秒才有反应
参考:
TouchID--kLAErrorTouchIDLockout--解除
iOS 指纹识别常见问题汇总(**)