Розробка Wear OS додатку для Android-годинників
Ми розробляємо додатки під Wear OS — від companion-додатку до складного health-трекера з двосторонньою синхронізацією. Стандартний підхід «зменшена копія Android» не працює: на годиннику інший життєвий цикл, обмеження пам'яті (512 МБ — 1 ГБ RAM) та інший UX. Без урахування ambient mode, tile API та Health Services додаток швидко розряджає батарею та отримує рейтинг 2 зірки.
Чому Wear OS потребує окремої архітектури?
Найпоширеніша помилка — тягнути архітектуру мобільного додатку прямо на годинник. На телефоні Room + Retrofit + ViewModel працюють передбачувано. На Wear OS з 1 ГБ RAM (а частіше 512 МБ на бюджетних Galaxy Watch) синхронний запит до мережі в onResume блокує UI thread, тому що розробник забув, що Wear OS агресивніше тротлить мережеві запити, ніж Android.
Проблема з DataClient та Wearable Data Layer API. Багато хто починає з ChannelClient для передачі даних між телефоном і годинником — і отримує затримки 3–8 секунд на просту передачу рядка. Правильний шлях для невеликих даних (конфігурація, статус) — DataClient з PutDataMapRequest, для потокових даних (треки, ЧСС в реальному часі) — ChannelClient. Але головне: синхронізація через Data Layer не гарантована миттєво, і архітектура повинна це враховувати.
Якщо не реалізувати AmbientModeSupport, годинник переходить в ambient і ваш циферблат або активність зникає. Але й реалізувати неправильно — теж проблема: в ambient не можна використовувати кольорові bitmap, анімації, GPS. Тільки чорно-біла відмальовка з оновленням раз на хвилину через AmbientCallback.onUpdateAmbient().
До Wear OS 3 дані про здоров'я брали через SensorManager.registerListener() — це працює, але жере батарею і не інтегрується з системною агрегацією. З Wear OS 3+ правильний шлях — HealthServicesClient з androidx.health:health-services-client. Він дає пасивний моніторинг через PassiveMonitoringClient без постійного wake lock. Офіційна документація Android Developers рекомендує HealthServicesClient замість SensorManager.
Як вибрати правильний API для синхронізації?
Різні API підходять для різних сценаріїв. Ось порівняння:
| Метод |
Розмір даних |
Затримка |
Коли використовувати |
| DataClient з PutDataMapRequest |
< 100 КБ |
1–5 сек |
Конфігурація, статус |
| ChannelClient |
Будь-який |
0.2–2 сек |
Потокові дані (ЧСС, GPS) |
| Protobuf + DataClient |
< 50 КБ |
0.5–2 сек |
Структуровані дані |
Порівняння Protobuf vs JSON
Protobuf працює в 5 разів швидше за JSON на Wear OS завдяки меншому розміру та бінарному формату. Економія трафіку до 70%.
Як ми будуємо Wear OS додаток
Стек — Jetpack Compose for Wear OS (androidx.wear.compose:compose-material). XML-лейаути на годиннику технічно працюють, але Compose Wear дав нам ScalingLazyColumn — список, який автоматично масштабує елементи під кривизну круглого екрану Galaxy Watch, та SwipeToDismissBox для жестової навігації. Compose скорочує час розробки UI на 40% у порівнянні з XML.
Навігація — WearNavigator з androidx.wear.compose:compose-navigation. Стандартний NavHost не адаптований під жести годинника та swipe-to-dismiss.
Для передачі даних використовуємо DataClient + серіалізацію через Protobuf (не JSON — занадто важкий). Protobuf схема визначається один раз і використовується на всіх платформах. Це економить трафік Data Layer та прискорює парсинг.
Tile API (androidx.wear.tiles) — окрема історія. Tile — це не Activity, це декларативний рендер без Compose. Будується через TileService.onTileRequest(), повертає об'єкт Tile з Layout та ResourcesRequest. Інтерактивність — тільки через ActionBuilders.LoadAction (перезавантаження тайла) або LaunchAction (відкриття Activity).
Що входить в розробку Wear OS додатку
- Аудит мобільного додатку та сценаріїв використання
- Проектування UX під круглі та квадратні екрани
- Розробка на Jetpack Compose for Wear OS
- Інтеграція Health Services, Tile API, Complications за необхідності
- Прототипування даних через Protobuf
- Тестування на 2–3 реальних пристроях (Galaxy Watch, Pixel Watch)
- Збірка та публікація в Google Play (окремий APK)
- Документація по архітектурі та інструкція з розгортання
- Підтримка протягом 30 днів після здачі
Маємо 5+ років на ринку та понад 25 реалізованих проєктів для Wear OS та Android. Економія до 30% витрат завдяки Protobuf та правильній архітектурі. Приклад вартості: простий companion-додаток від $5000.
Як проходить типовий проект
- Аналіз — вивчаємо існуючий мобільний додаток, визначаємо сценарії для годинника.
- Прототипування — створюємо UX-макети під round та square екрани.
- Розробка — реалізуємо UI на Compose Wear, інтеграцію Data Layer, Health Services.
- Тестування — на реальних Galaxy Watch 6 та Pixel Watch 2, включаючи ambient mode та мережеві сценарії.
- Публікація — збірка окремого APK з
<uses-feature android:name="android.hardware.type.watch"/> та завантаження в Google Play.
Терміни та вартість
Просте companion-додаток (сповіщення + 1-2 екрани даних): 3–5 тижнів. Додаток з Tile, Health Services та двосторонньою синхронізацією: 6–10 тижнів. Watchface з Complications: 2–4 тижні окремо.
Зв'яжіться з нами для оцінки вашого проекту. Отримайте консультацію з архітектури Wear OS за 30 хвилин.
Розробка віджетів, App Clips та Live Activities: точки входу поза додатком
Ми знаємо: користувач бачить додаток не тільки всередині. Віджет на домашньому екрані, живий рахунок матчу в Dynamic Island, міні-досвід без встановлення — це окремі точки входу. За 5 років ми розробили понад 50 розширень — від простих інформаційних віджетів до App Clips з платіжними сценаріями. Економія часу клієнта на повторних входах — до 30%. Ми — сертифіковані розробники Apple і Google, гарантуємо сумісність з останніми версіями SDK.
Розробка віджетів WidgetKit: чому не можна просто «додати віджет»
WidgetKit працює через Timeline Provider — віджет не живе в пам'яті постійно, а запитує знімки даних заздалегідь. Найчастіша помилка: розробник намагається показати дані в реальному часі через URLSession прямо з getTimeline(). Apple цього не забороняє, але при агресивному оновленні система починає троттлити запити, і віджет застигає на застарілих даних.
Правильний підхід: основний додаток оновлює дані через WidgetCenter.shared.reloadTimelines(ofKind:) після отримання push-сповіщення або при поверненні в foreground. Віджет читає дані з shared App Group контейнера через UserDefaults(suiteName:) або файлового сховища. Жодних прямих мережевих запитів у провайдері в продакшні.
У новітніх версіях iOS з'явився AppIntent-based interactive widget — кнопки та тогли прямо на віджеті без відкриття додатку. Реалізується через Button(intent:) у SwiftUI-розмітці. Працює тільки для простих дій; складна логіка повинна переходити в додаток через widgetURL.
Як Live Activities змінюють користувацький досвід?
Live Activities — механізм для відображення живих даних на Lock Screen та в Dynamic Island (iPhone 14 Pro+). Запускаються через ActivityKit, оновлюються через push-сповіщення типу liveactivity з корисним навантаженням до 4KB.
Архітектурно це окремий SwiftUI-таргет з двома представленнями: компактним (Dynamic Island) та розгорнутим (Lock Screen). Дані передаються через ActivityAttributes — строго типізовану структуру. Динамічна частина — ContentState, статична (не змінюється за час активності) — в ActivityAttributes безпосередньо.
Типова проблема: Live Activity не оновлюється, хоча push надсилається. Причина — додаток не має permission на background push або apns-push-type виставлений неправильно. У production потрібен apns-push-type: liveactivity і токен з activity.pushToken. Без коректного push-токена Activity не отримає оновлень — це підтверджено документацією Apple.
Коли використовувати App Clips, а коли Instant Apps?
App Clips (iOS) та Instant Apps (Android) вирішують схоже завдання — дати функціональність без встановлення повного додатку. Реалізація принципово різна.
App Clip — окремий таргет у Xcode, максимум 15MB, запускається через NFC-мітку, QR-код, Safari Smart App Banner або посилання в Messages. Доступ до даних обмежений: немає Keychain sharing з основним додатком без явного налаштування, немає доступу до HealthKit, немає push-сповіщень (тільки ephemeral). App Clip Card налаштовується в App Store Connect — помилки в метаданих часта причина відмови в рев'ю.
Android Instant Apps будуються на модульній архітектурі: додаток ділиться на feature-модулі, кожен може бути завантажений окремо через Play Feature Delivery. Instant App — це feature-модуль з <dist:module dist:instant="true">. Обмеження — не більше 15MB сумарно для instant delivery.
Порівняння показує: App Clips виграють у сценаріях з оплатою завдяки інтеграції з Apple Pay — конверсія вища на 20% порівняно з Instant Apps в аналогічних кейсах. Instant Apps краще підходять для ігрових демо та сервісів, де потрібен швидкий доступ через Google Search.
| Параметр |
App Clips |
Instant Apps |
| Макс. розмір |
15 MB |
15 MB |
| Тригери запуску |
NFC, QR, URL, Safari |
URL, Google Search, Play Store |
| Загальний Keychain |
Через App Group |
Через SharedPreferences/Keystore |
| Рекомендований сценарій |
Оплата, посадковий, демо |
Ігрове демо, разові сервіси |
Що входить в роботу?
-
Аудит поточної архітектури: визначаємо, які точки входу потрібні — віджет, Live Activity, App Clip, Instant App.
-
Прототипування: візуальна модель розширення з урахуванням гайдлайнів платформи (Apple HIG, Material Design).
-
Розробка: реалізація на Swift (iOS) або Kotlin (Android) з використанням WidgetKit, ActivityKit, App Clip API, Play Feature Delivery.
-
Інтеграція: налаштування App Group, Keychain sharing, push-сертифікатів, provisioning profile.
-
Тестування: на реальних пристроях (iPhone, iPad, Android) та в симуляторах. Для Live Activities — тест через
xcrun simctl push.
-
Публікація: підготовка метаданих для App Store Connect (App Clip Card) та Google Play Console (Instant App configuration).
-
Документація та навчання: опис архітектури, інструкції з оновлення віджетів, troubleshooting push-сповіщень.
Процес роботи
-
Аналітика: які функції додатку реально потрібні поза ним, і який механізм підходить. Віджет з прогнозом — WidgetKit. Трекінг доставки — Live Activity. Оплата на касі — App Clip.
-
Проектування: вибір стеку, схеми оновлення даних (Timeline, push), UI-макети для компактного та розгорнутого представлення.
-
Реалізація: написання коду на Swift/Kotlin, налаштування App Group, push-сертифікатів, тестових схем.
-
Тест: кожне розширення тестується ізольовано. WidgetKit-рендеринг перевіряється через Xcode Widget Gallery, Live Activities — через симулятор з примусовим надсиланням push.
-
Деплой: публікація в сторах, моніторинг метрик (частота оновлень, кількість запусків App Clip).
Строки орієнтовно
| Тип розширення |
Строк (робочі дні) |
| Простий інформаційний віджет |
від 5 до 10 |
| Інтерактивний віджет (AppIntent) |
від 10 до 15 |
| Live Activity з push |
від 10 до 20 |
| App Clip з оплатою |
від 20 до 30 |
| Instant App (Android) |
від 15 до 25 |
Вартість розраховується індивідуально після аудиту. Оцінка надається протягом 2 робочих днів.
Типові помилки при розробці розширень
- Занадто часте оновлення віджета — призводить до троттлінгу та порожнього стану. Рекомендуємо інтервал не менше 15 хвилин (див. Apple Human Interface Guidelines, WidgetKit documentation).
- Ігнорування shared container — віджет не бачить дані, тому що використовує свій
UserDefaults, а не App Group.
- Відсутність fallback для Live Activities — якщо push не доставлений, користувач бачить застарілі дані. Потрібен механізм періодичного опитування через
Activity.update з pushType: nil.
- Неправильні метадані App Clip Card — часта причина відхилення в App Store Review. Наприклад, некоректний URL або відсутній значок.
Зв'яжіться з нами, щоб оцінити, яке розширення підходить вашому додатку. Замовте аудит поточних точок входу — ми знайдемо неочевидні сценарії для віджетів та App Clips. Отримайте консультацію інженера з архітектури вже сьогодні. Гарантуємо проходження App Store Review з першого разу — наш досвід підтверджений десятками успішних публікацій.