Вступление
CloudKit — это фреймворк Apple, который был представлен вместе с iOS 8 в 2014 году. Его цель — предоставить простое решение для хранения данных вашего приложения в облаке с помощью iCloud, сделав его доступным для всех устройств. Вот некоторые из ключевых особенностей CloudKit:
- до 1 ПБ хранилища активов (изображения, аудиофайлы и т. д.)
- до 10 ТБ хранилища базы данных (строки, числа, массивы и т. д.)
- аутентификация пользователя iCloud
- уведомления
В этом руководстве я научу вас настраивать CloudKit и взаимодействовать с ним в приложении для iOS, создав образец приложения под названием CloudBug . CloudBug отображает список ошибок с заголовком и описанием, которые хранятся в iCloud с помощью CloudKit.
Требования
Это руководство требует, чтобы вы работали с Xcode 6+ и имели учетную запись разработчика iOS. Вам также необходимо скачать стартовый проект с GitHub .
1. Конфигурация проекта
Первое, что вам нужно сделать после открытия стартового проекта, — это изменить идентификатор и команду целевого комплекта . Выберите проект CloudBug в Навигаторе проектов и выберите цель CloudBug из списка целей.

Измените идентификатор пакета на уникальную строку, используя обратную нотацию службы доменных имен . Далее выберите подходящую команду для вашей учетной записи разработчика.
Откройте вкладку « Возможности » вверху и включите iCloud , переключая переключатель справа. Это покажет настройки iCloud для цели CloudBug .

В настройках iCloud установите флажок CloudKit, чтобы включить CloudKit для цели CloudBug.

Создайте и запустите приложение на физическом устройстве в iOS Simulator, чтобы увидеть, все ли работает без ошибок.
2. Создание типа записи об ошибке
Нажмите кнопку CloudKit Dashboard в нижней части настроек iCloud. Это откроет панель управления CloudKit в вашем браузере. После входа в систему с учетной записью разработчика должна появиться панель управления CloudKit. Прежде чем продолжить, позвольте мне пройтись по пунктам на боковой панели слева.

схема
- Типы записей функционируют аналогично обычному определению класса. Записи создаются как экземпляры классов из этих типов.
- Роли безопасности предоставляют возможность различным пользователям получать доступ к данным по-разному. Например, роль безопасности можно использовать, чтобы разрешить только пользователям уровня администратора чтение и запись данных.
- Типы подписок используются для управления различными подписками, которые есть в вашем приложении, если они были реализованы.
Публичные данные
- Записи пользователей работают так же, как обычные записи, за исключением того, что они специально связаны с типом записей пользователей , который нельзя удалить.
- Зона по умолчанию — это место, где будут храниться все ваши публичные записи и другие данные.
Частные данные
- Зона по умолчанию работает так же, как и общедоступная зона по умолчанию, за исключением того, что она доступна только пользователю, вошедшему в систему в данный момент.
Администратор
- Команда, в которой вы можете просматривать других разработчиков, сотрудничающих над проектом, и редактировать их разрешения.
- Развертывание, где вы можете посмотреть, какие изменения будут внесены в схему элементы, когда ваш проект попадает в производственную среду.
В этом уроке вы сосредоточитесь только на типах записей и общедоступной зоне по умолчанию. Следующим шагом является создание вашего первого типа записи.
Если вы выберете « Типы записей» на боковой панели слева, вы заметите, что тип с именем « Пользователи» уже существует.

Давайте создадим новый тип записи с именем Bug, который будет содержать заголовок и описание. Нажмите кнопку «плюс» вверху, чтобы создать новый тип записи.

Измените имя нового типа записи на Bug и добавьте два атрибута, Title и Description . Создайте оба атрибута типа String, отметив только опцию индекса запроса . Вот как должен выглядеть новый тип записи.

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

3. Создание записей в CloudKit Dashboard
Когда вы выбираете Зону по умолчанию в Общедоступных данных , тип записи об ошибке уже должен быть выбран. Создайте новую запись, нажав « Новая запись» или кнопку «плюс» вверху.

Введите все, что вы хотите для описания записи и Поля заголовка .

Нажмите Сохранить в правом нижнем углу, чтобы создать запись. Вы увидите, что вашей записи была присвоена уникальная запись Идентификатор , Дата создания, Дата изменения , Идентификатор созданного и Идентификатор измененного . Независимо от того, на каком типе записи основана запись, она всегда будет иметь эти пять атрибутов.
4. Загрузка записей
Вернитесь к Xcode и откройте MasterViewController.swift . Вверху добавьте оператор импорта для импорта платформы CloudKit.
|
1
|
import CloudKit
|
Обновите метод viewDidLoad , добавив следующий фрагмент кода.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
let container = CKContainer.defaultContainer()
let publicData = container.publicCloudDatabase
let query = CKQuery(recordType: «Bug», predicate: NSPredicate(format: «TRUEPREDICATE», argumentArray: nil))
publicData.performQuery(query, inZoneWithID: nil) { results, error in
if error == nil { // There is no error
for bug in results {
let newBug = Bug()
newBug.title = bug[«Title»] as!
newBug.description = bug[«Description»] as!
self.objects.append(newBug)
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.tableView.reloadData()
})
}
}
else {
println(error)
}
}
|
Давайте посмотрим, что происходит в этом фрагменте кода.
- Сначала мы получаем ссылку на контейнер по умолчанию для вашего приложения. Этот контейнер содержит типы записей и записи, которые мы создали на информационной панели CloudKit. Вы можете создать больше контейнеров с уникальным идентификатором в Target Inspector> Capabilities .
- Во-вторых, мы получаем ссылку на публичную базу данных контейнера. Формат такой же для частной базы данных.
- Затем мы создаем запрос для типа записи об
NSPredicateэкземплярNSPredicate. Этот предикат можно использовать для фильтрации результатов запроса, например, только выборки записей, созданных или измененных после определенной даты. Для этого примера мы выбираем каждую запись типа Bug . - Далее мы сообщаем базе данных выполнить запрос, который запускает асинхронный запрос. Когда запрос завершен, блок завершения выполняется, передавая нам массив
resultsи объектerror. - Если объект
errorравенnil, мы перебираем элементы массиваresultsи создаем локальный экземплярBugдля каждой записи. Каждый экземплярBugдобавляется в источник данных табличного представления, а табличное представление перезагружается в главном потоке.
Создайте и запустите ваше приложение, чтобы увидеть, загружена ли запись, созданная нами на панели мониторинга CloudKit, в CloudBug.

Если вы видите ошибку в консоли Xcode, похожую на приведенную ниже, убедитесь, что вы вошли в правильную учетную запись iCloud на своем тестовом устройстве. Это также верно, если вы используете CloudBug в iOS Simulator.

Нажатие на ошибку в табличном представлении должно представить контроллер подробного представления с описанием ошибки.

5. Создание записей
В то время как загрузка данных из iCloud через CloudKit может быть очень полезной, CloudBug также нужна возможность, позволяющая пользователям создавать новые записи. В MasterViewController.swift добавьте следующий фрагмент кода в метод receiveBug(_:) .
|
01
02
03
04
05
06
07
08
09
10
11
|
let container = CKContainer.defaultContainer()
let publicData = container.publicCloudDatabase
let record = CKRecord(recordType: «Bug»)
record.setValue(bug.title, forKey: «Title»)
record.setValue(bug.description, forKey: «Description»)
publicData.saveRecord(record, completionHandler: { record, error in
if error != nil {
println(error)
}
})
|
Первые две строки должны быть знакомы. Мы получаем ссылку на контейнер по умолчанию и публичную базу данных. Мы создаем экземпляр CKRecord , устанавливаем значения для ключей Title и Description и сохраняем запись в iCloud.
Обратите внимание, что объект record возвращаемый из iCloud в обработчике завершения saveRecord(_:completionHandler:) включает в себя значения, которые вы устанавливаете вручную, а также пять атрибутов по умолчанию, которые мы видели ранее на панели мониторинга CloudKit.
Создайте и запустите свое приложение, а также опубликуйте новую ошибку, нажав кнопку «плюс» в правом верхнем углу, заполнив поля заголовка и описания. Нажмите « Опубликовать» и сохраните новую запись в iCloud в базе данных CloudKit.

Еще раз зайдите на панель мониторинга CloudKit и перейдите в зону по умолчанию в разделе « Общие данные» . Если все прошло хорошо, Вы должны увидеть две записи об ошибках в базе данных.

6. Удаление записей
Давайте закончим этот урок, позволив пользователям удалять ошибки. Добавьте следующий фрагмент кода в tableView(_:commitEditingStyle:forRowAtIndexPath:) метод чуть выше objects.removeAtIndex(indexPath.row) .
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
let container = CKContainer.defaultContainer()
let publicData = container.publicCloudDatabase
let bug = self.objects[indexPath.row]
let query = CKQuery(recordType: «Bug», predicate: NSPredicate(format: «(Title == %@) AND (Description == %@)», argumentArray: [bug.title, bug.description]))
publicData.performQuery(query, inZoneWithID: nil, completionHandler: { results, error in
if error == nil {
if results.count > 0 {
let record: CKRecord!
println(record)
publicData.deleteRecordWithID(record.recordID, completionHandler: { recordID, error in
if error != nil {
println(error)
}
})
}
}
else {
println(error)
}
})
|
Чтобы удалить запись, мы создаем запрос, как мы делали ранее. Однако для удаления записи мы создаем предикат, соответствующий заголовку и описанию ошибки. Обработчик завершения возвращает результаты запроса, который мы используем для удаления соответствующей записи из общедоступной базы данных.
Создайте и запустите приложение и удалите одну из ошибок, проведя вправо или нажав кнопку « Изменить» .

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