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 // /vežbanje/otkucaji_srca
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. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође