我正在使用https://github.com/oblador/react-native-keychain开发一个本机应用程序,以从钥匙串中保存和获取东西。
存储在钥匙串中的东西(以及其他一些东西)应该可以从我们所有的应用程序中访问。因此,在功能下的xcode中,我已激活了一个应用程序组“ group.something.test”。
我正在使用react-native-keychain的setGenericPassword函数,如下所示:
await Keychain.setGenericPassword(
'a username',
'a password',
{
service: 'a userId',
accessible: Keychain.ACCESSIBLE.ALWAYS,
accessGroup: 'group.something.test',
accessControl: Keychain.ACCESS_CONTROL.DEVICE_PASSCODE
}
);
在本机模块中,它将把它存储到钥匙串中,如下所示:
SecAccessControlRef sacRef = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleAlways,
kSecAccessControlDevicePasscode,
&error);
NSDictionary *attributes = attributes = @{
(__bridge NSString *)kSecClass: (__bridge id)(kSecClassGenericPassword),
(__bridge NSString *)kSecAttrService: service,
(__bridge NSString *)kSecAttrAccount: username,
(__bridge NSString *)kSecValueData: [password dataUsingEncoding:NSUTF8StringEncoding],
(__bridge NSString *)kSecAttrAccessControl] = (__bridge id)sacRef,
(__bridge NSString *)kSecAttrAccessGroup] = accessGroup;
};
...
OSStatus osStatus = SecItemAdd((__bridge CFDictionaryRef) attributes, NULL);
...
通过以下方式检索钥匙串项目:
await Keychain.getGenericPassword({ service: 'a userId' });
这将运行以下本机代码:
NSDictionary *query = @{
(__bridge NSString *)kSecClass: (__bridge id)(kSecClassGenericPassword),
(__bridge NSString *)kSecAttrService: service,
(__bridge NSString *)kSecReturnAttributes: (__bridge id)kCFBooleanTrue,
(__bridge NSString *)kSecReturnData: (__bridge id)kCFBooleanTrue,
(__bridge NSString *)kSecMatchLimit: (__bridge NSString *)kSecMatchLimitOne,
(__bridge NSString *)kSecUseOperationPrompt:@"Authenticate to retrieve secret"
};
CFTypeRef foundTypeRef = NULL;
OSStatus osStatus = SecItemCopyMatching((__bridge CFDictionaryRef) query, (CFTypeRef*)&foundTypeRef);
这在第一个应用程序中很好用,我可以从钥匙串中存储和检索项目。 当我通过仅将显示名称和捆绑标识符更改为其他名称通过xcode部署第二个应用程序时,它也可以工作。我可以检索第一个应用程序保存的密钥。 但是,如果现在返回第一个应用程序并尝试检索钥匙串项,则osStatus为-25308(errSecInteractionNotAllowed)。 如果我卸载第二个应用程序,它将再次在第一个应用程序中开始工作。
我在做什么错?在项目设置中我还需要做些其他事情吗? 我也尝试过使用钥匙串组功能,将钥匙串组与钥匙串组数组中的第一个索引相同,并将该ID用作kSecAttrAccessGroup。