2015-12-10 14 views
10

タッチIDアクセスコントロールを使用してiOSキーチェーンにアイテム(パスワード、トークンなど)が設定されているかどうかを判断する方法はありますか?操作を実行する前に、資格情報が(タッチID保護付きの)キーチェーンに保存されているかどうかを判断する必要がありますが、Touch IDプロンプトでユーザーを中断したくない場合があります。タッチIDで保護されたキーチェーンアイテムが存在するかどうかを確認しますか?

私は...

NSMutableDictionary *query = ... 
query[(__bridge id)kSecUseNoAuthenticationUI] = (__bridge id)kCFBooleanTrue; 

OSStatus opStatus = SecItemCopyMatching((__bridge CFDictionaryRef)query, NULL); 

... 

しかし、このコードは、ユーザはまだタッチIDプロンプトを見て呼び出されたときに次のことを試してみました。 何かをUIに表示しないようにしてください。タッチID の場合、エラーはOSStatusに返されます。

どのような考えですか?

答えて

7
NSDictionary *query = @{ 
         (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword, 
         (__bridge id)kSecAttrService: @"SampleService", 
         (__bridge id)kSecUseNoAuthenticationUI: @YES 
         }; 

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    CFTypeRef dataTypeRef = NULL; 
    OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)(query), &dataTypeRef); 
    if (status == errSecInteractionNotAllowed) { 
     NSLog(@"ITEM EXIST"); 
    } else if (status == errSecItemNotFound) { 
     NSLog(@"ITEM DOES NOT EXIST"); 
    } else { 
     NSLog(@"status: %@", @(status)); 
    } 
}); 
1

neoneyeのコードとSwift 3に基づいています。私はerrSecAuthFailedを追加しました。

query[kSecClass as String] : kSecClassGenericPassword, 
    query[kSecAttrService as String] : "serviceName"  
    query[kSecUseAuthenticationUI as String] = kSecUseAuthenticationUIFail 

    DispatchQueue.global().async { 

     var result : AnyObject? 
     let status = SecItemCopyMatching(query as CFDictionary, &result) 

     if status == errSecInteractionNotAllowed { 

      DispatchQueue.main.async { 

       // item exists 
      } 
     } else if status == errSecAuthFailed { 

      DispatchQueue.main.async { 

       // item exists but someone removed the touch id or passcode 
      } 
     } else if status == errSecItemNotFound { 

      DispatchQueue.main.async { 

       // it does not exist 
      } 
     } else { 

      DispatchQueue.main.async { 

       // another OSStatus 
      } 
     } 
    } 
関連する問題