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 // /workout/heartrate
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 года. Мы проконсультируем вас и предложим наилучшее решение.