Предотвратить синхронизацию данных с помощью iCloud (используя .nosync?) - PullRequest
22 голосов
/ 15 октября 2011

РЕДАКТИРОВАТЬ: На данный момент лучшее, что я смог придумать, - это всплывающее окно с просьбой отключить синхронизацию iCloud, а также переместить все данные в каталог «Документы», чтобы он выиграл ».t wipe: В iOS5 можно ли определить, есть ли у пользователя приложение для резервного копирования?

Я разрабатываю приложение для автономного отображения для iPhone / iPad.

Раньше мы хранили все данные (потенциально много гигабайт) в каталоге Caches.

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

Как можно хранить локальные данные без синхронизации данных с iCloud, iTunes и без случайного удаления?Мои локальные данные - это большое дерево каталогов с множеством небольших файлов данных в тысячах подкаталогов.

Я переместил наше дерево каталогов из каталога кэша библиотеки в каталог data.nosync в каталоге документов, потому что мы прочиталиэто может быть решением.Однако данные в папке nosync все еще сохраняются в iCloud.

Вот теперь я создаю каталог:

NSString* noSyncDirectory() {
  static NSString *directory = nil;
  if (!directory) {
    directory = [[NSString stringWithFormat:@"%@/%@",
                  documentsDirectory(), @"data.nosync"] retain];
    [Constants createDirectoryIfNeeded:directory];
  }
  return directory;
}

Ответы [ 6 ]

13 голосов
/ 12 ноября 2011

From: https://developer.apple.com/library/ios/#qa/qa1719/_index.html

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

#include <sys/xattr.h>
- (BOOL)addSkipBackupAttributeToItemAtURL:(NSURL *)URL
{
    const char* filePath = [[URL path] fileSystemRepresentation];

    const char* attrName = "com.apple.MobileBackup";
    u_int8_t attrValue = 1;

    int result = setxattr(filePath, attrName, &attrValue, sizeof(attrValue), 0, 0);
    return result == 0;
}

Можно найти дополнительную информацию: https://developer.apple.com/icloud/documentation/data-storage/

Примечание: несмотря на то, что документация разработчика неверно подразумевает («Эти файлы не будут удалены и не будут включены в резервную копию iCloud или iTunes пользователя»), флаг «не делать резервную копию» удваиваетсяфлаг «не очищать», который не соответствует действительности.Просто оставив файлы в каталоге Caches и отметив их как не резервные, не помешает их стиранию.

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

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

Возможно, вы сможете сделать это при подготовке: неверная отправка приложения для подписи кода

или настройки :

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

или удалив право com.apple.developer.ubiquity-container-identifiers (которое может быть добавлено автоматически) с помощью Xcode: Настройка прав доступа iCloud для вашего приложения

В противном случае вам может потребоваться выдать предупреждение с инструкциями по отключению через пользовательский интерфейс:

http://www.pcmag.com/article2/0,2817,2394702,00.asp#fbid=bpIwPLZ1HeQ

Другим обходным решением является группировка карт в коллекции, которые устанавливаются как отдельные приложения. Это был бы способ хранения данных без создания каких-либо каталогов, которые синхронизируются или резервируются. Данные будут храниться в каталоге .app и будут защищены.

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

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

Эта проблема, возможно, еще не имеет обходного пути ... Возможно, вы можете попытаться вызвать URLForUbiquityContainerIdentifier явно, так как он выполняет некоторую инициализацию при первом вызове.Затем создайте подкаталог с суффиксом .nosync (на основе этого примера ).

Когда вы в первый раз вызываете этот метод для данного каталога-контейнера, iOS расширяет вашпесочница приложения, чтобы включить этот каталог контейнера.Таким образом, важно, чтобы вы вызывали этот метод хотя бы один раз, прежде чем пытаться искать файлы в iCloud.И если ваше приложение обращается к нескольким каталогам контейнеров, вам следует вызывать метод один раз для каждого каталога.

doc на .nosync:

Чтобы гарантировать, что само постоянное хранилище не синхронизируется iCloud: когда вы устанавливаете значение для NSPersistentStoreUbiquitousContentNameKey, UIManagedDocument помещает постоянное хранилище в каталог .nosync внутри пакета документа.Если вы используете дополнительный контент (используя writeAdditionalContent: toURL: originalContentsURL: error: метод), вы должны убедиться, что каталог документов не является пакетом.Обычно вы даете каталогу документов расширение, которое не распознается как расширение документа.

Возможно, вы захотите убедиться, что у вас есть право com.apple.developer.ubiquity-container-identifiers.

Поле «Контейнеры iCloud» определяет список каталогов контейнеров, к которым ваше приложение может обращаться в пользовательском хранилище iCloud.(Это поле соответствует разрешению com.apple.developer.ubiquity-container-identifiers.)

0 голосов
/ 03 октября 2016

Существует более новый способ предотвращения синхронизации данных в iCloud без непосредственного использования расширенных атрибутов:

- (BOOL)addSkipBackupAttributeToItemAtPath:(NSString *) filePathString
{
    NSURL* URL= [NSURL fileURLWithPath: filePathString];
    assert([[NSFileManager defaultManager] fileExistsAtPath: [URL path]]);

    NSError *error = nil;
    BOOL success = [URL setResourceValue: [NSNumber numberWithBool: YES]
                                  forKey: NSURLIsExcludedFromBackupKey error: &error];
    if(!success){
        NSLog(@"Error excluding %@ from backup %@", [URL lastPathComponent], error);
    }
    return success;
}

См. Технические вопросы и ответы QA1719 от Apple для получения более подробной информации.

0 голосов
/ 15 октября 2011

Возможно, снимите флажок «Включить права» на сводной панели проекта или отредактируйте профиль, чтобы удалить настройки * ubiquity. ( Примечания для справочных прав для ios 5 beta 7 .)

Существует также функция setUbiquitous:

setUbiquitous: itemAtURL: DestinationUrl: ошибка:

Устанавливает, должен ли элемент с указанным URL-адресом храниться в облаке.

Параметры

флаг

Укажите YES, чтобы переместить элемент в iCloud, или NO, чтобы удалить его из iCloud (если он там есть).

http://developer.apple.com/library/ios/#DOCUMENTATION/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/Reference/Reference.html#//apple_ref/occ/instm/NSFileManager/setUbiquitous:itemAtURL:destinationURL:error:

0 голосов
/ 15 октября 2011

Вы пытались просто назвать каталог ".nosync" без данных перед?Это может быть вообще.каталоги игнорируются, или, может быть, именно так.

Но, похоже, поведение такое, как хотелось бы пользователю - потенциально гигабайты пространства, используемого приложением, которое они могут не использовать в настоящее время, где пространство можетбыть исправлено автоматически.Я не уверен, но вы могли бы подумать, что система будет разумно восстанавливать файлы, созданные недавно, только после того, как у них не было выбора, поэтому, если бы пользователь только что сохранил карты недавно, они не будут удалены, если не было другого выбора.

В целях сообщения об ошибке я собираюсь попросить способ пометить каталог для приглашения пользователя перед удалением, чтобы, если они синхронизируют много фильмов, это очистило бы набор данных, например карты, которые вы используете.говоря о том, что пользователю будет предложено удалить данные «автономные карты» из приложения «MyCoolMapper», чтобы продолжить синхронизацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...