Интеграция HomeKit-устройств в мобильное IoT-приложение

TRUETECH занимается разработкой, поддержкой и обслуживанием мобильных приложений iOS, Android, PWA. Имеем большой опыт и экспертизу для публикации мобильных приложений в популярные маркеты Google Play, App Store, Amazon, AppGallery и другие.
Разработка и поддержка любых видов мобильных приложений:
Информационные и развлекательные мобильные приложения
Новостные приложения, игры, справочники, онлайн-каталоги, погодные, фитнес и здоровье, туристические, образовательные, социальные сети и мессенджеры, квиз, блоги и подкасты, форумы, агрегаторы
Мобильные приложения электронной коммерции
Интернет-магазины, B2B-приложения, маркетплейсы, онлайн-обменники, кэшбэк-сервисы, биржи, дропшиппинг-платформы, программы лояльности, доставка еды и товаров, платежные системы
Мобильные приложения для управления бизнес-процессами
CRM-системы, ERP-системы, управление проектами, инструменты для команды продаж, учет финансов, управление производством, логистика и доставка, управление персоналом, системы мониторинга данных
Мобильные приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, платформы предоставления электронных услуг, платформы кешбека, видеохостинги, тематические порталы, платформы онлайн-бронирования и записи, платформы онлайн-торговли

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

Предлагаемые услуги
Показано 1 из 1 услугВсе 1735 услуг
Интеграция HomeKit-устройств в мобильное IoT-приложение
Сложная
~5 рабочих дней
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_mobile-applications_feedme_467_0.webp
    Разработка мобильного приложения для компании FEEDME
    756
  • image_mobile-applications_xoomer_471_0.webp
    Разработка мобильного приложения для компании XOOMER
    624
  • image_mobile-applications_rhl_428_0.webp
    Разработка мобильного приложения для компании RHL
    1054
  • image_mobile-applications_zippy_411_0.webp
    Разработка мобильного приложения для компании ZIPPY
    947
  • image_mobile-applications_affhome_429_0.webp
    Разработка мобильного приложения для компании Affhome
    862
  • image_mobile-applications_flavors_409_0.webp
    Разработка мобильного приложения для компании FLAVORS
    445

Интеграция HomeKit-устройств в мобильное IoT-приложение

HomeKit — закрытая экосистема, но в 2019 году Apple открыла HAP (HomeKit Accessory Protocol) и спецификации. Для разработчика мобильного приложения это означает работу с HomeKit.framework на iOS, watchOS и tvOS. Без этого — никак: сторонние приложения управляют HomeKit-устройствами только через официальный API, обходных путей нет.

HomeKit API: структура и ограничения

Иерархия объектов: HMHomeManagerHMHomeHMRoomHMAccessoryHMServiceHMCharacteristic. Устройство (Accessory) предоставляет сервисы (Service) — например, умная лампа имеет сервис HMServiceTypeLightbulb. Сервис содержит характеристики (Characteristic) — HMCharacteristicTypePowerState, HMCharacteristicTypeBrightness, HMCharacteristicTypeHue.

import HomeKit

class HomeKitManager: NSObject, HMHomeManagerDelegate {
    private let homeManager = HMHomeManager()

    override init() {
        super.init()
        homeManager.delegate = self
    }

    func homeManagerDidUpdateHomes(_ manager: HMHomeManager) {
        guard let primaryHome = manager.primaryHome else { return }
        fetchLightbulbs(in: primaryHome)
    }

    private func fetchLightbulbs(in home: HMHome) {
        let lightbulbs = home.accessories.flatMap { $0.services }
            .filter { $0.serviceType == HMServiceTypeLightbulb }

        for service in lightbulbs {
            if let brightness = service.characteristics.first(where: {
                $0.characteristicType == HMCharacteristicTypeBrightness
            }) {
                brightness.readValue { error in
                    if let error { print("Read error: \(error)") }
                    print("Brightness: \(brightness.value ?? "nil")")
                }
            }
        }
    }
}

Запись значений и асинхронность

writeValue(_:completionHandler:) — асинхронный, возвращает ошибку через колбэк. С iOS 16 доступна async/await версия через обёртку или напрямую через HMCharacteristic.writeValue:

func setLightOn(_ isOn: Bool, characteristic: HMCharacteristic) async throws {
    try await characteristic.writeValue(isOn)
}

Задержка команды через HomeKit — 100-500 мс для локальных устройств, до 2 секунд через удалённый доступ (через Apple TV или HomePod как хаб). Если устройство за хабом офлайн, получим HMError.accessoryNotReachable (код 6).

Уведомления об изменении состояния

HAP поддерживает push-уведомления от устройств через enableNotification(true). Приложение подписывается на изменения характеристики:

class AccessoryDelegate: NSObject, HMAccessoryDelegate {
    func accessory(_ accessory: HMAccessory,
                   service: HMService,
                   didUpdateValueFor characteristic: HMCharacteristic) {
        if characteristic.characteristicType == HMCharacteristicTypeMotionDetected {
            let motionDetected = characteristic.value as? Bool ?? false
            NotificationCenter.default.post(
                name: .motionDetected,
                object: motionDetected
            )
        }
    }
}

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

Автоматизации и триггеры

HMEventTrigger позволяет создавать правила прямо из приложения:

let motionCharacteristic = // HMCharacteristic типа MotionDetected
let triggerEvent = HMCharacteristicEvent(
    characteristic: motionCharacteristic,
    triggerValue: true
)

let trigger = HMEventTrigger(
    name: "Motion Detected",
    events: [triggerEvent],
    end: nil,
    recurrences: nil,
    executionConditions: nil
)

let lightCharacteristic = // HMCharacteristic типа PowerState
let action = HMCharacteristicWriteAction(
    characteristic: lightCharacteristic,
    targetValue: true
)

let actionSet = HMActionSet(name: "Turn on light")
// Добавляем action в actionSet, потом привязываем к trigger
home.addTrigger(trigger) { error in
    if let error { print("Trigger error: \(error)") }
}

Триггеры работают на стороне Hub (HomePod, Apple TV) и выполняются даже когда приложение закрыто.

Привилегии и App Store

Для работы с HomeKit требуется entitlement com.apple.developer.homekit и ключ NSHomeKitUsageDescription в Info.plist. Без NSHomeKitUsageDescription приложение крашится на первом обращении к HMHomeManager без предупреждения — распространённая ошибка при первой настройке проекта.

Тестирование — только на реальном устройстве. Симулятор HomeKit не поддерживает физические аксессуары, для разработки используется HomeKit Accessory Simulator из Additional Tools for Xcode.

Интеграция HomeKit в существующее iOS-приложение при наличии устройств для тестирования занимает 2-3 недели: настройка прав, реализация слоя управления устройствами, автоматизации, обработка фоновых событий. Стоимость рассчитывается индивидуально.