Разработка для CloudKit
CloudKit является способом переместить структурированные данные между Вашим приложением и iCloud. Принимая во внимание, что основанное на документе хранение воздействует на файлы, CloudKit воздействует на записи. Запись является словарем пар ключ/значение с каждым ключом, представляющим поле записи. Значение каждого поля обычно является простым типом данных, таким как строка, число или дата, но можно также хранить все файлы или произвольные блоки данных. Поля могут также сохранить ссылки на другие записи, позволив определить отношения между записями.
Когда переместить данные от Вашего приложения до iCloud и от iCloud до Вашего приложения, с CloudKit Вы решаете. Несмотря на то, что CloudKit предоставляет услуги для информирования Вас, когда изменения происходят, необходимо все еще выбрать те изменения явно. Поскольку Вы решаете, когда выбрать и сохранить данные, Вы ответственны за обеспечение, что данные выбираются в правильные времена и в правильном порядке, и Вы ответственны за обработку любых возникающих ошибок.
Для получения дальнейшей информации о классах платформы CloudKit, посмотрите Ссылку Платформы CloudKit. Поскольку, как включить CloudKit в Вашем проекте XCode и доступе Инструментальная панель CloudKit, считайте Быстрый запуск CloudKit.
Включение CloudKit
Прежде чем можно будет использовать CloudKit, приложение должно включить возможность iCloud приложения, как описано в Запрашивают Доступ к iCloud Используя Возможности XCode. Конфигурирование службы CloudKit добавляет надлежащие права на Ваше приложение и конфигурирует Ваше приложение с контейнером по умолчанию на основе его пакета ID.
Контейнеры и базы данных
Как другие технологии iCloud, CloudKit организует данные с помощью контейнеров. Контейнер служит локальным представлением хранения iCloud Вашего приложения. При запуске проекта Вы запрашиваете права на каждый из их контейнеров. Во время выполнения можно выполнить задачи против определенного контейнера с помощью a CKContainer
объект.
Каждый контейнер разделен на общедоступные и частные базы данных, каждая из которых представлена a CKDatabase
объект. Любые данные, записанные в частную базу данных, видимы только текущему пользователю и хранятся в учетной записи iCloud того пользователя. Данные, записанные в общедоступную базу данных, видимы всем пользователям приложения и хранятся в хранении iCloud приложения.
Для рабочего приложения CloudKit общедоступная база данных контейнера всегда читаема, даже когда нет никакой активной учетной записи iCloud, сконфигурированной на устройстве. Сохранение записей на общедоступную базу данных и доступ к частной базе данных всегда требуют присутствия активной учетной записи iCloud на устройстве. Если Ваше приложение действительно больше, чем считывает данные из общедоступной базы данных, проверьте на активную учетную запись iCloud при запуске и скорректируйте свой интерфейс соответственно. Например, если никакая учетная запись iCloud не доступна, отключите любой UI для сохранения записей и уведомьте пользователя, что сохранение записей требует активной учетной записи iCloud.
Для получения информации о том, как проверить на доступность iCloud, считают и реагируют на изменения к текущему счету, видят, Подготавливают Ваше Приложение для Использования iCloud.
Управление данными в CloudKit
В общедоступных и частных базах данных Вы организуете данные своего приложения с помощью записей и используете их для перемещения данных между приложением и iCloud. Записи являются словарями пар ключ/значение, представленных CKRecord
класс. Каждая запись имеет тип записи, который является строкой, которую Вы используете для дифференциации между записями с различными типами информации. Каждая пара ключ/значение представляет поле записи и что соответствующее значение поля. Поля могут содержать простые типы, такие как строки, числа, и даты или более составные типы, такие как расположения, ссылки на другие записи или все файлы.
Приложения должны выбрать записи, они должны выполнить и сохранить изменения в тех записях явно. Ничто не автоматически. Можно инициировать выборку и сохранить операции с помощью или объектов операции или удобных методов CKContainer
и CKDatabase
классы. Объекты операции могут воздействовать на многократные записи сразу и могут быть сконфигурированы с зависимостями, чтобы гарантировать, что записи сохраняются в надлежащем порядке. Объекты операции основываются NSOperation
класс и может быть интегрирован с другими потоками операций Вашего приложения легко. Операции выборки требуют, чтобы Вы уже знали ID записи, которую Вы хотите.
Если Вы не знаете ID записи, CloudKit предоставляет возможность для поиска записей с помощью предиката. Основанный на предикате поиск позволяет Вам определить местоположение записей, поля которых содержат определенные значения. Вы используете этот предикат с a CKQuery
объект указать и критерии поиска и опции сортировки для возвращенных записей. Вы тогда выполняете запрос с помощью a CKQueryOperation
объект.
Когда определенные части базы данных изменяются, другой параметр поиска должен позволить серверу уведомить Вас. Подписки действуют как персистентный запрос на сервер. Вы конфигурируете a CKSubscription
объект во многом как Вы делает a CKQuery
объект, но вместо того, чтобы выполнить тот запрос явно, Вы сохраняете подписку к серверу только один раз. После этого сервер отправляет уведомления нажатия Вашему приложению каждый раз, когда изменение происходит, который соответствует Ваши критерии поиска. Например, можно использовать подписки, чтобы обнаружить создание или удаление записей или обнаружить когда поле записи, измененной на определенное значение. После получения уведомления нажатия от сервера можно выбрать измененную запись и обновить приложение.
Для получения дальнейшей информации о том, как использовать записи, объекты операции и другие классы платформы CloudKit, видят Ссылку Платформы CloudKit.
Среды разработки и продуктивные среды
CloudKit обеспечивает отдельную разработку и продуктивные среды для Ваших типов записи и данных. Среда разработки является более гибкой средой, которая доступна только элементам Вашей группы разработчиков. Когда Ваше приложение добавляет новое поле к записи и сохраняет ту запись в среде разработки, сервер обновляет информацию о схеме автоматически. Можно использовать эту функцию для внесения изменений в схему во время разработки, экономящей время. Один протест состоит в том, что после добавления поля к записи тип данных, связанный с тем полем, не может быть изменен программно. Для изменения типа поля необходимо удалить поле в Инструментальной панели CloudKit и добавить его снова с новым типом.
До развертывания Вашего приложения Вы перемещаете свою схему и данные к использованию продуктивной среды Инструментальная панель CloudKit. При выполнении против продуктивной среды сервер препятствует тому, чтобы приложение изменило схему программно. Вы можете все еще внести изменения с Инструментальной панелью CloudKit, но пытаетесь добавить поля к записи в результате продуктивной среды по ошибкам.
Во время разработки XCode автоматически указывает на Ваше приложение на среду разработки. Прежде чем Вы поставите свое приложение, сконфигурируете Ваше приложение с помощью потока операций распределения. В этом потоке операций XCode позволяет Вам выбрать, хотите ли Вы предназначаться для среды разработки или продуктивной среды, и добавляет com.apple.developer.icloud-container-environment
право на Ваше приложение со значением Вы выбрали. До поставки, убедиться сконфигурировать Ваше приложение для продуктивной среды. Приложения, предназначающиеся для среды разработки, будут отклонены App Store.
Основной поток операций CloudKit
В Вашем приложении Вы используете CloudKit, чтобы получить данные от iCloud, внести изменения и записать те изменения обратно. Процесс для получения данных от базы данных CloudKit следующие:
Доберитесь
CKContainer
объект, соответствующий контейнеру iCloud, к данным которого Вы хотите получить доступ.Доберитесь
CKDatabase
объект, соответствующий базе данных (общедоступный или частный), который содержит записи.Идентифицируйте записи, которые Вы хотите выбрать:
Если Вы уже знаете IDs записей, Вы хотите, создаете a
CKFetchRecordsOperation
объект получить их.Если Вы не знаете рекордный IDs, создайте a
CKQuery
объект с критериями поиска, соответствующий записи, которые Вы хотите. Тогда создайте aCKQueryOperation
объект выполнить тот запрос.
Присвойте блоки надлежащим обработчикам завершения Вашего объекта операции. Используйте свои блоки для обработки результатов.
Передайте свой объект операции
addOperation:
метод ВашегоCKDatabase
объект. Вызов этого метода ставит в очередь работу для выполнения. Объект операции тогда поставляет результаты асинхронно к Вашим блокам завершения.
Для сохранения записи, которую Вы создали или изменили создайте a CKModifyRecordsOperation
объект с записью, которую Вы хотите сохранить. Выполните тот объект операции таким же образом, Вы сделали при выборке записей путем вызова addOperation:
метод надлежащего CKDatabase
объект. Как с операциями выборки, работа сохранения выполняется асинхронно и сообщает о состоянии блокам обработчика завершения, которые Вы указываете. Используйте те блоки, чтобы обработать результаты и управлять любыми ошибками.
Это - Ваша ответственность решить, когда выбрать записи, Вам нужно и когда сохранить Ваши изменения; Ваша роль также включает обеспечение законности данных, которые Вы сохраняете. CloudKit сохраняет каждую запись атомарно. Если необходимо сохранить группу записей в единственной атомарной транзакции, сохранить их к пользовательской зоне, которая можно создать использование CKRecordZone
класс. Зоны являются полезным способом расположить дискретную группу записей, но поддерживаются только в частных базах данных. Зоны не могут создаваемый в общедоступной базе данных.
Подсказки для определения типов записи Вашего приложения
При определении типов записи приложения это помогает понять, как Вы используете те типы записи в своем приложении. Вот некоторые подсказки, чтобы помочь Вам сделать лучший выбор во время процесса проектирования:
Организуйте свои записи вокруг центрального типа записи. Хорошая организационная стратегия состоит в том, чтобы определить один тип первичной записи и дополнительные типы записи для поддержки основного типа. Используя этот тип организации позволяет Вам фокусировать свои запросы на Вашем типе первичной записи и затем выбрать любые объекты поддержки по мере необходимости. При определении слишком многих типов первичной записи интерфейс приложения может потребовать, чтобы больше сложности выбрало или искало соответствующие записи. Например, календарное приложение могло бы определить единственную календарную запись (тип первичной записи), который содержит многократные записи события (вторичный тип записи) соответствие событиям на том календаре.
Используйте ссылки для создания прочных отношений между записями. Несмотря на то, что можно сохранить ID записи или актива в поле с помощью
NSString
объект, делая так не рекомендуется. Вместо этого используйте aCKReference
объект установить формальные отношения между двумя объектами. Ссылки также позволяют Вам установить модель владения между объектами, которые могут сделать удаление тех записей проще.Включайте информацию о версии в свои записи. Номер версии может помочь Вам решить во время выполнения, какая информация могла бы быть доступной в данной записи.
Дескриптор недостающие ключи корректно в Вашем коде. Для каждой записи Вы создаете, Вы не обязаны обеспечивать значения для всех ключей, содержавшихся в типе записи. Для любых ключей Вы не указываете, соответствующее значение
nil
. Ваше приложение должно быть в состоянии обработать ключи сnil
значения надлежащим способом. Способность обработать недостающие ключи становится важной когда новые версии Ваших записей доступа к приложениям, создаваемых более старой версией.Избегите сложных графиков записей. Когда необходимо обновить или удалить записи, создание сложного набора отношений между записями создает потенциал для проблем позже. Если отношения владельца среди Ваших записей сложны, могло бы быть трудно удалить записи позже, не оставляя другие записи в противоречивом состоянии.
Используйте активы для файлов дискретных данных. Когда Вы захотите связать изображения или другие дискретные файлы с записью, используйте a
CKAsset
объект сделать так. Общий размер данных записи ограничивается 1 МБ, хотя активы не говорят против того предела.
Соответствуя требованиям завтрашнего дня Ваши записи
Поскольку Вы разрабатываете типы записи для своего приложения, удостоверьтесь, что те записи удовлетворяют Ваши потребности, но не ограничивают Вас во внесении изменений в будущем. Просто добавить новые поля к записи, однако, поле не может быть удалено, или его типы данных изменяются после развертывания записей на продуктивную среду. Существуют некоторые способы, которыми можно сделать обновление приложения проще в будущем:
Используйте новые ключи для представления новых типов данных. Добавление новых ключей к записям является простым процессом. Новая версия Вашего приложения может инкрементно обновить записи, поскольку это касается их путем добавления любых ключей, в которых это нуждается.
Определите типы записи, не теряющие целостность данных легко. Каждая новая версия Вашего приложения должна создать записи, не повреждающие более старые версии приложения. Лучший способ гарантировать целостность данных состоит в том, чтобы минимизировать сумму проверки, требуемой для записи:
Избегите полей, имеющих узкий диапазон приемлемых значений, изменение которых могло бы заставить более старые версии приложения обрабатывать данные как недопустимые.
Избегите полей, значения которых зависят от значений других полей. Создание зависимых полей означает, что необходимо записать логику проверки, чтобы гарантировать, что значения тех полей корректны. После того, как создаваемый, этот вид логики проверки трудно изменить позже, не повреждая более старые версии Вашего приложения.
Минимизируйте число обязательных полей для данной записи. Как только Вы требуете присутствия поля, каждая версия Вашего приложения после этого должна заполнить то поле с данными. Обработка полей как дополнительные дает Вам больше гибкости для изменения данных позже.
Дескриптор недостающие ключи корректно. Если ключ не присутствует, добавьте его бесшумно.