2017-06-23 12 views
1

私のアプリでタッチIDアクセスを統合しようとしています。私は正常にそれを統合しました。ここではそのコードです:私は、iPhoneの設定からすべての指紋を削除すると、今チェックする方法iOSの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 
      } 
     }); 
    }); 

、このコードは動作し、パスコードを要求します。だから私の質問は:

どのようにタッチIDのために追加された指紋がないことを知ることができますか?

アプリのセキュリティのためのパスコード画面を既に構築しているため、iOSデバイスのパスコード画面を表示したくありません。それで、タッチIDアクセスのために少なくとも1つの指紋があるデバイスをチェックするオプションはありますか?

ありがとうございます。

======== EDIT 1 ===========

それはまた、私の側に取り組んでいます。問題は、Touch IDを尋ねるたびにチェックする必要があることです。 viewWillAppearまたはapplicationDidBecomeActiveのステータスを取得する必要があります。アプリでタッチIDアクセスを使用するたびに、フィンガーランタイムを削除するため、コードに反映されない可能性があります。毎回フェッチする必要があります。

+0

は、[この]に複製する可能性があります(https://stackoverflow.com/questions/38790185/how-to-find-finger-print-touch- id-count) – ovo

答えて

2

canEvaluatePolicy:error:はエラーになります:タッチIDが何 の指を登録しているため、LAErrorTouchIDNotEnrolled

認証が起動しないことができませんでした。

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); 
     } 
    } 
+0

なぜisTouchExistsでtrueを返すのですか? – Max

+0

あなたはiOS 9でですか? –

+0

私は、Apple DevのiOS 9のバグを見ました。フォーラムhttps://forums.developer.apple.com/message/193538#193538 –

関連する問題