Наблюдение изменений базы данных HomeKit

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

../Art/architecture_2x.png../Art/architecture_2x.png

О методах делегации HomeKit

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

Например, если (1) в ответ на пользовательское действие, (2) Ваше приложение вызывает addRoomWithName:completionHandler: и никакая ошибка не происходит, (3), обработчик завершения должен (4) обновлять представления дома. Если успешный, HomeKit (5) отправляет home:didAddRoom: обменивайтесь сообщениями делегатам дома в других приложениях. Поэтому Ваша реализация home:didAddRoom: метод должен также (6) обновлять представления дома.

../Art/changeflow_2x.png

Приложения должны быть на переднем плане для получения этих сообщений делегата. В то время как Ваше приложение в фоновом режиме, изменения не обрабатываются в пакетном режиме. Если Ваше приложение в фоновом режиме, в то время как другое приложение успешно добавляет комнату к дому, Ваше приложение не получает a home:didAddRoom: сообщение. Когда Ваше приложение прибывает в передний план, Ваше приложение получает a homeManagerDidUpdateHomes: сообщение, сигнализирующее Ваше приложение для перезагрузки всех его данных.

Наблюдение изменений в наборе домов

Для получения сообщений делегата когда основной дом или набор изменений домов установите делегата домашнего менеджера и реализуйте HMHomeManagerDelegate протокол.

Все приложения должны реализовать homeManagerDidUpdateHomes: метод, вызывающийся после HomeKit, заканчивает начальную выборку домов. Пока этот метод не вызывается, для недавно создаваемого домашнего менеджера, primaryHome свойство nil и homes свойство является пустым массивом. homeManagerDidUpdateHomes: метод также вызывается, когда приложение прибывает в передний план, и изменения произошли, в то время как это было в фоновом режиме. homeManagerDidUpdateHomes: метод должен перезагрузить все данные, связанные с домами.

Наблюдать изменения в домах

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

    @interface AppDelegate () <HMHomeManagerDelegate>
     
    @property (strong, nonatomic) HMHomeManager *homeManager;
     
    @end
  2. Создайте домашний объект менеджера и установите его делегата.

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        self.homeManager = [[HMHomeManager alloc] init];
        self.homeManager.delegate = self;
     
        return YES;
  3. Реализуйте методы делегата, вызывающиеся когда домашние изменения.

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

    - (void)homeManagerDidUpdateHomes:(HMHomeManager *)manager {
        // Send a notification to the other objects
        [[NSNotificationCenter defaultCenter] postNotificationName:@"UpdateHomesNotification" object:self];
    }
     
    - (void)homeManagerDidUpdatePrimaryHome:(HMHomeManager *)manager {
        // Send a notification to the other objects
        [[NSNotificationCenter defaultCenter] postNotificationName:@"UpdatePrimaryHomeNotification" object:self];
    }

    Контроллеры представления регистрируются для уведомления изменения и реализуют соответствующие меры.

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateHomes:) name:@"UpdateHomesNotification" object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updatePrimaryHome:) name:@"UpdatePrimaryHomeNotification"  object:nil];

Наблюдение изменений в отдельных домах

Контроллер представления, выводящий на экран информацию о доме, должен быть делегатом к домашнему объекту и обновить его представления когда домашние изменения.

Наблюдать изменения в определенном доме

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

    @interface HomeViewController () <HMHomeDelegate>
     
    @end
  2. Установите делегата аксессуара.

    home.delegate = self;
  3. Реализуйте HMHomeDelegate протокол.

    Например, реализуйте home:didAddAccessory: и home:didRemoveAccessory: методы для обновления представлений тот дисплей аксессуары. Для получения комнаты, которой принадлежит аксессуар используйте room свойство в HMAccessory класс. (Комната по умолчанию для аксессуара возвращается roomForEntireHome метод.)

Наблюдение изменений в аксессуарах

В любое время состояние аксессуара может измениться. Аксессуар может не быть достижимым, может быть вне диапазона или может быть выключен. Обновите пользовательский интерфейс соответственно для отражения текущего состояния аксессуаров, особенно если приложение позволяет пользователю управлять аксессуаром.

На этих шагах предполагается, что Вы уже получили вспомогательное объект от базы данных HomeKit, как описано в Получении Аксессуаров в Комнате.

Наблюдать изменения в определенном аксессуаре

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

    @interface AccessoryViewController () <HMAccessoryDelegate>
     
    @end
  2. Установите делегата аксессуара.

    accessory.delegate = self;
  3. Реализуйте HMAccessoryDelegate протокол.

    Например, реализуйте accessoryDidUpdateReachability: метод, чтобы включить или отключить средства управления аксессуаром.

    - (void)accessoryDidUpdateReachability:(HMAccessory *)accessory {
        if (accessory.reachable == YES) {
           // Can communicate with the accessory
        } else {
           // The accessory is out of range, turned off, etc
        }
    }

Если Вы выводите на экран состояние служб и их характеристик, реализуете следующие методы делегата обновить представления соответственно:

Для доступа к службам аксессуара считайте Accessing Services и Их Характеристики.