【问题标题】:Keychain iOS not always storing values钥匙串 iOS 并不总是存储值
【发布时间】:2013-10-01 09:33:37
【问题描述】:

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

}

这几乎适用于所有设备,但在某些设备中,用户抱怨。所以,我检查了我的服务器正在接收什么,并看到正在发送不同的值。 我检查了代码,在其他地方我没有访问/清空这个钥匙串元素,这有什么问题?对于大多数设备来说,这就像一个魅力,但出于某种原因,在某些设备中,它们不能很好地从钥匙串中存储或检索。 该问题发生在同一应用程序的不同调用中。

【问题讨论】:

    标签: ios keychain keychainitemwrapper


    【解决方案1】:

    如果您使用 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 相关的功能。现在效果很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多