Изменение модели данных CoreData для iOs приложения с iCloud синхронизацией

Казалось бы простая задача добавления атрибута (ов) в модель данных CoreData может обернуться проблемами если в приложении используется синхронизация между устройствами через iCloud. В этом случае необходимо провести так называемую lightweight миграцию прежней базы данных в базу данных с новой моделью иначе синхронизация перестанет работать, что чревато в дальнейшем потерей данных при их восстановлении из iCloud. Здесь предлагается пошаговая инструкция как это сделать легко и безопасно на примере моего приложения для учета финансов, которым ежедневно пользуется несколько тысяч пользователей, поэтому к сохранности данных подход должен быть серьезный

Итак, поехали!

1. Добавляем новую версию модели

Для этого в Xcode выделяем вашу модель (в мем случае это Debts.xcdatamodeld) и в верхнем меню Edit выбираем Add Model Version…

af8b1fab6b2e382a524c78d2529493fd.pngя назвал новую версию модели Debts_v2

я назвал новую версию модели Debts_v2

Выделяем свежесозданный файл новой модели в Xcode слева

66966840eec32a51e0861f9e0eab528d.png

и добавляем нужные нам атрибуты

1a6a67f8b9615baa6f872949ff37cf98.png

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

3bc7db83422044abc86089c419392368.png

после этого должна появиться зеленая галочка на новой версии модели в Xcode слева

575ca5c874d52f1951a9728af14341c5.png

2. Инициализация новой схемы в CloudKit Database

Чтобы все работало корректно необходимо инициализировать новую схему в CloudKit Database. соответствующую вашей новой модели. Для этого необходимо добавить эти две строчки кода в инициализатор вашего NSPersistentCloudKitContainer

06dbcea43f7ddfaa33fbce7c5fdb885a.png

Теперь запустите приложение на реальном устройстве под вашим AppleID разработчика (возможно получится и на симуляторе, но я не пробовал) дождитесь пока приложение запустится и полностью успокоится консоль в Xcode, после чего удалите приложение с устройства и закомментите эти две строчки в коде.

3f39aad3ca4ab19b374c3dc6fc734186.png

3. Развертывание новой схемы в Production

Наша новая схема сейчас существует только в Development, чтобы она заработала в Production необходимо ее там развернуть. Для этого вам нужно войти в ваш CloudKit Database

6eb97879f861150767b917640cce0c18.png

и нажать Deploy Schema Changes слева внизу.

a0749e9e54807481c67f80b55459c0ae.png

Должно появиться что-то вроде этого. Если выйдут нули, значит что-то вы сделали не так выше.

нажмите Deploy и готово!

нажмите Deploy и готово!

Все. Теперь можно использовать новые атрибуты в коде и отправлять приложение в AppStore.

После появления новой версии в AppStore я проверил синхронизацию следующим образом.

  • приложения на iPhone и iPad скаченные ранее из AppStore оба не обновлены — синхронизация работает как раньше, без проблем

  • приложения на iPhone обновил, а на iPad нет — синхронизация работает в обе стороны, как и до этого, без проблем

  • приложения на iPhone и iPad оба обновлены — в начале наблюдалась минутная задержка синхронизации, через минуту и в дальнейшем работает как и раньше почти мгновенно, без проблем.

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

© Habrahabr.ru