Связка ключей iOS не всегда сохраняет значения

Я разрабатываю пару приложений для 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];
    }

}

Все это хорошо работает почти на каждом устройстве, но на некоторых пользователи жалуются. Итак, я проверил, что получает мой сервер, и увидел, что отправляются разные значения. Я проверил код и нигде больше не получаю/очищаю этот элемент связки ключей, что может быть не так? Для большинства устройств это работает как шарм, но по какой-то причине на некоторых устройствах они плохо хранятся или извлекаются из цепочки для ключей. Проблема возникает при разных вызовах в одном и том же приложении.


person mnuno    schedule 01.10.2013    source источник


Ответы (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. Теперь это работает очень хорошо.

person user1165756    schedule 01.10.2013