Что делать, когда пользователь включает или отключает поддержку iCloud в пакете настроек приложения?

Я ориентируюсь на iOS7 и использую iCloud с UIManagedDocument. Я хотел бы знать, что делать в этих двух случаях:

1) Первый случай: первый запуск приложения

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

Когда мое приложение запускается, первое отображаемое представление запускает инициализацию UIManagedDocument с помощью [[UIManagedDocument alloc] initWithFileURL:url]. Он делает это, потому что должен знать, сколько строк он должен отобразить в своей таблице.

На данный момент это первый запуск, и мне все еще нужно спросить пользователя, я предполагаю, что он не хочет использовать iCloud, поэтому UIManagedDocument инициализируется без набора persistentStoreOptions (NSPersistentStoreUbiquitousContentNameKey и NSPersistentStoreUbiquitousContentURLKey).

Затем файл создается на диске с

[UIManagedDocument saveToURL: URL 
            forSaveOperation: UIDocumentSaveForCreating 
           completionHandler: ^(BOOL success){

            if(success){
              //Do something with the document
            }

           }];

затем появляется вид. Поскольку это первый запуск, я должен спросить пользователя, хочет ли он использовать iCloud или нет.

Я показываю UIAlertView из [viewDidAppear:animated]

Если он ответит "НЕТ", то уже все в порядке. Но что мне делать, если он скажет "ДА"??

Должен ли я закрыть UIManagedDocument и перенести БД или достаточно установить NSPersistentStoreUbiquitousContentNameKey и NSPersistentStoreUbiquitousContentURLKey в persistentStoreOptions документа?

2) Второй случай: через пару дней пользователь передумал

Пользователь решил включить iCloud, но через день передумал. Он переключается на НЕТ опции iCloud в пакете настроек приложения. Когда приложение запускается, я проверяю изменение этой опции и обнаруживаю, что она переключилась с ДА на НЕТ. Как я понял из подсказок, которые я получил на SO, правильный путь должен заключаться в отображении UIAlertView с вопросом, хочет ли он:

а) Храните документы на устройстве

б) Удалить документы с устройства

в) Продолжайте использовать iCloud

Что делать для вариантов а) и б)? Миграция БД для варианта а) и воссоздание БД с нуля для варианта б)?


person nico9T    schedule 03.12.2013    source источник
comment
В1. Нет, нельзя просто открыть файл с помощью параметров iCloud. Вы должны использовать API-интерфейс migratePersistentStore координаторов постоянного хранилища.   -  person Duncan Groenewald    schedule 04.12.2013
comment
Q2- в вашем случае Убедитесь, что эти конкретные варианты уместны, если нет, то измените их. Если у пользователя нет видимости документов, он может быть немного сбит с толку. Возможно, что-то вроде «Сохранить существующие данные», «Удалить существующие данные», «Продолжить использование iCloud».   -  person Duncan Groenewald    schedule 04.12.2013
comment
Q2a — вам нужно не только перейти в локальный магазин, но и что делать с тем, что уже находится в iCloud? Вам нужно удалить его или рискнуть слиянием, если пользователь позже решит снова использовать iCloud! Грязный да   -  person Duncan Groenewald    schedule 04.12.2013


Ответы (2)


То, как вы используете термин «миграция», немного сбивает с толку, поскольку приращение модели Core Data от одной версии к новой также называется миграцией. Я предполагаю, что вы просто говорите о «миграции» с iCloud только на локальный или наоборот.

В вашем первом случае я бы не стал создавать UIManagedDocument, пока пользователь не сделает выбор. Если пользователь хочет использовать iCloud, все, что вам нужно сделать, это взять его и открыть, и вам не нужно беспокоиться о закрытии/удалении локального документа (что теперь бессмысленно).

Во втором случае, если пользователь выбирает вариант А, скопируйте файл из iCloud в локальный, а затем удалите его из iCloud. Вариант B означает «удалить из iCloud, он мне больше не нужен». Если вы все еще хотите продолжать использовать Core Data локально, создайте для него новый документ. C, конечно, ничего не сделал бы, просто отклонил предупреждение.

person Scott Berrevoets    schedule 03.12.2013
comment
Да, я использую термин «перенос» только из iCloud в локальный или наоборот. К сожалению, у меня нет возможности создать UIManagedDocument только тогда, когда пользователь сделал свой выбор, если только я не напишу какой-то грязный код, чтобы проверить, является ли это первым запуском приложения, и я установил 1 строки в строках таблицы, и я хитрый ячейку, но мне это не кажется элегантным решением. - person nico9T; 03.12.2013
comment
Я бы не стал проверять, если это первый запуск, я бы проверил, существует ли файл. Если нет, попросите пользователя использовать iCloud и скопировать файл. Если он уже существует, просто используйте этот файл. Вам нужно будет проверить только один раз. После создания/копирования из iCloud вы перезагружаете свою таблицу, и все готово. Пользователь все равно не может использовать таблицу, пока не сделает выбор между iCloud/local. - person Scott Berrevoets; 03.12.2013
comment
Я думал об этом. К сожалению, невозможно не создавать UIManagedDocument, пока пользователь не сделает свой выбор. Основная причина, и это ясно из документов Apple, заключается в том, что нужно спрашивать пользователя, хочет ли он использовать iCloud или нет, только если iCloud доступен на устройстве. Пользователь может запустить приложение в первый раз с отключенным iCloud, тогда приложение не получит токен iCloud, но все равно должно позволить пользователю создавать свои данные. Только когда iCloud будет доступен, я должен спросить его, хочет ли он использовать iCloud, и если он ответит ДА, мне придется переместить БД из локальной только в облако. - person nico9T; 03.12.2013
comment
@NicolaPrada: Верно, но на самом деле это то же самое, что пользователь изначально не разрешил iCloud, но позже передумал. Вам все равно придется это учитывать, так что, возможно, так будет проще. Однако удаление документа, который вы только что создали, кажется мне неправильным, поэтому я, вероятно, не буду создавать его, пока не узнаю, что он мне нужен, но это зависит от вас. - person Scott Berrevoets; 03.12.2013

Обычно есть два места, где можно проверить, изменились ли настройки iCloud и/или проверить или открыть какие-либо файлы: 1) в приложении метода AppDelegate:didfinishlaunchingwithoptions и 2) в приложении метода AppDelegate.

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

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

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

Подробнее о том, как добиться интеграции UIManagedDocument и iCloud здесь.

person Duncan Groenewald    schedule 04.12.2013