Подтвердить что ты не робот

Запретить синхронизацию данных iCloud (используя .nosync?)

EDIT: пока лучшее, что я смог придумать, - это всплывающее окно, чтобы попросить пользователя отключить синхронизацию iCloud, а также переместить все данные в папку "Документы", t get wiped: В 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;
}
4b9b3361

Ответ 1

От: 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".), что флаг do-not-backup удваивается как do-not- флаг очистки, который не соответствует действительности. Просто оставить файлы в Cache Directory и помечать их do-not-backup не помешает их стереть.

Ответ 2

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

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

doc в .nosync:

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

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

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

Ответ 3

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

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

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

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

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

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

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

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

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

Ответ 4

Возможно, снимите флажок "Включить права" в сводной панели проекта или отредактируйте профиль, чтобы удалить настройки * 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:

Ответ 5

Существует более новый способ предотвратить синхронизацию данных 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;
}

Подробнее см. Apple Техническое Q & A QA1719.

Ответ 6

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

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

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