SecItemAdd()返回errSecInteractionNotAllowed(-25308)

时间:2014-09-24 13:58:06

标签: ios xcode keychain touch-id

我为将值存储到钥匙串而进行的任何尝试都失败,错误代码为errSecInteractionNotAllowed(-25308)。我一直在玩Touch ID和钥匙链,所以我可能已经改变了我不知道的许可,但是我无法弄清楚我可以改变什么可能导致这个问题。

在摆弄钥匙串之前,我能够成功地将一个值存储到钥匙串中,因此很可能是设备中某处的设置。如果它是一个设置,我想帮助发现我需要更改以便再次在钥匙串中保存数据。此外,我想要一些建议,以确保我可以在尝试之前保存到钥匙串。

static NSString *serviceName = @"myServiceName";

- (void) createTouchIdKeyChain:(NSString *)identifier password:(NSString*)password{
CFErrorRef error = nil;
SecAccessControlRef sacObject =
SecAccessControlCreateWithFlags( kCFAllocatorDefault,
                                kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly,
                                kSecAccessControlUserPresence,  &error);

NSData* secret = [password dataUsingEncoding:NSUTF8StringEncoding];

NSDictionary* attributes = @{
                             (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
                             (__bridge id)kSecAttrService: serviceName,
                             (__bridge id)kSecAttrAccount: identifier,
                             (__bridge id)kSecValueData: secret,
                             (__bridge id)kSecAttrAccessControl: (__bridge id)sacObject,
                             (__bridge id)kSecUseOperationPrompt: @"create password test"
                             };
OSStatus status = SecItemAdd((__bridge CFDictionaryRef) attributes, nil);
ODLog(@"done");
}

1 个答案:

答案 0 :(得分:1)

在我的情况下,如果您尝试将两个具有相同标识符的项目存储到钥匙串中,则第二次尝试将失败,错误代码为-25308。尝试删除第一个,然后重试。