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