如何检查iOS中没有为Touch ID添加指纹

时间:2017-06-23 09:05:23

标签: ios objective-c iphone fingerprint touch-id

我正在我的应用中集成Touch ID访问权限。我已成功整合它。这是代码:

    dispatch_queue_t highPriorityQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0);
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.75 * NSEC_PER_SEC), highPriorityQueue, ^{

        dispatch_async(dispatch_get_main_queue(), ^{

            LAContext *context = [[LAContext alloc] init];
            isTouchExists = [context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil];
            if (isTouchExists) {
                NSString * keychainItemIdentifier;

                NSString * keychainItemServiceName;
                keychainItemIdentifier = @"fingerprintKeychainEntry";
                keychainItemServiceName = [[NSBundle mainBundle] bundleIdentifier];
                NSData * pwData = [@"the password itself does not matter" dataUsingEncoding:NSUTF8StringEncoding];
                NSMutableDictionary * attributes = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
                                                    (__bridge id)(kSecClassGenericPassword), kSecClass,
                                                    keychainItemIdentifier, kSecAttrAccount,
                                                    keychainItemServiceName, kSecAttrService, nil];
                CFErrorRef accessControlError = NULL;
                SecAccessControlRef accessControlRef = SecAccessControlCreateWithFlags(
                                                                                       kCFAllocatorDefault,
                                                                                       kSecAttrAccessibleWhenUnlockedThisDeviceOnly,
                                                                                       kSecAccessControlUserPresence,
                                                                                       &accessControlError);
                if (accessControlRef == NULL || accessControlError != NULL)
                {
                    NSLog(@"Cannot create SecAccessControlRef to store a password with identifier “%@” in the key chain: %@.", keychainItemIdentifier, accessControlError);
                }

                attributes[(__bridge id)kSecAttrAccessControl] = (__bridge id)accessControlRef;
                attributes[(__bridge id)kSecUseNoAuthenticationUI] = @YES;
                attributes[(__bridge id)kSecValueData] = pwData;

                CFTypeRef result;
                OSStatus osStatus = SecItemAdd((__bridge CFDictionaryRef)attributes, &result);

                if (osStatus != noErr)
                {
                    NSError * error = [[NSError alloc] initWithDomain:NSOSStatusErrorDomain code:osStatus userInfo:nil];
                    NSLog(@"Adding generic password with identifier “%@” to keychain failed with OSError %d: %@.", keychainItemIdentifier, (int)osStatus, error);
                }
                //other my code for success
           }
        });
    });

现在,如果我从iPhone中的设置中删除所有指纹,此代码将起作用并要求输入密码。所以我的问题是:

我如何才能知道Touch ID没有添加任何指纹?

我不想显示iOS设备密码屏幕,因为我已经为我的应用安全设置了密码屏幕。那么有没有选项来检查设备是否有至少一个可用于Touch ID访问的指纹?

提前致谢。

========编辑1 ===========

它也在我这边工作。问题是每次我要求Touch ID时都需要检查它。每当我想在应用中使用Touch ID访问时,我都需要在viewWillAppearapplicationDidBecomeActive中获取状态,因为我要删除手指运行时间,它可能无法反映在我的代码中所以我需要每次都取。

2 个答案:

答案 0 :(得分:3)

canEvaluatePolicy:error:将出现错误:LAErrorTouchIDNotEnrolled

  

无法启动身份验证,因为Touch ID尚未注册   手指。

APPLE DOC Ref.

尝试:

LAContext *context = [[LAContext alloc] init];
    NSError *error;
    if ([context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&error]) {
        [context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"My Reason" reply:^(BOOL success, NSError * _Nullable error) {

        }];
    }else{
        if (error.code == LAErrorTouchIDNotEnrolled) {
            NSLog(@"Error: %@", error.localizedDescription);
        }
    }

答案 1 :(得分:1)

如果没有注册指纹,canEvaluatePolicy应该返回false。

来源:https://developer.apple.com/documentation/localauthentication/lacontext/1514149-canevaluatepolicy?language=objc