Предотвращение синхронизации данных iCloud (использование.положение nosync?)
EDIT: до сих пор лучшее, что я смог придумать, это всплывающее окно, чтобы попросить пользователя отключить синхронизацию iCloud, а также переместить все данные в каталог документов, чтобы он не был стерт: в iOS5 можно ли определить, имеет ли пользователь приложение для резервного копирования?
Я разрабатываю автономное картографическое приложение для iPhone / iPad.
мы использовали для хранения всех данных (многие концерты потенциально) в каталоге кэшей.
по состоянию на iOS5, файлы в каталоге кэшей могут быть случайным образом удалены, когда жесткий диск пользователя начинает заполняться.
Как я могу хранить локальные данные без синхронизации данных с iCloud, iTunes и без их случайного удаления? Мои локальные данные-это большое дерево каталогов со многими небольшими файлами данных в тысячах подкаталогов.
я переместил наше дерево каталогов из каталога кэша библиотеки в данные.каталог nosync в каталоге документов, потому что мы прочитали это может быть решением. Однако данные в папке nosync по-прежнему сохраняются в iCloud.
вот теперь я создаю директорию:
NSString* noSyncDirectory() {
static NSString *directory = nil;
if (!directory) {
directory = [[NSString stringWithFormat:@"%@/%@",
documentsDirectory(), @"data.nosync"] retain];
[Constants createDirectoryIfNeeded:directory];
}
return directory;
}
6 ответов
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 пользователя.") что флаг не-резервного копирования удваивается как флаг не-очистки, что не так. Просто оставляя файлы в каталоге кэшей и помечая их do-not-backup не будет препятствовать их стереть.
возможно, вы можете отключить резервное копирование для своего приложения и хранить файлы данных где-то еще в дереве приложений. Любые вещи, которые необходимо поддерживать, можно поместить в общую зону за пределами вашего приложения.
вы можете сделать это в provisioning:недопустимый код подписи приложения представления
или настройки:
Если вы хотите предоставить пользователю возможность включить или отключить использование iCloud полностью для вашего приложения. Если ваше приложение включает Настройки bundle или inline preferences, вы можете включить предпочтение для переключения, хранит ли ваше приложение контент в iCloud вообще. Например, приложение, данные которого полностью состоят из файлов, управляемых частным образом, может сделать это, чтобы предоставить пользователю выбор способа хранения этих файлов.
или удалить com.apple.developer.ubiquity-container-identifiers
право (которое может быть автоматически добавлено) с помощью Xcode:настройка прав iCloud вашего приложения
в противном случае вам может потребоваться выдать предупреждение с инструкциями по отключению через UI:
http://www.pcmag.com/article2/0,2817,2394702,00.asp#fbid=bpIwPLZ1HeQ
другой обходной путь-группировать карты в коллекции, которые устанавливаются как отдельные приложения. Это был бы способ хранения данных без создания каких-либо каталогов, которые синхронизируются или получают резервную копию. Данные будут сохранены в the .App directory и будет защищен.
в зависимости от того, как кэш функция восстановления пространства работает, она может не удалять недавно полученные или измененные файлы. Вы можете попробовать периодически прикасаться к ним по таймеру. Вы также можете добавить некоторые старые файлы в качестве приманки и определить, когда они были удалены или когда пространство мало, чтобы по крайней мере выдать предупреждение или повторно загрузить удаленные объекты...
эта проблема может еще не иметь обходного пути... Вы могли бы попробовать позвонить URLForUbiquityContainerIdentifier явно, так как он выполняет некоторую инициализацию при первом вызове. Затем создайте подкаталог с .nosync
суффикс (на основе ).
при первом вызове этого метода для данного каталога контейнеров iOS расширяет песочницу приложений, чтобы включить этот каталог контейнеров. Таким образом, важно, чтобы вы вызываете этот метод хотя бы один раз, прежде чем пытаться искать файлы в iCloud. И если ваше приложение обращается к нескольким каталогам контейнеров, вы должны вызвать метод один раз для каждого каталога.
на doc on .nosync
:
чтобы гарантировать, что само постоянное хранилище не синхронизируется iCloud: когда вы устанавливаете значение для NSPersistentStoreUbiquitousContentnamekey, UIManagedDocument помещает постоянное хранилище в a .каталог положение nosync внутри пакета документов. Если вы используете дополнительный контент (используя метод writeAdditionalContent:toURL:originalContentsURL:error:), вы должны убедиться, что каталог документов не является пакетом. Обычно каталогу документов предоставляется расширение, которое не распознается как расширение документа.
вы можете убедиться, что у вас есть com.apple.developer.ubiquity-container-identifiers
право.
поле контейнеры iCloud определяет список контейнер каталоги, которые ваше приложение может получить доступ в хранилище iCloud пользователя. (Это поле соответствует com.яблоко.разработчик.право на вездесущность-идентификаторы контейнеров.)
возможно, снимите флажок "Включить права" в области сводки проекта или отредактируйте профиль, чтобы удалить настройки *ubiquity. ( примечания для ios 5 beta 7 справочные пособия.)
есть еще :
setUbiquitous:itemAtURL:destinationURL: ошибка:
задает, должен ли элемент с указанным URL-адресом храниться в облаке.
параметры
флаг
указать "да", чтобы переместить элемент в iCloud или нет, чтобы удалить его из iCloud (если он есть).
существует более новый способ предотвратить синхронизацию данных 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 технические вопросы QA1719 для получения более подробной информации.
вы пытались просто назвать каталог".nosync " без данных спереди? Это может быть вообще . каталоги игнорируются, или, возможно, именно это.
но, похоже, поведение так же, как пользователь хотел бы этого-потенциально гигабайты пространства, используемого приложением, которое они не могут использовать в настоящее время, где пространство может быть восстановлено автоматически. Я не уверен, но вы думаете, что система будет умной о восстановлении файлов, созданных недавно только после того, как там не было выбора, поэтому, если пользователь недавно сохранил карты, они не будут удалены, если не будет другого выбора.
для целей подачи ошибки я собираюсь попросить способ пометить каталог для запроса пользователя перед удалением - так что, если они синхронизируют много фильмов, и это очистит набор данных, как карты, о которых вы говорите, пользователю будет предложено, если они хотят, чтобы удалить данные "Автономные карты" из приложения "MyCoolMapper", чтобы продолжить работу с синхронизация.