Статьи

Введение в CloudKit

CloudKit — это фреймворк Apple, который был представлен вместе с iOS 8 в 2014 году. Его цель — предоставить простое решение для хранения данных вашего приложения в облаке с помощью iCloud, сделав его доступным для всех устройств. Вот некоторые из ключевых особенностей CloudKit:

  • до 1 ПБ хранилища активов (изображения, аудиофайлы и т. д.)
  • до 10 ТБ хранилища базы данных (строки, числа, массивы и т. д.)
  • аутентификация пользователя iCloud
  • уведомления

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

Это руководство требует, чтобы вы работали с Xcode 6+ и имели учетную запись разработчика iOS. Вам также необходимо скачать стартовый проект с GitHub .

Первое, что вам нужно сделать после открытия стартового проекта, — это изменить идентификатор и команду целевого комплекта . Выберите проект CloudBug в Навигаторе проектов и выберите цель CloudBug из списка целей.

Конфигурирование цели CloudBug

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

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

Включение iCloud для CloudBug Target

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

Включение CloudKit для цели CloudBug

Создайте и запустите приложение на физическом устройстве в iOS Simulator, чтобы увидеть, все ли работает без ошибок.

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

Открытие панели инструментов CloudKit
  • Типы записей функционируют аналогично обычному определению класса. Записи создаются как экземпляры классов из этих типов.
  • Роли безопасности предоставляют возможность различным пользователям получать доступ к данным по-разному. Например, роль безопасности можно использовать, чтобы разрешить только пользователям уровня администратора чтение и запись данных.
  • Типы подписок используются для управления различными подписками, которые есть в вашем приложении, если они были реализованы.
  • Записи пользователей работают так же, как обычные записи, за исключением того, что они специально связаны с типом записей пользователей , который нельзя удалить.
  • Зона по умолчанию — это место, где будут храниться все ваши публичные записи и другие данные.
  • Зона по умолчанию работает так же, как и общедоступная зона по умолчанию, за исключением того, что она доступна только пользователю, вошедшему в систему в данный момент.
  • Команда, в которой вы можете просматривать других разработчиков, сотрудничающих над проектом, и редактировать их разрешения.
  • Развертывание, где вы можете посмотреть, какие изменения будут внесены в схему   элементы, когда ваш проект попадает в производственную среду.

В этом уроке вы сосредоточитесь только на типах записей и общедоступной зоне по умолчанию. Следующим шагом является создание вашего первого типа записи.

Если вы выберете « Типы записей» на боковой панели слева, вы заметите, что тип с именем « Пользователи» уже существует.

Тип записи пользователя является типом записи по умолчанию

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

Создание нового типа записи

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

Вот как должен выглядеть новый тип записи

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

Создайте тип записи об ошибке, нажав Сохранить

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

Создать новую запись

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

Добавить данные в новую запись

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

Вернитесь к 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.

Загрузка записей в CloudBug

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

Убедитесь, что вы вошли в iCloud

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

Отображение описания ошибок

В то время как загрузка данных из 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 и перейдите в зону по умолчанию в разделе « Общие данные» . Если все прошло хорошо,   Вы должны увидеть две записи об ошибках в базе данных.

Новая запись отображается на панели инструментов CloudKit

Давайте закончим этот урок, позволив пользователям удалять ошибки. Добавьте следующий фрагмент кода в 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. Если у вас есть какие-либо комментарии или вопросы, оставьте их в комментариях ниже.