我正在开发几个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];
    }

}


在几乎所有设备上,这一切都可以很好地工作,但是在某些情况下,用户会抱怨。因此,我检查了服务器正在接收的内容,并看到正在发送不同的值。
我检查了代码,在没有其他地方可以访问/清空此钥匙串元素,这有什么问题呢?对于大多数设备来说,这就像一个咒语,但是由于某些原因,在某些设备中,它们不能很好地存储或从钥匙串中检索。
该问题发生在同一应用程序中的不同调用中。

最佳答案

如果您将Apple的示例代码用于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相关的功能。现在效果很好。

关于ios - iOS钥匙串(keychain)并不总是存储值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19112722/

10-13 04:05