Ответ 1
Убедитесь, что вы включили контейнеры iCloud в свое право. Контейнеры не добавляются по умолчанию при включении прав. Нажмите значок "+" в "Целевое/резюме/права", чтобы добавить ваше приложение.
У меня возникла проблема: URLForUbiquityContainerIdentifier в некоторых случаях возвращает nil, даже если пользователь правильно настроил настройки в настройках. Мой код:
dispatch_async(someQueue, ^{
if (![[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil]) {
ErrLog(@"iCloud container not available.");
return;
}
dispatch_async(dispatch_get_main_queue(), ^{
[...]
});
});
Кто-нибудь сталкивался с одной и той же проблемой? Я устанавливаю nil как идентификатор контейнера, который должен работать в соответствии с документами Apple, но я больше не уверен в этом. Также этот код отлично подходит для большинства пользователей, но как-то не для всех.
Убедитесь, что вы включили контейнеры iCloud в свое право. Контейнеры не добавляются по умолчанию при включении прав. Нажмите значок "+" в "Целевое/резюме/права", чтобы добавить ваше приложение.
iPad mini с iOS7. Я просто испытал, что URLForUbiquityContainerIdentifier внезапно начал возвращать нуль. Я попытался перезапустить устройство, но это не помогло.
В приложении "Настройки" в меню "iCloud". Я заметил, что для "Документов и данных" установлено значение "Выкл.".
Решение заключалось в том, чтобы изменить "Документы и данные" на 'On'.
Если у кого-то такая же проблема с использованием бета-версии 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)
.
Конечно, это может быть исправлено в следующей Бета-версии, но для всех, кто смущен, как я, надеюсь, что это поможет.
Я бы посмотрел на ваш 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"];
}
URLForUbiquityContainerIdentifier всегда возвращает нуль
NSURL *ubiquityURL = [fileManager URLForUbiquityContainerIdentifier:nil]; if (ubiquityURL == nil)
ubiquityURL является нормальным в отладке, но ubiquityURL всегда равен нулю после распространения в appstore.
Сегодня я снова столкнулся с этой проблемой.
На этот раз это произошло потому, что у меня был недопустимый профиль подготовки.
На сайте разработчика мне пришлось создать новый профиль подготовки. После этого перезагрузите профили подготовки в Xcode5. Теперь URLForUbiquityContainerIdentifier
снова возвращает действительные URL.
Если у вас все еще есть проблема o убедитесь, что вы работаете на устройстве, так как симулятор не всегда возвращает допустимое значение. Я попробовал код в своем приложении, и я не получаю ниль
Включите "iCloud Drive" в настройках iPhone