Інтеграція HomeKit-пристроїв у мобільний IoT-додаток
HomeKit — закрита екосистема, але у 2019 році Apple відкрила HAP (HomeKit Accessory Protocol) та специфікації. Для розробника мобільного додатка це означає роботу з HomeKit.framework на iOS, watchOS та tvOS. Без цього — ніяк: сторонні додатки управляють HomeKit-пристроями тільки через офіційний API, обходних шляхів немає.
HomeKit API: структура та обмеження
Ієрархія: HMHomeManager → HMHome → HMRoom → HMAccessory → HMService → HMCharacteristic. Пристрій (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 тижні: настройка прав, реалізація шару управління пристроями, автоматизації, обробка фонових подій. Вартість розраховується індивідуально.







