Создание домов и добавление аксессуаров

Объекты HomeKit хранятся в совместно используемой базе данных HomeKit, к которой получают доступ многократные приложения через платформу HomeKit. Все вызовы метода HomeKit, пишущие записи, являются асинхронными и содержат параметр обработчика завершения. Если метод успешен, Ваше приложение должно обновить локальные объекты в обработчике завершения. Приложение, инициирующее изменение в объектах HomeKit, не получает сообщения делегата; приложение только получает обратные вызовы обработчика завершения.

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

Правила для именования объектов

Имена объектов HomeKit — такого как домой, комната и зональные объекты — распознаны Siri, где обозначено в этом документе. Соблюдающие правила применяются к определению имен объектов HomeKit:

Для приобретения знаний о языке, пользователь может использовать, чтобы взаимодействовать с Siri, считать “Интеграцию Siri” в Инструкциях по Пользовательскому интерфейсу HomeKit.

Создание домов

Для добавления дома используйте addHomeWithName:completionHandler: асинхронный метод в HMHomeManager класс. Домашнее имя, переданное в качестве параметра этому методу, должно быть уникальным. Домашние имена распознаны Siri.

    [self.homeManager addHomeWithName:@"My Home" completionHandler:^(HMHome *home, NSError *error) {
        if (error != nil) {
            // Failed to add a home
        } else {
            // Successfully added a home
        }
    }];

В else пункт, введите свой код, обновляющий представления приложения. Для получения домашнего менеджера считайте Получение Домашнего менеджера Обджекта.

Добавление комнаты в дом

Для добавления комнаты к дому используйте addRoomWithName:completionHandler: асинхронный метод. Имя помещения, переданное в качестве параметра этому методу, должно быть уникальным в доме. Имена помещения распознаны Siri.

    NSString *roomName = @"Living Room";
    [home addRoomWithName:roomName completionHandler:^(HMRoom *room, NSError *error) {
        if (error != nil) {
            // Failed to add a room to a home
        } else {
            // Successfully added a room to a home
        }
    }];

В else пункт, введите свой код, обновляющий представления приложения.

Обнаружение аксессуаров

Аксессуары инкапсулируют состояние физического аксессуара и поэтому не могут быть созданы пользователем. Чтобы позволить пользователям добавлять новые аксессуары к своему дому, используйте HMAccessoryBrowser объект обнаружить новые аксессуары еще не связался с домом. HMAccessoryBrowser поиски объектов аксессуаров в фоновом режиме и делегации использования для уведомления приложения, когда это находит новые аксессуары. HMAccessoryBrowserDelegate сообщения отправляются делегату только после startSearchingForNewAccessories метод вызывается и перед stopSearchingForNewAccessories метод вызывается.

Обнаружить аксессуары в доме

  1. Добавьте вспомогательное делегат браузера протокол и добавьте вспомогательное свойство браузера к Вашему интерфейсу класса.

    @interface EditHomeViewController () <HMAccessoryBrowserDelegate>
     
    @property HMAccessoryBrowser *accessoryBrowser;
     
    @end

    Замена EditHomeViewController с Вашим именем класса.

  2. Создайте вспомогательное объект браузера и установите его делегата.

    self.accessoryBrowser = [[HMAccessoryBrowser alloc] init];
    self.accessoryBrowser.delegate = self;
  3. Начните искать аксессуары.

    [self.accessoryBrowser startSearchingForNewAccessories];
  4. Добавьте найденные аксессуары к своему набору.

    - (void)accessoryBrowser:(HMAccessoryBrowser *)browser didFindNewAccessory:(HMAccessory *)accessory {
        // Update the UI per the new accessory; for example, reload a picker view.
        [self.accessoryPicker reloadAllComponents];
    }

    Замените вышеупомянутое accessoryBrowser:didFindNewAccessory: реализация с Вашим кодом. Кроме того, реализуйте accessoryBrowser:didRemoveNewAccessory: метод для удаления аксессуара, который больше не является новым от набора или представления.

  5. Прекратите искать аксессуары.

    Если контроллер представления начинает искать аксессуары, переопределение viewWillDisappear: прекратить искать аксессуары.

    - (void)viewWillDisappear:(BOOL)animated {
        [self.accessoryBrowser stopSearchingForNewAccessories];
    }

Добавление аксессуаров в дома и комнаты

Аксессуары принадлежат дому и дополнительно могут быть добавлены к комнате в доме. Для добавления аксессуара к дому используйте addAccessory:completionHandler: асинхронный метод. Вспомогательное имя, переданное в качестве параметра этому методу, должно быть уникальным в доме. Для добавления аксессуара к комнате в доме используйте assignAccessory:toRoom:completionHandler: асинхронный метод. Комната по умолчанию для аксессуара является комнатой, возвращенной roomForEntireHome метод.

// Add an accesory to a home and a room
// 1. Get the home and room objects for the completion handlers.
__block HMHome *home = self.home;
__block HMRoom *room = roomInHome;
 
// 2. Add the accessory to the home
[home addAccessory:accessory completionHandler:^(NSError *error) {
    if (error) {
        // Failed to add accessory to home
    } else {
        if (accessory.room != room) {
            // 3. If successfully, add the accessory to the room
            [home assignAccessory:accessory toRoom:room completionHandler:^(NSError *error) {
                if (error) {
                    // Failed to add accessory to room
                }
            }];
        }
    }
}];

Аксессуары имеют одну или более служб, и службам определили характеристики производители. Для получения службы и характерных объектов от аксессуара считайте Accessing Services и Характеристики.

Изменение имен аксессуаров

Для изменения имени аксессуара используйте updateName:completionHandler: асинхронный метод.

[accessory updateName:@"Kid's Night Light" completionHandler:^(NSError *error) {
    if (error) {
        // Failed to change the name
    } else {
        // Successfully changed the name
    }
}];

Добавление мостов в дома и комнаты

Мост является специальным типом аксессуара, позволяющего Вам связываться с аксессуарами, которые не могут связаться непосредственно с HomeKit. Например, мост мог бы быть концентратором для многократных световых сигналов, использующих протокол связи кроме Протокола Аксессуара HomeKit. Для добавления моста к дому выполните шаги для добавления любого другого типа аксессуара в дом, как описано в Добавляющих Аксессуарах в Дома и Комнаты. Когда Вы добавляете мост к дому, аксессуары позади моста также добавляются к дому. На шаблон разработки уведомления изменения, описанный в Наблюдении Изменений Базы данных HomeKit, делегат дома не получит a home:didAddAccessory: делегируйте сообщение для моста, но получит a home:didAddAccessory: делегируйте сообщение для каждого аксессуара позади моста. Обработайте аксессуары позади моста таким же образом как любой другой аксессуар в доме — например, добавьте их к списку сконфигурированных аксессуаров.

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

Создание зон

Зона (HMZone) произвольная дополнительная группировка комнат; например, наверху, внизу, или спальни. Комнаты могут быть добавлены к одной или более зонам.

../Art/zones_2x.png

Для создания зоны используйте addZoneWithName:completionHandler: асинхронный метод. Имя зоны, переданной как параметр этому методу, должно быть уникальным в доме. Имена зон распознаны Siri.

__block HMHome *home = self.home;
NSString *zoneName = @"Upstairs";
[home addZoneWithName:zoneName completionHandler:^(HMZone *zone, NSError *error) {
    if (error) {
        // Failed to create zone
    } else {
        // Successfully created zone, now add the rooms
    }
}];

Для добавления комнаты к зоне используйте addRoom:completionHandler: асинхронный метод.

__block HMRoom *room = roomInHome;
[zone addRoom:room completionHandler:^(NSError *error) {
    if (error) {
        // Failed to add room to zone
    } else {
        // Successfully added room to zone
    }
}];