URLForUbiquityContainerIdentifier возвращает нуль, даже если правильно настроен

У меня возникла проблема: URLForUbiquityContainerIdentifier в некоторых случаях возвращает nil, даже если пользователь правильно настроил настройки в настройках. Мой код:

dispatch_async(someQueue, ^{

    if (![[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]) {
        ErrLog(@"iCloud container not available.");
        return;
    }

    dispatch_async(dispatch_get_main_queue(), ^{
       [...]
    });

});

Кто-нибудь сталкивался с одной и той же проблемой? Я устанавливаю nil как идентификатор контейнера, который должен работать в соответствии с документами Apple, но я больше не уверен в этом. Также этот код отлично подходит для большинства пользователей, но как-то не для всех.

Ответы

Ответ 1

Убедитесь, что вы включили контейнеры iCloud в свое право. Контейнеры не добавляются по умолчанию при включении прав. Нажмите значок "+" в "Целевое/резюме/права", чтобы добавить ваше приложение.

Ответ 2

iPad mini с iOS7. Я просто испытал, что URLForUbiquityContainerIdentifier внезапно начал возвращать нуль. Я попытался перезапустить устройство, но это не помогло.

В приложении "Настройки" в меню "iCloud". Я заметил, что для "Документов и данных" установлено значение "Выкл.".

Решение заключалось в том, чтобы изменить "Документы и данные" на 'On'.

Ответ 3

Если у кого-то такая же проблема с использованием бета-версии iOS8, похоже, есть ошибка с тем, как создаются права в Xcode 6. Я бил головой об этом в течение нескольких дней, пока не наткнулся на это сообщение в Apple Developer Форумы: https://devforums.apple.com/thread/229509?

По сути, Xcode генерирует ключ с именем com.apple.developer.icloud-container-identifiers, когда он должен быть com.apple.developer.ubiquity-container-identifiers (вездесущность, а не icloud). Он также может иметь значение, установленное как iCloud.$(CFBundleIdentifier), когда оно должно быть $(TeamIdentifierPrefix).$(CFBundleIdentifier).

Конечно, это может быть исправлено в следующей Бета-версии, но для всех, кто смущен, как я, надеюсь, что это поможет.

Ответ 4

Я бы посмотрел на ваш entitlement.plist в одном приложении, мне нужно было изменить $(TEAMID) на идентификатор профиля номера и буквы перед dns в профиле - вот какой код, который будет работать с UIManagedDocument

/// test iCloud Access
- (void)initializeiCloudAccess {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        if ([[NSFileManager defaultManager]
             URLForUbiquityContainerIdentifier:nil] != nil)
            NSLog(@"iCloud is available\n");
        else
            NSLog(@"This Application requires iCloud, but it is not available.\n");
    });
}

- (NSURL *)iCloudURL
{

    return [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
}

- (NSURL *)iCloudDocumentsURL
{

    return [[self iCloudURL] URLByAppendingPathComponent:@"Documents"];
}

- (NSURL *)iCloudCoreDataLogFilesURL
{

    return [[self iCloudURL] URLByAppendingPathComponent:@"CoreDataLogs"];
}

Ответ 5

URLForUbiquityContainerIdentifier всегда возвращает нуль

NSURL *ubiquityURL = [fileManager URLForUbiquityContainerIdentifier:nil]; if (ubiquityURL == nil)
  • создание приложения по xcode4.5
  • приложение включает icloud
  • ios зарегистрирована учетная запись icloud

ubiquityURL является нормальным в отладке, но ubiquityURL всегда равен нулю после распространения в appstore.

Ответ 6

Сегодня я снова столкнулся с этой проблемой.

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

Invalid provisioning profile

На сайте разработчика мне пришлось создать новый профиль подготовки. После этого перезагрузите профили подготовки в Xcode5. Теперь URLForUbiquityContainerIdentifier снова возвращает действительные URL.

Ответ 7

Если у вас все еще есть проблема o убедитесь, что вы работаете на устройстве, так как симулятор не всегда возвращает допустимое значение. Я попробовал код в своем приложении, и я не получаю ниль

Ответ 8

Включите "iCloud Drive" в настройках iPhone