¿Determina si existe un elemento de llavero protegido con ID táctil?

¿Hay alguna forma de determinar si un elemento (contraseña, token, etc.) se ha configurado en el llavero iOS utilizando el control de acceso Touch ID sin que el usuario solicite el identificador táctil? Tenemos la necesidad de determinar si la cnetworkingencial ya se ha guardado en el llavero (con protección Touch ID) antes de realizar una operación, pero no queremos interrumpir al usuario con el aviso de Touch ID.

He probado lo siguiente …

NSMutableDictionary *query = ... query[(__bridge id)kSecUseNoAuthenticationUI] = (__bridge id)kCFBooleanTrue; OSStatus opStatus = SecItemCopyMatching((__bridge CFDictionaryRef)query, NULL); ... 

Sin embargo, cuando se invoca este código, el usuario sigue viendo el post de identificación de contacto. No queremos que NADA se muestre en la interfaz de usuario, y solo queremos que se devuelva un error en el OSStatus del sistema OSStatus si se hubiera requerido la identificación del tacto.

¿Alguna idea?

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

basado en el código de neoneye y Swift 3. He agregado 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 } } }