Watch App — апликација за носиве уређаје: Apple Watch под управом watchOS и паметни сатови на Wear OS од Google-а. За разлику од мобилних апликација, Watch App је оптимизована за мали екран (дијагонала 1.5–2 инча), кратке сесије интеракције (5–15 секунди) и специфичне сценарије — фитнес, обавештења, брзи одговори, гласовни унос. Развој се врши у SwiftUI за Apple Watch и у Kotlin са Jetpack Compose for Wear OS за Android. Размотрићемо кључне концепте, архитектуру, навигацију и примере кода за обе платформе.
Главно
Watch App — је апликација намењена за рад на носивим уређајима: Apple Watch (watchOS) и паметним сатовима на Wear OS. Главна разлика у односу на мобилну апликацију — фактор форме. Екран сата има дијагоналу 1.5–2 инча (наспрам 6–7 инча код паметног телефона), што ограничава количину истовремено приказаних информација. Интеракција са апликацијом је кратка — корисник проверава време, обавештење, пулс или кораке у року од 5–15 секунди, након чега спушта руку.
Кључни сценарији Watch App: фитнес трацкер (кораци, пулс, калорије, сан), обавештења (поруке, позиви, календар), брзе радње (покретање тајмера, одговор на поруку гласом, управљање музиком), пратилац (даљински за камеру, кључеви од аутомобила, NFC плаћање). Према Counterpoint Research (2026), глобално тржиште паметних сатова премашује 150 милиона уређаја годишње, од чега Apple Watch заузима 35%, Wear OS — 20%, остало — Fitbit, Garmin и други.
Ограничења Watch App: мали екран (до 2 инча), ограничено време рада батерије (до 18–24 сата), недостатак комплетне тастатуре (само гласовни унос или диктирање), лимит за позадинске задатке (watchOS — до 10 минута, Wear OS — до 5 минута), потреба за синхронизацијом са телефоном за већину функција. Почевши од watchOS 6 (2019) и Wear OS 3 (2022) апликације могу да раде аутономно преко LTE модула без упаривања са телефоном.
watchOS — оперативни систем компаније Apple за паметне сатове, заснован на iOS-у и који користи исте фрејмворке (Foundation, UIKit у прилагођеној верзији, SwiftUI). Развој се врши у Xcode-у на Swift-у. Главни UI фрејмворк — SwiftUI, који пружа watchOS-специфичне компоненте: TabView са каруселом, NavigationStack, дигиталну круну (Digital Crown) преко DigitalCrownModifier, мени дугог притиска.
Навигација на watchOS-у се заснива на хијерархијској парадигми. Главни елементи: хијерархијски стек (NavigationStack са аутоматским повратком), модалне презентације (sheet), навигација по страницама (page-based преко TabView са .tabViewStyle(.page)), контекстуални менији при дугом притиску. Digital Crown омогућава скроловање садржаја и промену вредности. Гестови: тап, дуги притисак, превлачење, Force Touch (до watchOS 7), окретање Digital Crown.
Кључни фрејмворци watchOS-а: HealthKit (приступ подацима о здрављу — пулс, кораци, сан, ЕКГ), CoreMotion (акцелерометар, жироскоп), WatchConnectivity (размена података са iPhone-ом), ClockKit (компликације на бројчанику), BackgroundTasks (позадинска ажурирања до 10 минута), ARKit (FaceTime са ефектима на Series 9+). Watch App може бити потпуна (посебна апликација у доку) или проширење (истовремено са iOS верзијом).
Wear OS — Google-ова платформа за паметне сатове, заснована на Android-у. Савремени развој се врши у Kotlin-у са Jetpack Compose for Wear OS — скупом компоненти оптимизованих за округле екране: Scaffold, ScalingLazyColumn, Chip, Button, Card, Stepper. За разлику од мобилног Compose-а, Wear OS користи сопствене модификаторе: scrollable за вертикално скроловање, swipable за превлачење, RotaryInput за управљање круном.
Навигација на Wear OS-у користи бочни панел (SwipeToDismiss) и екране-картице. Главни елементи: SwipeDismissableNavHost (навигација са повратком превлачењем), позиционирање екрана (ScalingLazyColumn за листе), хоризонтални карусел (Carousel), бројчаник (WatchFace преко WatchFaceService). Google препоручује коришћење бочног превлачења за повратак и вертикалног скроловања за листе. Дугме за напајање на сату отвара листу недавних апликација.
Здравље и сензори на Wear OS-у: Health Services API (кораци, пулс, калорије, сан, SpO2 преко добављача података), SensorManager (акцелерометар, жироскоп, барометар, магнетометар), Location Services (GPS преко FusedLocationProvider). Wear OS 5+ подржава праћење трчања, ходања, вожње бицикла и пливања са аутоматским одређивањем типа активности. Подаци се синхронизују са Google Fit-ом преко Health Connect-а.
Размотримо апликацију за праћење пулса на Apple Watch-у коришћењем SwiftUI и HealthKit-а.
import SwiftUI
import HealthKit
// Модел података за пулс
struct HeartRateData: Identifiable {
let id = UUID()
let bpm: Double
let date: Date
}
// ViewModel за HealthKit
@Observable
final class HealthViewModel {
private let healthStore = HKHealthStore()
var currentHeartRate: Double = 0
var isAuthorized: Bool = false
func requestAuthorization() {
guard let heartRateType = HKQuantityType.quantityType(forIdentifier: .heartRate)
else { return }
let types = Set([heartRateType])
healthStore.requestAuthorization(toShare: nil, read: types) { success, _ in
Task { @MainActor in
self.isAuthorized = success
if success { self.startHeartRateQuery() }
}
}
}
func startHeartRateQuery() {
guard let heartRateType = HKQuantityType.quantityType(forIdentifier: .heartRate)
else { return }
let query = HKObserverQuery(
sampleType: heartRateType, predicate: nil
) { [weak self] _, _, _ in
self?.fetchLatestHeartRate()
}
healthStore.execute(query)
}
private func fetchLatestHeartRate() {
guard let heartRateType = HKQuantityType.quantityType(forIdentifier: .heartRate)
else { return }
let sort = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)
let query = HKSampleQuery(
sampleType: heartRateType, predicate: nil,
limit: 1, sortDescriptors: [sort]
) { _, samples, _ in
guard let sample = samples?.first as? HKQuantitySample else { return }
let bpm = sample.quantity.doubleValue(for: HKUnit.count().unitDivided(by: .minute()))
Task { @MainActor in
self.currentHeartRate = bpm
}
}
healthStore.execute(query)
}
}
// Главни екран
struct HeartRateView: View {
@State private var viewModel = HealthViewModel()
var body: some View {
VStack {
Image(systemName: "heart.fill")
.foregroundColor(.red)
.font(.largeTitle)
Text("\(Int(viewModel.currentHeartRate))")
.font(.system(size: 60, weight: .bold, design: .rounded))
.foregroundColor(.red)
Text("BPM")
.font(.caption)
.foregroundColor(.secondary)
}
.padding()
.onAppear(perform: viewModel.requestAuthorization)
}
}
Кључне тачке: HKHealthStore захтева приступ HealthKit подацима; HKObserverQuery обавештава о променама пулса у реалном времену; HKSampleQuery добија последњу вредност. Watch App аутоматски ажурира UI при промени currentHeartRate захваљујући @Observable. HealthKit обрађује податке локално на уређају — захтеви ка серверу нису потребни.
Аналогна апликација за Wear OS у Kotlin-у са Jetpack Compose и Health Services API.
// MainActivity.kt
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.compose.foundation.layout.*
import androidx.wear.compose.material.*
import androidx.wear.compose.foundation.arc.BasicArcParams
import com.google.android.horologist.health.HealthService
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
WearAppTheme {
HeartRateScreen()
}
}
}
}
@Composable
fun HeartRateScreen() {
var heartRate by remember { mutableIntStateOf(0) }
var isConnected by remember { mutableStateOf(false) }
LaunchedEffect(Unit) {
// HealthService — API за приступ сензорима
val healthService = HealthService()
healthService.connect().onSuccess {
isConnected = true
}
}
Scaffold(
timeText = { TimeText() },
vignette = { Vignette(vignettePosition = VignettePosition.TopAndBottom) }
) {
Column(
modifier = Modifier
.fillMaxSize()
.scrollable(state = ScrollState),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.Center
) {
Icon(
imageVector = Icons.Filled.Favorite,
contentDescription = "Пулс",
modifier = Modifier.size(40.dp),
tint = MaterialTheme.colors.error
)
Text(
text = heartRate.toString(),
style = MaterialTheme.typography.display1
)
Text(
text = "BPM",
style = MaterialTheme.typography.caption2
)
}
}
}
Кључне компоненте Wear OS: Scaffold са TimeText и Vignette за типични изглед; .scrollable() модификатор за компатибилност са округлим екраном; HealthService (Horologist) за приступ сензорима пулса. Jetpack Compose for Wear OS аутоматски прилагођава интерфејс округлим и квадратним екранима — програмер не мора ручно да обрађује различите факторе форме.
Често постављана питања
Watch App има ограничен екран (дијагонала 1.5–2 инча), ради на батерији малог капацитета и користи управљање гестовима. Интеракција је кратка — 5–15 секунди, апликација мора бити максимално концизна и приказивати 1–2 кључна показатеља.
За Apple Watch — Swift са фрејмворцима SwiftUI и WatchKit. За Wear OS — Kotlin са Jetpack Compose for Wear OS. Обе платформе подржавају декларативни приступ изради интерфејса.
Да, почевши од Apple Watch Series 3 са LTE и watchOS 6+ апликација може да ради аутономно преко App Store на сату. Wear OS такође подржава LTE верзије са аутономним радом преко Google Play на сату.
Главна ограничења: величина екрана (до 2 инча), ограничено време рада батерије (до 18 сати), недостатак комплетног прегледача и тастатуре, лимит за позадинске задатке (watchOS — до 10 минута, Wear OS — до 5 минута).
На Apple Watch-у се користи HealthKit (HKHealthStore, HKSampleQuery) за пулс, кораке, сан и CoreMotion за акцелерометар. На Wear OS-у — Health Services API (преко Horologist-а) за метрике здравља и SensorManager за сирове податке сензора.
Закључци
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође