Інтеграція 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
    792
  • image_mobile-applications_xoomer_471_0.webp
    Розробка мобільного додатку для компанії XOOMER
    671
  • image_mobile-applications_rhl_428_0.webp
    Розробка мобільного додатку для компанії RHL
    1097
  • image_mobile-applications_zippy_411_0.webp
    Розробка мобільного додатку для компанії ZIPPY
    969
  • image_mobile-applications_affhome_429_0.webp
    Розробка мобільного додатку для компанії Affhome
    914
  • image_mobile-applications_flavors_409_0.webp
    Розробка мобільного додатку для компанії FLAVORS
    495

Інтеграція 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 тижні: настройка прав, реалізація шару управління пристроями, автоматизації, обробка фонових подій. Вартість розраховується індивідуально.