Watch App — en applikation för bärbara enheter: Apple Watch med watchOS och smartklockor på Wear OS från Google. Till skillnad från mobilappar är Watch App optimerad för liten skärm (diagonal 1,5–2 tum), korta interaktionssessioner (5–15 sekunder) och specifika scenarier — fitness, aviseringar, snabba svar, röstinmatning. Utveckling sker i SwiftUI för Apple Watch och i Kotlin med Jetpack Compose for Wear OS för Android. Vi går igenom nyckelbegrepp, arkitektur, navigering och kodexempel för båda plattformarna.
Viktigaste punkterna
Watch App — är en applikation designad för att fungera på bärbara enheter: Apple Watch (watchOS) och smartklockor på Wear OS. Huvudskillnaden från en mobilapp — formfaktorn. Klockans skärm har en diagonal på 1,5–2 tum (jämfört med 6–7 tum på en smartphone), vilket begränsar mängden information som visas samtidigt. Interaktionen med appen är kort — användaren kollar tid, avisering, puls eller steg inom 5–15 sekunder och sänker sedan armen.
Nyckelscenarier för Watch App: fitnesstracker (steg, puls, kalorier, sömn), aviseringar (meddelanden, samtal, kalender), snabba åtgärder (starta timer, röstsvar på meddelande, styra musik), följeslagare (fjärrkontroll för kamera, bilnycklar, NFC-betalning). Enligt Counterpoint Research (2026) överstiger den globala smartklocksmarknaden 150 miljoner enheter per år, varav Apple Watch står för 35%, Wear OS — 20%, resten — Fitbit, Garmin och andra.
Begränsningar för Watch App: liten skärm (upp till 2 tum), begränsad batteritid (upp till 18–24 timmar), inget fullständigt tangentbord (endast röstinmatning eller diktering), gräns för bakgrundsuppgifter (watchOS — upp till 10 minuter, Wear OS — upp till 5 minuter), behov av synkronisering med telefon för de flesta funktioner. Från watchOS 6 (2019) och Wear OS 3 (2022) kan appar fungera autonomt via LTE-modul utan parkoppling med telefon.
watchOS — Apples operativsystem för smartklockor, baserat på iOS och använder samma ramverk (Foundation, UIKit i anpassad version, SwiftUI). Utveckling sker i Xcode i Swift. Huvud-UI-ramverket — SwiftUI, som tillhandahåller watchOS-specifika komponenter: TabView med karusell, NavigationStack, digital krona (Digital Crown) via DigitalCrownModifier, långtryckningsmeny.
Navigering på watchOS bygger på hierarkiskt paradigm. Huvudelement: hierarkisk stack (NavigationStack med automatisk återgång), modal presentation (sheet), sidbaserad navigering (page-based via TabView med .tabViewStyle(.page)), snabbmenyer vid lång tryckning. Digital Crown möjliggör rullning av innehåll och ändring av värden. Gester: tryck, lång tryckning, svepning, Force Touch (fram till watchOS 7), rotation av Digital Crown.
Nyckelramverk för watchOS: HealthKit (åtkomst till hälsodata — puls, steg, sömn, EKG), CoreMotion (accelerometer, gyroskop), WatchConnectivity (datautbyte med iPhone), ClockKit (komplikationer på urtavlan), BackgroundTasks (bakgrundsuppdateringar upp till 10 minuter), ARKit (FaceTime med effekter på Series 9+). Watch App kan vara fullständig (separat app i dockan) eller tillägg (samtidigt med iOS-versionen).
Wear OS — Googles plattform för smartklockor, baserad på Android. Modern utveckling sker i Kotlin med Jetpack Compose for Wear OS — en uppsättning komponenter optimerade för runda skärmar: Scaffold, ScalingLazyColumn, Chip, Button, Card, Stepper. Till skillnad från mobil Compose använder Wear OS egna modifierare: scrollable för vertikal rullning, swipable för svepning, RotaryInput för kontroll av kronan.
Navigering på Wear OS använder sidopanel (SwipeToDismiss) och skärmkort. Huvudelement: SwipeDismissableNavHost (navigering med återgång genom svepning), positionering av skärmar (ScalingLazyColumn för listor), horisontell karusell (Carousel), urtavla (WatchFace via WatchFaceService). Google rekommenderar att använda sidosvepning för återgång och vertikal rullning för listor. Strömknappen på klockan öppnar listan över senaste appar.
Hälsa och sensorer på Wear OS: Health Services API (steg, puls, kalorier, sömn, SpO2 via dataleverantörer), SensorManager (accelerometer, gyroskop, barometer, magnetometer), Location Services (GPS via FusedLocationProvider). Wear OS 5+ stödjer spårning av löpning, promenad, cykling och simning med automatisk upptäckt av aktivitetstyp. Data synkroniseras med Google Fit via Health Connect.
Låt oss titta på en app för pulsspårning på Apple Watch med SwiftUI och HealthKit.
import SwiftUI
import HealthKit
// Datamodell för puls
struct HeartRateData: Identifiable {
let id = UUID()
let bpm: Double
let date: Date
}
// ViewModel för 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)
}
}
// Huvudskärm
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)
}
}
Nyckelpunkter: HKHealthStore begär åtkomst till HealthKit-data; HKObserverQuery meddelar om förändringar i puls i realtid; HKSampleQuery hämtar det senaste värdet. Watch App uppdaterar automatiskt UI när currentHeartRate ändras tack vare @Observable. HealthKit behandlar data lokalt på enheten — serverförfrågningar krävs inte.
// 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 för åtkomst till sensorer
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 = "Puls",
modifier = Modifier.size(40.dp),
tint = MaterialTheme.colors.error
)
Text(
text = heartRate.toString(),
style = MaterialTheme.typography.display1
)
Text(
text = "BPM",
style = MaterialTheme.typography.caption2
)
}
}
}
Nyckelkomponenter för Wear OS: Scaffold med TimeText och Vignette för typisk layout; .scrollable() modifierare för kompatibilitet med rund skärm; HealthService (Horologist) för åtkomst till pulssensorer. Jetpack Compose for Wear OS anpassar automatiskt gränssnittet för runda och fyrkantiga skärmar — utvecklaren behöver inte hantera olika formfaktorer manuellt.
Vanliga frågor
Watch App har begränsad skärm (diagonal 1,5–2 tum), arbetar på batteri med liten kapacitet och använder geststyrning. Interaktionen är kort — 5–15 sekunder, appen måste vara maximalt koncis och visa 1–2 nyckelindikatorer.
För Apple Watch — Swift med ramverken SwiftUI och WatchKit. För Wear OS — Kotlin med Jetpack Compose for Wear OS. Båda plattformarna stödjer ett deklarativt tillvägagångssätt för att bygga gränssnitt.
Ja, från Apple Watch Series 3 med LTE och watchOS 6+ kan appen fungera autonomt via App Store på klockan. Wear OS stödjer också LTE-versioner med autonom drift via Google Play på klockan.
Huvudsakliga begränsningar: skärmstorlek (upp till 2 tum), begränsad batteritid (upp till 18 timmar), ingen fullständig webbläsare och tangentbord, gräns för bakgrundsuppgifter (watchOS — upp till 10 minuter, Wear OS — upp till 5 minuter).
På Apple Watch används HealthKit (HKHealthStore, HKSampleQuery) för puls, steg, sömn och CoreMotion för accelerometer. På Wear OS — Health Services API (via Horologist) för hälso mätvärden och SensorManager för råa sensordata.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också