iCloud: можно ли игнорировать тех, кто отключает iCloud? - PullRequest
8 голосов
/ 17 октября 2011

Я немного борюсь с идеей iCloud и разместил более общий вопрос здесь . Моя самая большая проблема состоит в том, чтобы решить, должен ли я прекратить помещать данные пользователя в папку старых добрых документов, которая находится в песочнице приложения. Чтобы проиллюстрировать мою проблему:

enter image description here

Документы не дают ответа, насколько я вижу. Предположим, у меня есть приложение, которое обрабатывает различные текстовые файлы. Как только я запускаю свое приложение, я просто проверяю, есть ли какие-нибудь txt-файлы в облаке, например:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSLog(@"AppDelegate: app did finish launching");
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];

    // (1) iCloud: init

    NSURL *ubiq = [[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil];
    if (ubiq) {
        NSLog(@"User has iCloud enabled! Let's get the txt files from the cloud.");
        [self loadDocument];
    } else {
        NSLog(@"User doesn't have iCloud enabled. App is thus worthless.");
    }


    return YES;
}

У меня есть способ проверить, есть ли в облаке какие-либо текстовые файлы и, если да, загрузить их. Если нет, я просто создаю новые текстовые файлы в облаке.

Это означает, что приложение не хранит никаких данных в папке документов. Насколько я понимаю, все находится либо в локальном хранилище iCloud моего устройства (которое также доступно, если пользователь находится в автономном режиме), либо в облаке. Таким образом, текстовый файл существует в двух местах: на моем устройстве и в облаке.

Так что нет необходимости хранить третью копию в моей локальной папке с документами, верно? Или это важно по какой-то причине, которую я упустил? Другими словами, для чего я должен использовать локальную папку документов, если я предлагаю своим пользователям iCloud? (И могу ли я просто игнорировать тех, кто не подпишется на iCloud?)


РЕДАКТИРОВАТЬ: просто чтобы уточнить, когда я говорю о стандартной папке документов в песочнице приложения, я имею в виду это:

NSArray *paths =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

Ответы [ 3 ]

3 голосов
/ 24 октября 2011

Возможно, я немного медлителен, перечитывая документы в 4-й или 5-й раз, я натолкнулся на это, что говорит о том, что вы всегда должны создавать свои файлы в песочнице, а затем перемещать их в облако. Таким образом, Apple предлагает всегда иметь 3 версии одного и того же файла:

Приложения используют те же технологии для управления файлами и каталогами в iCloud, что они делают для локальных файлов и каталогов. Файлы и каталоги в iCloud - это просто файлы и каталоги. Вы можете открыть их, создать их, переместить их, скопировать их, читать и писать из их, удалить их или любые другие операции, которые вы можете захотеть делать. Единственные различия между локальными файлами и каталогами и Файлы и каталоги iCloud - это URL, который вы используете для доступа к ним. Вместо того, чтобы URL-адреса относились к песочнице вашего приложения, URL-адреса для iCloud файлы и каталоги относятся к соответствующему iCloud контейнерный каталог.

Чтобы переместить файл или каталог в iCloud:

Создайте файл или каталог локально в изолированной программной среде вашего приложения. Пока в использовать, файл или каталог должен управляться предъявителем файла, например, как объект UIDocument.

Используйте URLForUbiquityContainerIdentifier: метод для получения URL для каталога контейнера iCloud, в котором вы хотите сохранить вещь. Используйте URL каталога контейнера для создания нового URL, который указывает местоположение элемента в iCloud. Позвоните setUbiquitous: itemAtURL: destinationURL: ошибка: метод NSFileManager переместить элемент в iCloud. Никогда не вызывайте этот метод из вашего приложения основная нить; это может заблокировать ваш основной поток для расширенного период времени или вызвать тупик с одним из собственных файлов вашего приложения Ведущие. Когда вы перемещаете файл или каталог в iCloud, система копирует этот элемент из песочницы вашего приложения и в частный локальный каталог, чтобы его мог отслеживать демон iCloud. Четное хотя файл больше не находится в вашей песочнице, ваше приложение все еще доступ к нему. Хотя копия файла остается локальной для текущей устройство, файл также отправляется в iCloud, чтобы его можно было распространять на другие устройства. Демон iCloud выполняет всю работу по созданию уверен, что локальные копии одинаковы. Так что с точки зрения ваше приложение, файл просто находится в iCloud.

Все изменения, которые вы вносите в файл или каталог в iCloud, должны быть сделаны используя объект координатора файла. Эти изменения включают в себя перемещение, удаление, копирование или переименование элемента. Координатор файла обеспечивает что демон iCloud не изменяет файл или каталог на в то же время и гарантирует, что другие заинтересованные стороны уведомлены о изменения, которые вы делаете.

См. Здесь.

2 голосов
/ 22 октября 2011

Нет причин хранить документы как в локальном хранилище, так и в iCloud. Однако вы должны предоставить пользователям возможность отключить хранилище iCloud. При отключенном хранилище iCloud вы должны искать только файлы в локальном хранилище (как в приложениях до iOS5). Лучше всего попытаться изолировать часть вашего кода, которая должна знать, где хранятся документы, и проверить, доступен ли и включен ли iCloud, и заставить этот фрагмент кода возвращать URL, где должны храниться документы.

Обновление: Если вы хотите отличиться для iOS5 против iOS4, вам просто нужно проверить, есть ли функции iOS5. Есть несколько способов сделать это. Один из способов - проверить:

if ([UIDocument class] == nil)

На iOS4 это будет верно, а на iOS5 это будет ложно. Я не знаю, какие у вас есть структуры данных для ваших файлов, но вы могли бы создать оболочку вокруг UIDocument. Внутри этого класса-оболочки вы можете иметь переменные экземпляра для структуры UIDocument, а также для полей, которые вам понадобятся в IOS4 (например, путь к файлу). Когда вы создаете экземпляр своего класса, проверьте, включен ли iCloud и доступен ли UIDocument, и, если это так, используйте его и установите поле. В противном случае установите другие поля и оставьте поле UIDocument равным nil. Когда вам нужно выполнить операции с вашим «файлом», проверьте, является ли поле UIDocument нулевым, и если это так, то «старым» способом. В противном случае просто передайте запрос объекту UIDocument.

1 голос
/ 17 октября 2011

Помните, что если пользователь включил резервное копирование устройства в iCloud, каталог документов в любом случае будет скопирован.

Это действительно зависит от того, планируете ли вы использовать iCloud в качестве инструмента синхронизации между приложениями / платформами.Если нет, использовать iCloud для хранения ваших документов не имеет смысла.

...