Розробка мобільного додатку для розумного дому (електрозамки/домофон)
Замок завис, API повернув 503, BLE-з'єднання не встановилося — користувач стоїть біля дверей з мертвим телефоном. Це не UX-проблема, це інцидент. Ми проектуємо додатки для електрозамків та домофонів, де кожен канал зв'язку має резерв. Наш досвід — 10+ років та 15 проєктів у сфері розумного дому. Нещодавно ми вирішували проблему з замками Nuki на iOS: додаток не отримував BLE-сповіщення про стан замка через неправильне налаштування CoreBluetooth background modes. Після додавання bluetooth-central в Info.plist та використання CBCentralManagerOptionShowPowerAlertKey все запрацювало. Такі деталі визначають надійність. Готові оцінити ваш проєкт за 2 дні: пишіть, і ми запропонуємо рішення під ключ.
Як ми забезпечуємо надійність при відмові всіх каналів?
Архітектура будується на резервуванні. Мінімум два незалежних способи відкрити замок. Якщо основний канал впав, користувач не повинен дзвонити в підтримку, стоячи на морозі. Типова ієрархія каналів:
- BLE (локальний, без інтернету) — перший пріоритет при близькій відстані
- Wi-Fi/хмара — якщо BLE не доступний
- PIN-код на замку — при повній відмові системи
- Механічний ключ — фізичний fallback
Додаток автоматично визначає доступні канали та перемикається. BLE: перевіряємо Bluetooth state через FlutterBluePlus.adapterState. Немає BLE або пристрій далеко — пробуємо Wi-Fi/хмару. В UI показуємо активний канал користувачеві. Знижуємо витрати на підтримку — менше дзвінків, вища задоволеність.
Чому BLE — основний канал для швидкого відкриття?
BLE забезпечує затримку менше 200 мс — в 10 разів швидше хмарного керування. Дальність 5–15 метрів, не потребує інтернету. Нативна реалізація через CoreBluetooth (iOS) / Android BLE API, на Flutter — flutter_blue_plus. Кожен замок — GATT-сервіс зі своїми характеристиками. Наприклад, August замки використовують service UUID 00001523-1212-EFDE-1523-785FEABCD123 з пропрієтарним протоколом — офіційного SDK немає, працюємо через реверс-інжиніринг або August API.
Протоколи та типи замків
| Протокол | Дальність | Затримка | Залежність від інтернету | Приклади замків |
|---|---|---|---|---|
| BLE | 5-15 м | <200 мс | Ні | August, Schlage Encode, Nuki |
| Wi-Fi | ~100 м | 300-2000 мс | Так | Tuya, Yale Connect, Kwikset Halo |
| Zigbee | 10-100 м | <500 мс | Через хаб | Samsung SmartThings, Kwikset |
| Z-Wave | 30-100 м | <500 мс | Через хаб | Schlage, Kwikset Z-Wave |
Для Wi-Fi замків Tuya використовуємо Tuya Open API: POST /v1.0/devices/{deviceId}/commands з {"commands": [{"code": "switch_1", "value": true}]}. Для Zigbee — MQTT-команда на топик zigbee2mqtt/{device}/set з {"state": "UNLOCK"}. Z-Wave працює через Z-Wave JS або Home Assistant.
Порівняння підходів до тимчасового доступу
| Підхід | Швидкість видачі ключа | Безпека | Офлайн-робота | Типові замки |
|---|---|---|---|---|
| Хмарний API (Nuki, August) | <1 с | Висока (SSL) | Ні | Nuki, August |
| BLE-токен з підписом | <100 мс | Висока (крипто) | Так | Будь-які BLE |
| PIN-код на замку | Миттєво | Середня | Так | З сенсорною панеллю |
Тимчасовий доступ та гості
Ключ для гостя на 24 години, для Airbnb-мешканця на тиждень, для домробітниці по вівторках з 10 до 14 — це core функціональність. Реалізація залежить від замка. Nuki Web API: POST /smartlock/{smartlockId}/auth створює authorization з allowedWeekDays, allowedFromDate, allowedUntilDate, allowedFromTime, allowedUntilTime. August API: POST /access_codes з access_code типом.
Для BLE-замків без хмари тимчасовий ключ — криптографічно підписаний токен з часовими обмеженнями, що передається по BLE. На бекенді зберігаємо всі видані ключі з метаданими (кому, ким, термін, список використань). Push-сповіщення власнику при кожному використанні гостьового ключа.
Як реалізувати відеодзвінок з домофона?
Відеодзвінок з домофона на мобільний = WebRTC + VoIP push. Коли хтось натиснув кнопку домофона:
- Домофон публікує подію в MQTT
- Бекенд надсилає VoIP push на iOS (через PushKit) або FCM з
priority: highна Android - Додаток прокидається у фоні, встановлює WebRTC з'єднання з домофоном
- Показує UI вхідного дзвінка через
CallKit(iOS) абоandroid.telecom.ConnectionService
VoIP push на iOS через PushKit — єдиний спосіб надійно розбудити додаток для відеодзвінка. Звичайний push приходить із затримкою 2–30 секунд. PushKit — миттєво. Потребує VoIP сертифікат в Apple Developer Portal, entitlement com.apple.developer.pushkit.unrestricted-dispatch. На Android фоновий сервіс з startForeground тримає WebRTC з'єднання готовим. Починаючи з Android 14 — обмеження на фонові сервіси посилилися, потрібен ForegroundServiceType.CAMERA + ForegroundServiceType.MICROPHONE в маніфесті.
Журнал подій
Кожне відкриття — запис у журнал: хто, яким методом, в який час. Для знімного житла це юридично важливо. Зберігання: PostgreSQL з таблицею access_log (id, lock_id, user_id, method, timestamp, result). Індекс по (lock_id, timestamp DESC). Мобільний додаток запитує посторінково: GET /api/locks/{id}/access-log?page=1&per_page=50.
Типові помилки при інтеграції
-
BLE не сканується — не включено bluetooth-central background mode на iOS або не запитано
android.permission.BLUETOOTH_SCANна Android 12+. - PushKit не приходить — сертифікат VoIP не перевипущено або не вказано topic в payload.
- WebRTC не з'єднується — STUN/TURN сервери не налаштовані або блокуються firewall.
- Тимчасовий ключ не відкриває замок — не співпадає timezone на замку та бекенді.
Що входить в розробку?
Отримуєте повний цикл: аналіз вимог та узгодження протоколів, проектування архітектури з резервними каналами, розробка мобільного додатка (iOS/Android), інтеграція з замками та домофонами через API, налаштування push-сповіщень (PushKit, FCM), тестування на реальних пристроях, підготовка документації та інструкцій для користувачів. Включаємо гарантійну підтримку на 3 місяці після релізу.
Строки та вартість
Один тип замка (BLE або Wi-Fi/хмара), базове керування, тимчасовий доступ — 6–8 тижнів. Мультипротокол, домофон з відео, CallKit/VoIP, журнал, сповіщення — 4–6 місяців. Вартість розраховується після визначення моделі замків та вимог до гостьового доступу. Зв'яжіться з нами — отримайте консультацію з архітектури та попередню оцінку. Замовте розробку під ключ — ми запропонуємо рішення за 2 дні.
Apple PushKit documentation: https://developer.apple.com/documentation/pushkit







