Obtenga el elemento llavero con LAContext y touchIDAuthenticationAllowableReuseDuration

Estoy intentando agregar la funcionalidad de touchIDAuthenticationAllowableReuseDuration a mi aplicación. Utilizo Touch ID para autenticar a un usuario en la aplicación y, al mismo time, recuperar un elemento del llavero. Antes de intentar agregar esto, no había ningún problema, siempre pedía Touch ID o si no estaba disponible para la contraseña del dispositivo. Ahora, hasta ahora, he logrado hacerlo para que haga lo mismo, y al abrir la aplicación dentro del time de espera especificado, no muestra el post de identificación de Touch como debería, si todo lo que estaba haciendo era autenticar al usuario I Habría terminado, pero el problema que tengo es que también quiero recuperar un artículo del llavero, y cuando el post se omite con éxito, pero una vez que SecItemCopyMatching(…) a SecItemCopyMatching(…) no obtengo el artículo De vuelta, en cambio sigo recibiendo errSecAuthFailed .

He mirado en línea en todas partes y lo mejor que he encontrado es el código de ejemplo de Apple, KeychainTouchID , pero, una vez más, no hace tanto la authentication como get un artículo del llavero al mismo time, intenté agregar eso a sus código y seguí recibiendo el mismo error también.

¿Alguien ha probado algo como esto antes? ¿Cómo hiciste que funcionara? Este es el código que tengo ahora mismo:

 SecAccessControlRef sacObject = SecAccessControlCreateWithFlags(kCFAllocatorDefault, kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly, kSecAccessControlTouchIDAny, nil); NSString *localizedReason = NSLocalizedString(@"Authenticate to access app", nil); LAContext *context = [[LAContext alloc] init]; context.touchIDAuthenticationAllowableReuseDuration = 5; [context evaluateAccessControl:sacObject operation:LAAccessControlOperationUseItem localizedReason:localizedReason reply:^(BOOL success, NSError *error) { if (success) { NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword, (__bridge id)kSecAttrService: PASSCODE_KEY, (__bridge id)kSecReturnData: @YES, (__bridge id)kSecUseOperationPrompt: localizedReason, (__bridge id)kSecUseAuthenticationUI: (__bridge id)kSecUseAuthenticationUIAllow, (__bridge id)kSecAttrAccessControl: (__bridge_transfer id)sacObject, (__bridge id)kSecUseAuthenticationContext: context }; CFTypeRef dataTypeRef = NULL; OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)(query), &dataTypeRef); // This works when using Touch ID / passcode, but I get errSecAuthFailed when the prompt isn't shown because of the reuse duration. if (status == errSecSuccess) { NSData *resultData = (__bridge_transfer NSData *)dataTypeRef; NSString *result = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding]; self.recovenetworkingString = result; } else { self.recovenetworkingString = @""; } } else { self.recovenetworkingString = @""; CFRelease(sacObject); } }];