iOS开发使用TouchID验证登录踩过的一些坑(同时更新FaceID使用方法)
FaceID
iPhoneX 提供的刷脸功能与之前的设备的TouchID类似,都是属于生物验证的范畴。苹果爸爸也是为了照顾开发者,这两个功能对应的API基本相同,对于之前支持TouchID的APP其实可以在不做任何修改的基础上兼容FaceID,只是在一些UI样式上需要修改。
biometryType
iOS11之后LAContext
新增biometryType
属性,调用时候可以根据这个属性来判断当前设备是使用FaceID还是TouchID,并据此做UI样式上的调整typedef NS_ENUM(NSInteger, LABiometryType){/// The device does not support biometry.LABiometryTypeNone API_AVAILABLE(macos(10.13.2), ios(11.2)),LABiometryNone API_DEPRECATED_WITH_REPLACEMENT("LABiometryTypeNone", macos(10.13, 10.13.2), ios(11.0, 11.2)) = LABiometryTypeNone,/// The device supports Touch ID.LABiometryTypeTouchID,/// The device supports Face ID.LABiometryTypeFaceID API_UNAVAILABLE(macos),} API_AVAILABLE(macos(10.13.2), ios(11.0)) API_UNAVAILABLE(watchos, tvos);/// Indicates the type of the biometry supported by the device.////// @discussion This property is set only when canEvaluatePolicy succeeds for a biometric policy./// The default value is LABiometryTypeNone.@property (nonatomic, readonly) LABiometryType biometryType API_AVAILABLE(macos(10.13.2), ios(11.0)) API_UNAVAILABLE(watchos, tvos);
NSFaceIDUsageDescription
使用FaceID需要在info.plist中增加NSFaceIDUsageDescription
权限申请说明,这个跟定位、拍照等一样,如果不增加默认提示如下,虽然不会崩溃,但最好还是加上。FaceID权限.jpg
其他
FaceID的调用方法跟TouchID一样,都是先判断再调用,具体流程参照分割线后的TouchID部分。注意
FaceID如果 不间断连续尝试 次数超过5次之后,会弹窗提示如下,同时不再执行reply:
对应的block,这个需要注意超出次数.jpg
[myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometricslocalizedReason:myLocalizedReasonStringreply:^(BOOL success, NSError *error) {//!!!超出次数,提示弹窗后,这里的block不会执行!!!}];
TouchID
iPhone 5s之后苹果推出的TouchID功能绝对是登录验证的一大神器,自此之后各种APP在涉及到登录时如果不把这一方式加上,估计都不好意思说是做APP的。这就苦了我们众程序猿,在开发中免不了要遇上各种坑。
在次我将自己曾经趟过的一些坑罗列了下
调用前的判断
在调用TouchID验证弹窗前最好先判断一下设备是否支持TouchID
//创建安全验证对象LAContext * con = [[LAContext alloc]init];NSError * error;//判断是否支持密码验证/*** LAPolicyDeviceOwnerAuthentication 可输入手机密码的验证方式* LAPolicyDeviceOwnerAuthenticationWithBiometrics 只有指纹的验证方式*/BOOL can = [con canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error];
这里有两种验证方式可选:
. LAPolicyDeviceOwnerAuthenticationWithBiometrics
iOS8.0以上支持,只有指纹验证功能
. LAPolicyDeviceOwnerAuthentication
iOS 9.0以上支持,包含指纹验证与输入密码的验证方式
调用TouchID
//初始化上下文对象
LAContext *context = [[LAContext alloc] init];
//localizedFallbackTitle=@“”,不会出现“输入密码”按钮
context.localizedFallbackTitle = @"";
//错误对象
NSError *error = nil;
NSString *result = @"验证信息";//判断是否支持密码验证
/***LAPolicyDeviceOwnerAuthentication 手机密码的验证方式*LAPolicyDeviceOwnerAuthenticationWithBiometrics 指纹的验证方式*/
if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:result reply:^(BOOL success, NSError *error) {if(error.code == LAErrorTouchIDLockout) {BOOL can = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error];if (can) {[context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:result reply:^(BOOL success, NSError * _Nullable error) {}];}else{NSLog(@"调起账号密码页面失败!!!");}}}];
}
注意context.localizedFallbackTitle = @"";
如果不设置空值,则AlertView弹窗默认会有“输入密码”的选项,但是在LAPolicyDeviceOwnerAuthenticationWithBiometrics
模式下点击“输入密码”不会有反应;LAPolicyDeviceOwnerAuthentication
模式下点击可以唤起输入手机密码页面,页面如下,其中除了“指纹”两字是你的app名称,其他都不可定制
iPhone.jpg
验证错误码的判断
系统提供的错误码
// Error codes#define kLAErrorAuthenticationFailed -1#define kLAErrorUserCancel -2#define kLAErrorUserFallback -3#define kLAErrorSystemCancel -4#define kLAErrorPasscodeNotSet -5#define kLAErrorTouchIDNotAvailable -6#define kLAErrorTouchIDNotEnrolled -7#define kLAErrorTouchIDLockout -8#define kLAErrorAppCancel -9#define kLAErrorInvalidContext -10#define kLAErrorNotInteractive -1004#define kLAErrorBiometryNotAvailable kLAErrorTouchIDNotAvailable#define kLAErrorBiometryNotEnrolled kLAErrorTouchIDNotEnrolled#define kLAErrorBiometryLockout kLAErrorTouchIDLockout
验证失败,你可以根据实际情况将错误原因反馈给用户,比如在上面的调用TouchID代码中,当判断到TouchID被锁定,使用LAPolicyDeviceOwnerAuthentication
模式再次验证,并弹出输入密码页面解锁。
if(error.code == LAErrorTouchIDLockout) {BOOL can = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthentication error:&error];if (can) {[context evaluatePolicy:LAPolicyDeviceOwnerAuthentication localizedReason:result reply:^(BOOL success, NSError * _Nullable error) {}];}else{NSLog(@"调起账号密码页面失败!!!");}
}
敲黑板 看重点
前面说的都是TouchID使用时候的常规场景,下面说一下可能会忽视的重点!!
使用TouchID,必须确保app已经是活动状态!!
使用TouchID,必须确保app已经是活动状态!!
使用TouchID,必须确保app已经是活动状态!!
也即是说当你调用TouchID时,必须确保程序已经收到了UIApplicationDidBecomeActiveNotification的消息,不然的话会调用失败,返回一个错误Code: -1004 NSLocalizedDescription: User interaction is required
-1004这个错误码并不包含在官方SDK提供的文档中,但根据提示应该能够明白这是由于APP并没完全启动,未能提供用户交互导致。
-1004 错误在iOS11 SDK中已经更新,对应的错误描述如下:/// Authentication failed, because it would require showing UI which has been forbidden /// by using interactionNotAllowed property. LAErrorNotInteractive API_AVAILABLE(macos(10.10), ios(8.0), watchos(3.0), tvos(10.0)) = kLAErrorNotInteractive,
我曾经因为在applicationWillEnterForeground:
以及application: didReceiveRemoteNotification:
两个方法中进行登录判断,过早的调用了TouchID导致-1004报错,着实被坑了一把。特别是在application: didReceiveRemoteNotification:
点击消息推送启动的时,部分设备会报-1004,而有些又不会,最后费了好大劲才找到原因。
注重点:这个地方是本人多次试验,晕
- 同一个文件路径下的同一份代码,打包编译成多个ipa安装包,就算各个包的
Bundle Identifier
不同,安装到同一个设备后,也只有最后生成的那个ipa包可以启用TouchID,其他包会报Code: -1004 NSLocalizedDescription: User interaction is required的错误。
神奇吧!!这个也是我经过了多次踩坑才发现的。开发中一份代码打多个包测试时注意下,避免再次入坑。
iOS开发使用TouchID验证登录踩过的一些坑(同时更新FaceID使用方法)相关推荐
- iOS开发实现TouchID指纹解锁
iOS开发实现TouchID指纹解锁 一直想实现一下指纹解锁,苦于一直没时间,最近终于闲了下来所以翻了翻文档看了看demo,完成了这篇教程.本功能实现起来是很简单的,因为苹果都已经帮我们封装好了,只需 ...
- 【ios开发/Xcode】实现登录注册
[ios开发/Xcode]实现登录注册 实现效果 源代码 实现效果 首先进入初始界面,输入账号Linchuantao,密码Linchuantao,显示登录失败(如下左图),因此需要进行注册,点击左下角 ...
- 【ios开发Xcode】实现登录注册
[ios开发/Xcode]实现登录注册 实现效果 源代码 实现效果 首先进入初始界面,输入账号Linchuantao,密码Linchuantao,显示登录失败(如下左图),因此需要进行注册,点击左下角 ...
- (0009) iOS 开发之友盟统计分析SDK已全面支持HTTPS的更新
iOS开发技术分享群 147787076 [友盟+]友盟统计分析SDK已全面支持HTTPS,请IOS开发者及时升级文档(http://dev.umeng.com/analytics/ios-doc/i ...
- Python开发系列课程(10) - 那些年我们踩过的那些坑(上)
那些年我们踩过的那些坑 坑01 - 整数比较的坑 在 Python 中一切都是对象,整数也是对象,在比较两个整数时有两个运算符==和is,它们的区别是: is比较的是两个整数对象的id值是否相等,也就 ...
- ios与android指纹识别,iOS开发实现TouchID指纹解锁
一直想实现一下指纹解锁,苦于一直没时间,最近终于闲了下来所以翻了翻文档看了看demo,完成了这篇教程.本功能实现起来是很简单的,因为苹果都已经帮我们封装好了,只需要实现几个方法就可以了. 实现效果图 ...
- iOS开发日记4-第三方登录(ShareSDK)
今天博主有一个第三方登录的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步. 第三方登录的方法很多,最直接的方法就是去各大开发者平台申请id之后看官方文档直接集成,当然也有偷懒的方法.类似博主 ...
- 社会化登录踩的几个坑
有一年没有碰QQ登录/微信登录/新浪登录的东西了,偶然间发现一些问题,在此总结一下,做一下记录. Android5以下新浪登录"回不来" 这个问题的原因挺简单的,将LoginAct ...
- 小程序开发-1:用户登录授权没反应-遇坑
一个看似没有什么问题的代码,但点了好几次登录授权都没有反应. getUserProfile() {// 推荐使用wx.getUserProfile获取用户信息,开发者每次通过该接口获取用户个人信息均需 ...
- iOS实现简书的登录验证方式(极验验证)
开篇 我们登录简书的时候就会看到如下类似的验证方式,个人还是很喜欢这种验证方式的,想着如果把它自如自己设计的软件中还是不错的,但是我们要怎么实现这种验证效果呢,今天就来介绍一下. 图形验证码.gif ...
最新文章
- 工作如果没有方法,光靠苦力是不行的
- 如何转换高度:0; 达到高度:自动; 使用CSS?
- 关于使用“JS获取屏幕,浏览器,网页高度宽度”的个人思考
- SSM商城项目(八)
- 1.2.4 计算机的工作过程(从源程序到可执行文件、指令执行过程的描述)
- html边框有箭头,css简单实现带箭头的边框
- app 图标规格参考表
- python中fd和rt是什么意思_python中fd()是什么
- Softaken Unlock PDF Files v1.0 PDF文件解密
- 深入理解ARM体系架构(S3C6410)---认识S3C6410
- MySQL中通过结构化文本倒腾数据
- 运筹学教学|十分钟快速掌握割平面法及对偶单纯形法(附Java代码及算例)
- Mysql Workbench 8,连接时显示An AppArmor policy prevents this sender from sending this message to this rec
- Spring实例(DI注入)——女生追男生
- 复旦961-软件工程笔记
- 计算机电子科学技术产品,关于电子信息科学技术发展现状的思考
- 例子, 防火墙配置domian比较策略
- Android通过DeepLink方式跳转其他App传递参数
- NSDate-日期类nbsp;OC——第七天(1)
- css实现多个div自适应高度(一样高)
热门文章
- Vmware虚拟机的linux与主机共享
- 数据库系统工程师输给了计算机等级考试二级
- 项目管理学习笔记五:项目整体管理
- innerHTML和innerText的使用和区别
- bzoj 4289 TAX —— 点边转化
- 学习python: x+=1 与 x = x + 1
- 针对建筑设计开发的CAD软件——ARCHICAD 24 for mac
- Mindomo Desktop for Mac(思维导图)中文版
- Tuxera NTFS有什么优点可以让我们使用?
- iOS底层探索之多线程(十一)—GCD源码分析(调度组)