Как проверить, настроен ли iCloud программно

Вот предложение от Apple Docs: "Если iCloud не настроен, спросите пользователей, хотят ли они его настроить (и, предпочтительно, перенести их в Launch Settings, если они хотят настроить iCloud).

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

Ответы

Ответ 1

Edit:
Если вы ориентируетесь на iOS6 или выше, вы можете использовать [[NSFileManager defaultManager] ubiquityIdentityToken];. Для примера использования см. @Dj S 'ответ:).
Это быстрее и проще, чем оригинальное решение, предназначенное для людей, ориентированных на iOS5 и выше

Оригинальный ответ
Как описано в Руководство по программированию приложений iOS - iCloud Storage. Это можно проверить, задав URL-адрес контейнера ubiquity для диспетчера файлов:)

Пока вы указываете действительный идентификатор контейнера повсеместно, метод должен возвращать YES

- (BOOL) isICloudAvailable
{
    // Make sure a correct Ubiquity Container Identifier is passed
    NSURL *ubiquityURL = [[NSFileManager defaultManager] 
        URLForUbiquityContainerIdentifier:@"ABCDEFGHI0.com.acme.MyApp"];
    return ubiquityURL ? YES : NO;
}

Однако я обнаружил, что URLForUbiquityContainerIdentifier: может занять несколько секунд в первый раз в сеансе (я использовал его в iOS5, поэтому теперь все может быть иначе). Я помню что-то вроде этого:

dispatch_queue_t backgroundQueue = 
   dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(backgroundQueue,^{
   BOOL isAvailable = [self isICloudAvailable]
  /* change to the main queue if you want to do something with the UI. For example: */
   dispatch_async(dispatch_get_main_queue(),^{
       if (!isAvailable){
         /* inform the user */
         UIAlertView *alert = [[UIAlertView alloc] init...]
         [alert show];
         [alert release];
       }
   });
});

Ответ 2

Чтобы дополнить ответ выше, если вы только хотите узнать, доступен ли iCloud для вашего приложения, например
1. Нет учетной записи iCloud, или
2. Документы и данные отключены (для всех приложений) или
3. Документы и данные отключены только для вашего приложения.

то вы можете использовать NSFileManager ubiquityIdentityToken для iOS 6 и выше.
Если значение равно nil, то учетная запись iCloud не настроена. В противном случае настроена учетная запись iCloud.

id token = [[NSFileManager defaultManager] ubiquityIdentityToken];
if (token == nil)
{
    // iCloud is not available for this app
}
else
{
    // iCloud is available
}

Обратите внимание, что в соответствии с Apple docs вы можете вызвать его из основного потока.

Поскольку этот метод возвращается относительно быстро, его можно вызвать во время запуска, и вы можете вызвать его из основного потока приложений.