Companion App — застосунок-компаньйон для носимих пристроїв Apple Watch та Wear OS, що працює в парі з основним застосунком на смартфоні. Companion App синхронізує дані через WatchConnectivity (iOS) або Wearable Data Layer (Android), відображає сповіщення на годиннику та може виконувати функції автономно. Розробка ведеться на Swift для watchOS та Kotlin для Wear OS. Детальніше — на WatchConnectivity Docs.
Головне
Companion App — застосунок для носимих пристроїв Apple Watch або Wear OS, який постачається в парі з основним iOS або Android застосунком. Основна мета — розширення функціональності на зап'ясті: швидкий перегляд інформації, відповідь на повідомлення, керування музикою, відстеження тренувань. Companion App автоматично встановлюється на годинник при встановленні основного застосунку на телефоні, якщо розробник включив його в білд.
Архітектура companion застосунку включає два компоненти: iOS/Android застосунок (головний) та watchOS/Wear OS застосунок (компаньйон). Зв'язок між ними здійснюється через системні API: WatchConnectivity для Apple та Wearable Data Layer для Google. Дані передаються у фоні по Bluetooth або Wi-Fi — користувач не бачить процесу синхронізації. Застосунок на годиннику може мати власний UI, відмінний від мобільного, адаптований під маленький екран.
Типи companion застосунків розрізняються за ступенем залежності від телефону. Mirroring-застосунки відображають копію даних з телефону і не працюють без підключення. Decoupled-застосунки мають власну логіку, кешують дані та зберігають частину функціональності при відключенні від телефону. Independent-застосунки (watchOS 6+ та Wear OS 3+) можуть встановлюватися без телефону та працювати повністю автономно з власним мережевим доступом.
WatchConnectivity — фреймворк Apple для двосторонньої комунікації між iPhone та Apple Watch. Надає чотири механізми передачі даних: Application Context (останній відомий стан), File Transfer (файли будь-якого розміру), User Info (словники з гарантованою доставкою) та Interactive Messaging (двосторонній зв'язок у реальному часі). Система обирає Bluetooth або Wi-Fi автоматично залежно від відстані та якості сигналу.
import WatchConnectivity
class PhoneSessionManager: NSObject, WCSessionDelegate {
func activateSession() {
WCSession.default.delegate = self
WCSession.default.activate()
}
func sendWorkoutData(_ data: WorkoutData) {
let dict = ["heartRate": data.heartRate,
"calories": data.calories] as [String: Any]
WCSession.default.transferUserInfo(dict)
}
func session(_: WCSession,
didReceiveUserInfo: [String: Any]) {
DispatchQueue.main.async {
NotificationCenter.default.post(
name: .workoutDataReceived,
object: didReceiveUserInfo)
}
}
}
Interactive Messaging — єдиний механізм WatchConnectivity з гарантованою доставкою в реальному часі. Повідомлення надсилається та отримує відповідь протягом 200–500 мс за умови активного з'єднання. Використовується для дій, що потребують негайної відповіді: запуск тренування, підтвердження платежу, відкриття дверей розумного будинку. Сесія повинна бути активною на обох пристроях — якщо годинник заблоковано або застосунок у фоні, доставка не гарантується.
File Transfer API призначений для великих обсягів даних — зображень, аудіофайлів, експортованих тренувань. Файли передаються у фоні навіть при закритому застосунку. Обмеження — до 10 одночасних передач у черзі. Application Context — найекономніший механізм: передає лише останній стан, скасовуючи попередні невідправлені контексти. Ідеальний для синхронізації налаштувань та поточного статусу.
Wearable Data Layer — API з Google Play Services для синхронізації даних між Android-пристроєм та Wear OS-годинником. Надає три протоколи: DataItem (синхронізація пар ключ-значення), MessageClient (односпрямовані повідомлення) та ChannelClient (потокова передача даних). DataItems синхронізуються автоматично через Google Cloud — якщо телефон недоступний, дані доставляються при відновленні з'єднання.
class WearableSyncService : WearableListenerService() {
override fun onDataChanged(dataEvents: DataEventBuffer) {
dataEvents.forEach { event ->
when (event.type) {
DataEvent.TYPE_CHANGED -> {
val uri = event.dataItem.uri
val path = uri.path // /тренування/пульс
val data = DataMapItem
.fromDataItem(event.dataItem)
.dataMap
val bpm = data.getInt("bpm")
updateUI(bpm)
}
}
}
}
}
MessageClient — надсилає односпрямовані повідомлення з шляхом та байтовим масивом. Використовується для команд: «Запустити тренування», «Призупинити музику». Повідомлення доставляється гарантовано, якщо пристрій підключено. Для отримання повідомлення на Wear OS реалізуйте WearableListenerService та зареєструйте його в маніфесті. MessageClient не підтримує автоматичне кешування — якщо годинник відключено, повідомлення втрачається.
ChannelClient — протокол для потокових даних: аудіо, відео, безперервний потік сенсорів. Відкриває двосторонній канал, по якому передаються байтові масиви. Підтримується лише на Wear OS 2.0+. ChannelClient корисний для передачі аудіо з телефону на годинник для дзвінків через Bluetooth та для ретрансляції даних із зовнішніх Bluetooth-сенсорів (пульсометр, велокомп'ютер) через телефон на годинник.
Автономна робота — здатність companion застосунку виконувати функції без підключення до телефону. На watchOS з Cellular-модулем застосунок надсилає мережеві запити безпосередньо через eSIM. На Wear OS з LTE доступна аналогічна функціональність. Навіть без cellular модуля годинник кешує останні дані з телефону та показує їх при відключенні — користувач бачить актуальну на момент останньої синхронізації інформацію.
| Режим | Дані | Доступність | Приклад |
|---|---|---|---|
| Online | Живі з сервера/телефону | Повна | Маршрут навігації |
| Cached | Останні з телефону | Обмежена | Список контактів |
| Offline | Локальні на годиннику | Мінімальна | Таймер, секундомір |
Кешування даних — ключовий елемент автономної роботи. Застосунок повинен зберігати останній отриманий стан у локальне сховище годинника. На watchOS використовується UserDefaults або CoreData, на Wear OS — Room Database або DataStore. При відновленні з'єднання кеш оновлюється фоновою синхронізацією. Якщо дані застаріли більш ніж на 24 години, застосунок показує заглушку «Оновіть підключення до телефону».
Wearable UI для обмеженого екрану годинник має екран 1.5–2 дюйми — інтерфейс companion застосунку повинен бути максимально лаконічним. Apple рекомендує NavigationView з однією колонкою на watchOS, Google — список карток на Wear OS з помахом для навігації. Кнопки повинні бути розміром не менше 44pt для комфортного дотику. Уникайте текстових полів введення — використовуйте готові відповіді, диктовку або коліщатко Digital Crown.
Energy-efficient дизайн — companion застосунок не повинен розряджати годинник за кілька годин. Використовуйте фонові оновлення з мінімальним інтервалом. На watchOS WatchConnectivity призупиняє передачу при низькому заряді батареї та відновлює після зарядки. На Wear OS Wearable Data Layer автоматично групує дрібні передачі в одну для економії енергії. Wrist raise — оновлюйте UI лише при піднятті зап'ястя користувачем.
Архітектура companion застосунку повинна бути спроєктована з урахуванням можливої втрати зв'язку. Використовуйте патерн Repository: єдине джерело даних на телефоні синхронізується з локальним репозиторієм на годиннику. ViewModel на годиннику підписується на локальний репозиторій та відображає дані незалежно від стану з'єднання. При відновленні зв'язку Repository на годиннику запитує дані через WatchConnectivity або Wearable Data Layer та оновлює локальне сховище.
class WorkoutRepository constructor(
private val localStorage: WorkoutDao,
private val wearableClient: WearableClient
) {
val workoutFlow: Flow<Workout?> = merge(
localStorage.observeWorkout(),
wearableClient.observeWorkout()
.onEach { localStorage.save(it) }
)
}
Тестування companion застосунку потребує перевірки на реальному годиннику або емуляторі. Xcode підтримує симулятор Apple Watch в парі з симулятором iPhone — можна тестувати WatchConnectivity без фізичних пристроїв. Android Studio включає емулятор Wear OS з підтримкою Wearable Data Layer. Критичні тест-кейси: втрата з'єднання під час передачі, низький заряд батареї, одночасна робота двох companion застосунків та встановлення без телефону на standalone-годиннику.
Публікація companion застосунку на watchOS не потребує окремого завантаження в App Store — застосунок входить у бінар iOS-застосунку та автоматично пропонується до встановлення на годинник. На Wear OS companion застосунок публікується окремо в Google Play, але пов'язується з основним застосунком через той самий пакет. App Group на iOS та sharedUserId на Android дозволяють основному та companion застосунку використовувати спільне сховище даних.
Часті запитання
Companion App потребує встановленого основного застосунку на iPhone або Android для повної функціональності. Звичайний standalone-застосунок на годиннику (наприклад, компас або секундомір) працює автономно без телефону. Companion App синхронізує дані з телефоном, відображає сповіщення та дозволяє виконувати швидкі дії, але без телефону втрачає частину функцій.
WatchConnectivity підтримує чотири режими: Application Context для передачі поточного стану зі скасуванням попереднього, File Transfer для файлів будь-якого розміру, User Info для словників даних з гарантованою доставкою та Interactive Messaging для двостороннього зв'язку в реальному часі. Дані передаються по Bluetooth або Wi-Fi — система обирає оптимальний канал автоматично.
Так, companion застосунок працює автономно — watchOS та Wear OS кешують дані, отримані від телефону. На годиннику з стільниковим модулем застосунок надсилає запити безпосередньо через eSIM або LTE. Кешовані дані відображаються навіть за відсутності підключення. При відновленні з'єднання кеш оновлюється фоновою синхронізацією.
Найпопулярніші категорії: фітнес-трекери з синхронізацією тренувань, месенджери для відповіді на повідомлення з годинника, навігатори з підказками поворотів на зап'ясті, музичні плеєри для керування відтворенням, платіжні системи, розумний дім для керування пристроями та медичні монітори для пульсу та тиску.
Apple Watch забезпечує до 18 годин роботи з активним companion застосунком при стандартному використанні. Wear OS — до 24 годин. WatchConnectivity оптимізований для низького енергоспоживання: передача даних призупиняється при низькому заряді батареї, а масова синхронізація виконується під час зарядки годинника.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.