Watch App — برنامهای برای دستگاههای پوشیدنی: Apple Watch با watchOS و ساعتهای هوشمند Wear OS از گوگل. برخلاف برنامههای موبایل، Watch App برای صفحه نمایش کوچک (قطر 1.5–2 اینچ)، جلسات کوتاه تعامل (5–15 ثانیه) و سناریوهای خاص — تناسب اندام، اعلانها، پاسخهای سریع، ورودی صوتی بهینهسازی شده است. توسعه با SwiftUI برای Apple Watch و با Kotlin و Jetpack Compose for Wear OS برای اندروید انجام میشود. مفاهیم کلیدی، معماری، ناوبری و نمونه کدها را برای هر دو پلتفرم بررسی میکنیم.
نکات اصلی
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 — سیستم عامل اپل برای ساعتهای هوشمند، مبتنی بر iOS و استفاده از همان فریمورکها (Foundation، UIKit در نسخه تطبیق یافته، SwiftUI). توسعه در Xcode به زبان Swift انجام میشود. فریمورک اصلی UI — SwiftUI، که کامپوننتهای خاص watchOS را فراهم میکند: TabView با carousel، 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 — پلتفرم گوگل برای ساعتهای هوشمند، مبتنی بر اندروید. توسعه مدرن به زبان Kotlin با Jetpack Compose for Wear OS انجام میشود — مجموعه کامپوننتهای بهینهسازی شده برای صفحههای گرد: Scaffold، ScalingLazyColumn، Chip، Button، Card، Stepper. برخلاف Compose موبایل، Wear OS از اصلاحکنندههای خود استفاده میکند: scrollable برای اسکرول عمودی، swipable برای کشیدن، RotaryInput برای کنترل چرخدنده.
ناوبری در Wear OS از پنل جانبی (SwipeToDismiss) و صفحههای کارتی استفاده میکند. عناصر اصلی: SwipeDismissableNavHost (ناوبری با بازگشت با کشیدن)، موقعیتیابی صفحهها (ScalingLazyColumn برای لیستها)، carousel افقی (Carousel)، صفحه ساعت (WatchFace از طریق WatchFaceService). گوگل استفاده از کشیدن جانبی برای بازگشت و اسکرول عمودی برای لیستها را توصیه میکند. دکمه پاور روی ساعت لیست آخرین برنامهها را باز میکند.
سلامت و حسگرها در Wear OS: Health Services API (قدمها، ضربان قلب، کالری، خواب، SpO2 از طریق ارائهدهندگان داده)، SensorManager (شتابسنج، ژیروسکوپ، فشارسنج، مغناطیسسنج)، Location Services (GPS از طریق FusedLocationProvider). Wear OS 5+ ردیابی دویدن، پیادهروی، دوچرخهسواری و شنا را با تشخیص خودکار نوع فعالیت پشتیبانی میکند. دادهها از طریق Health Connect با Google Fit همگامسازی میشوند.
برنامه ردیابی ضربان قلب در 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 به لطف @Observable هنگام تغییر currentHeartRate UI را به طور خودکار بهروز میکند. 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 از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید