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 ms при активна връзка. Използва се за действия, изискващи незабавен отговор: стартиране на тренировка, потвърждение на плащане, отваряне на врата на умния дом. Сесията трябва да е активна и на двете устройства — ако часовникът е заключен или приложението е на заден план, доставката не се гарантира.
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 е налична подобна функционалност. Дори без клетъчен модул часовникът кешира последните данни от телефона и ги показва при изключване — потребителят вижда информация, актуална към момента на последната синхронизация.
| Режим | Данни | Наличност | Пример |
|---|---|---|---|
| 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.
Енергийно ефективен дизайн — 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също