自从公司的PM买了iPhone X后,于是就走上了适配这条不归路。原先项目里有接入TouchID,一切都是那么的完美。直到某天PM拿着手机给我看了张图.
FaceID权限PM说iPhoneX是高端用户,就不要让他们看到TouchID字眼。嗯好的,你都是对的。然后我把这个功能模块封装了一下,后面会提供demo。
开启权限
在info.plist文件里设置NSFaceIDUsageDescription
就ok。这个可以理解为开启FaceID权限,就相当于调定位、相册那些权限一样。
引入框架
#import <LocalAuthentication/LocalAuthentication.h>
验证方式
-
LAPolicyDeviceOwnerAuthenticationWithBiometrics
(只有指纹/FaceID验证功能) -
LAPolicyDeviceOwnerAuthentication
(包含指纹/FaceID验证和密码验证)
调用前判断
NSString *message = IS_IPHONE_X ? @"面容 ID 短时间内失败多次,需要验证手机密码" : @"请把你的手指放到Home键上";// 当deviceType为LAPolicyDeviceOwnerAuthentication的时候,iPhone X会需要前面这段描述
NSInteger deviceType = LAPolicyDeviceOwnerAuthenticationWithBiometrics;//单纯指纹或FaceID,LAPolicyDeviceOwnerAuthentication会有密码验证
LAContext *laContext = [[LAContext alloc] init];
laContext.localizedFallbackTitle = @""; // 隐藏左边的按钮(默认是忘记密码的按钮)
NSError *error = nil;
BOOL isSupport = [laContext canEvaluatePolicy:(deviceType) error:&error];
调用FaceID或者TouchID(方法是同一个,系统会自己判断)
if (isSupport) {
[laContext evaluatePolicy:(deviceType) localizedReason:message reply:^(BOOL s, NSError * _Nullable error) {
if (s) {
success();
}else {
failure(error, LAContextErrorAuthorFailure);
}
}];
}else {
failure(error, LAContextErrorAuthorNotAccess);
}
-
localizedReason:
这个参数不可为空,否则会crash
回调失败的处理(只记录了几个我在项目中测试出来的)
error.code == -8 :出TouchID尝试次数或FaceID尝试次数,已被锁
error.code == -7 :未开启TouchID权限(没有可用的指纹)
error.code == -6 :iPhoneX设置里面没有开启FaceID权限/非iPhoneX手机且该手机不支持TouchID(如iPhone5、iPhone4s)
大体上就是这些,这里是demo。如果有表述错误的,欢迎指正😬
网友评论