2014-06-18 3 views
9

Я использую брелок для хранения данных на локальном устройстве, но решил адаптировать его для использования через несколько устройств через iCloud. Я включил право iCloud и создал необходимую конфигурацию в Центре-члене. Однако, пока данные хранятся, не отображается, что они хранятся в облаке. Я тестирую между симулятором и моим устройством iPhone. Симулятор зарегистрирован в моей учетной записи. Каждое устройство продолжает сохранять данные, но другое устройство не видит результатов.Данные о брелках не хранятся в iCloud

Я только добавил kSecAttrSynchronizable и kCFBooleanTrue к завершающей настройке, которую я понял, это все, что было необходимо для того, чтобы использовать брелок в облаке.

Здесь код, используемый для хранения и вызова данных брелка.

+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service 
{ 
    return [NSMutableDictionary dictionaryWithObjectsAndKeys: 
      (__bridge id)kSecClassGenericPassword,(__bridge id)kSecClass, 
      service, (__bridge id)kSecAttrService, 
      service, (__bridge id)kSecAttrAccount, 
      (__bridge id)kCFBooleanTrue, (__bridge id)kSecAttrSynchronizable, 
      (__bridge id)kSecAttrAccessibleAfterFirstUnlock,(__bridge id)kSecAttrAccessible, 
      nil]; 
} 

+ (void)save:(NSString *)service data:(id)data 
{ 
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
    CFTypeRef result = NULL; 
    SecItemDelete((__bridge CFDictionaryRef)keychainQuery); 
    [keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge id)kSecValueData]; 
    OSStatus status = SecItemAdd((__bridge CFDictionaryRef)keychainQuery, &result); 

    if (status == errSecSuccess) NSLog(@"Succcessfully Stored Value"); 
    else NSLog(@"Failed to store value with code: %ld",(long)status); 
} 

+ (id)load:(NSString *)service { 
    id ret = nil; 
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
    [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge id)kSecReturnData]; 
    [keychainQuery setObject:(__bridge id)kSecMatchLimitOne forKey:(__bridge id)kSecMatchLimit]; 
    CFDataRef keyData = NULL; 
    if (SecItemCopyMatching((__bridge CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) { 
     @try { 
      ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge NSData *)keyData]; 
     } 
     @catch (NSException *e) { 
      NSLog(@"Unarchive of %@ failed: %@", service, e); 
     } 
     @finally {} 
    } 
    if (keyData) CFRelease(keyData); 
    return ret; 
} 

+ (void)delete:(NSString *)service { 
    NSMutableDictionary *keychainQuery = [self getKeychainQuery:service]; 
    SecItemDelete((__bridge CFDictionaryRef)keychainQuery); 
} 
+0

Немного о последующей деятельности. Я наблюдал за связкой на моем Mac, используя приложение на телефоне. Я видел, как записываются данные о брелках, и, похоже, он работает. Однако у меня создалось впечатление, что симулятор также должен работать, и в Debug в симе есть опция «trigger iCloud Sync». Документация Apple также указывает, что симулятор можно использовать. Однако, похоже, что он не взаимодействует с основной цепочкой ключей, даже если моя учетная запись вводится на симуляторе. – C6Silver

+0

Когда вы говорите, что разрешено «iCloud право», вы имеете в виду, что вы включили функцию keychain в разделе «iCloud» в приложении настроек? Или есть какой-то флип, который вы должны включить в pList? –

+0

Включено в разделе «Возможности» в настройках «Цели». В Центре участников добавлено «iCloud» к идентификатору приложения (это право, которое они ссылаются на вкладке «Возможности». – C6Silver

ответ

0

Тренажера - версия 7.1 (463.9.41) - не имеет (я думаю, «не симулирует» является более точным) необходимым аппаратным обеспечением для безопасного управления брелки.

Вы можете заметить на симуляторе в Settngs.app под iCloud нет опции для Keychain, тогда как на устройстве эта опция существует.

Если вы копаете в ~/Library/Application Support/iPhone Simulator/7.1/Library/Keychains, вы найдете брелок симулятора. kSecAttrAccessGroup - test для всех предметов, которые я положил в брелок симулятора. При работе на устройстве я получаю ожидаемую группу доступа (идентификатор приложения моего приложения).

Все это указывает на то, что симулятор не поддерживает синхронизацию клавиш iCloud Keychain. Сеанс WWDC 2014 года # 711 Брелок и аутентификация с сенсорным идентификатором подробно рассказывает о том, как аппаратные функции устройства поддерживают шифрование ключей.

Два устройства iOS или iOS и OS X были единственным способом, с помощью которого я мог надежно разрабатывать, отлаживать и устранять неполадки синхронизации iCloud Keychain.

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