2013-10-01 3 views
0

Я разрабатываю пару приложений для iOS, и мне нужно разделить элемент между ними, который я хочу сохранить в цепочке ключей. Этот элемент используется в сложном процессе входа в систему с 3-х или 4-х этапов, в каждом из них я должен прочитать значение из брелка, чтобы сделать это я использовал код ниже:Keychain iOS не всегда сохраняет значения

- (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]; 
    } 

} 

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

ответ

1

Если вы используете образец кода Яблока для 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 функциональность. Теперь он работает очень хорошо.

Смежные вопросы