Как программно определить, включен ли iCloud на устройстве пользователя при использовании только NSUbiquitousKeyValueStore?

Я использую NSUbiquitousKeyValueStore для синхронизации некоторых данных о настройках с iCloud. Я обнаружил, что если пользователь отключит элемент «Документ и данные» iCloud в «Настройках приложения», NSUbiquitousKeyValueStore не сможет синхронизировать свои данные с iCloud. Итак, я хочу сначала проверить, включен ли этот параметр. Я нашел этот фрагмент кода:

    NSURL *ubiq = [[NSFileManager defaultManager] 
                   URLForUbiquityContainerIdentifier:nil];
    NSLog(@"url=%@",ubiq);
    if (!ubiq) {
        UIAlertView *av = [[UIAlertView alloc] initWithTitle:nil message:@"Please enable iCloud in Setting app" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
        [av show];
        return;

    }

Я хочу знать, является ли это единственным способом обнаружения, даже если я просто использую NSUbiquitousKeyValueStore (не хранилище документов iCloud). Есть ли лучшая альтернатива?


person Jagie    schedule 13.06.2012    source источник


Ответы (2)


По сути, NSUbiquitousKeyValueStore всегда доступен, даже если у пользователя нет учетной записи iCloud (в данном случае NSUbiquitousKeyValueStore — простое локальное хранилище). Так что в целом вам не нужно спрашивать себя или пользователя, есть ли настроенная учетная запись iCloud.

Если вы действительно хотите знать наверняка, в iOS 5 единственное решение — это то, о котором вы говорите.

person Julien    schedule 24.06.2012
comment
Ваш ответ, кажется, противоречит документам, в которых говорится: «Избегайте использования этого класса для данных, которые важны для поведения вашего приложения в автономном режиме […]». Я уже опубликовал вопрос об этом. Не могли бы вы ответить на это? - person Jonathan; 24.10.2014
comment
Это означает, что вы не должны полагаться на этот магазин как на местную правду, а скорее на простой канал синхронизации между вашими устройствами. - person Julien; 25.10.2014
comment
Спасибо! Я превратил ваш ответ в ответ на мой вопрос, надеюсь, вас это устраивает. (Если вы предпочитаете отвечать сами, я с радостью удалю свой.) - person Jonathan; 25.10.2014

Я не знаю, были ли обновлены документы, но теперь Apple говорит:

Чтобы определить, доступен ли iCloud, особенно во время запуска, вместо этого проверьте значение свойства ubiquityIdentityToken.

См. NSFileManager для ubiquityIdentityToken и URLForUbiquityContainerIdentifier.

Также обратите внимание, что Apple говорит, что URLForUbiquityContainerIdentifier может быть относительно медленным, а проверка ubiquityIdentityToken относительно быстрой.

Это для iOS6 и выше.

person Chris Prince    schedule 30.10.2014
comment
Это верно, если вы используете iCloud Documents, вопрос касается хранилища ключей iCloud. - person Axel Guilmin; 01.11.2014
comment
Хм. Я что-то не получаю? Документы для ubiquityIdentityToken не предполагают, что это относится только к документам iCloud: когда iCloud в настоящее время доступен, это свойство [т. е. ubiquityIdentityToken] содержит непрозрачный объект, представляющий личность текущего пользователя. Если iCloud по какой-либо причине недоступен или нет пользователя, вошедшего в систему, значение этого свойства равно нулю. - person Chris Prince; 01.11.2014
comment
Как сказал Жюльен, хранилище ключей всегда доступно (даже если ubiquityIdentityToken равно нулю). Мы хотим проверить, отключил ли пользователь «Настройки» > «iCloud» > «Документы и данные». - person Axel Guilmin; 02.11.2014