我开发了几个iOS应用程序,我需要在它们之间共享一个元素,我想存储在钥匙串中。 这个元素用于一个复杂的登录过程,有3个或4个步骤,每个我都需要读取钥匙串中的值,为此我用下面的代码:
- (NSString *)installationToken
{
KeychainItemWrapper *kw = [[KeychainItemWrapper alloc] initWithIdentifier:@"uuid" accessGroup:@"yyyyy.xxxxxxxxxxx"];
if (![kw objectForKey:(NSString*)kSecAttrAccount] || [[kw objectForKey:(NSString*)kSecAttrAccount] isEqualToString:@""]) {
NSString *result;
CFUUIDRef uuid;
CFStringRef uuidStr;
uuid = CFUUIDCreate(NULL);
assert(uuid != NULL);
uuidStr = CFUUIDCreateString(NULL, uuid);
assert(uuidStr != NULL);
result = [NSString stringWithFormat:@"%@", uuidStr];
assert(result != nil);
CFRelease(uuidStr);
CFRelease(uuid);
[kw setObject:result forKey:(NSString*)kSecAttrAccount];
return result;
} else {
return [kw objectForKey:(NSString*)kSecAttrAccount];
}
}
这几乎适用于所有设备,但在某些设备中,用户抱怨。所以,我检查了我的服务器正在接收的内容,并看到正在发送不同的值。 我检查了代码,在其他地方我没有进行/清空这个钥匙串元素,这有什么不对吗?对于大多数设备而言,这就像一个魅力,但由于某种原因,在某些设备中,它们不能从钥匙链中存储或检索。 问题发生在同一个应用程序中的不同调用中。
答案 0 :(得分:1)
如果您正在使用Apples的KeyChainWrapper示例代码,那么主要问题有时是随机的,SecItemCopyMatching失败,然后示例代码有resetKeychainItem,这将基本上重置您的钥匙串。
if (! SecItemCopyMatching((CFDictionaryRef)tempQuery, (CFTypeRef *)&outDictionary) == noErr)
{
// Stick these default values into Keychain if nothing found.
[self resetKeychainItem];
}
在我们的应用中,我们发现了类似的问题,现在我们正在使用
https://github.com/carlbrown/PDKeychainBindingsController执行所有与keyChain相关的功能。现在它运作良好。