watchOS — سیستم عامل اپل برای Apple Watch است که اولین بار در سال ۲۰۱۵ همراه با اولین ساعتها منتشر شد. توسعه برنامههای watchOS با استفاده از Swift و SwiftUI و WatchKit انجام میشود. ویژگیها: صفحه نمایش مستطیلی کوچک، مصرف انرژی محدود باتری ۰٫۳ واتساعت و یکپارچگی نزدیک با iPhone از طریق بلوتوث. بر اساس دادههای Counterpoint Research، Apple Watch بیش از ۳۰٪ از بازار جهانی ساعتهای هوشمند را در اختیار دارد.
نکات کلیدی
watchOS — سیستم عامل ساعتهای هوشمند اپل است که بر پایه هسته XNU Darwin ساخته شده است. اولین بار در ۲۴ آوریل ۲۰۱۵ همراه با Apple Watch Series 0 منتشر شد. این سیستم بر روی همان معماری iOS ساخته شده اما برای نمایشگر کوچک (۱٫۵ تا ۱٫۹ اینچ)، حافظه محدود (تا ۱ گیگابایت RAM در Series 9) و مصرف انرژی حداقلی بهینهسازی شده است.
بر اساس دادههای StatCounter (۲۰۲۶)، watchOS حدود ۵۵٪ از بازار سیستمهای عامل ساعتهای هوشمند را در اختیار دارد و از Wear OS و سیستمهای اختصاصی تولیدکنندگان چینی پیشی گرفته است. اپل هر سال بهروزرسانیهای اصلی watchOS را منتشر میکند و ساعتها را تا ۵ سال از زمان عرضه پشتیبانی میکند.
ویژگی کلیدی watchOS — وابستگی به iPhone است. بیشتر برنامهها از Watch Connectivity برای همگامسازی دادهها استفاده میکنند. از watchOS 6 به بعد، ساعتها میتوانند برنامهها را مستقیماً از App Store نصب کنند، اما استقلال کامل بدون iPhone فقط از watchOS 9 پشتیبانی میشود.
نسخه اول Watch OS 1.0 از برنامههای شخص ثالث پشتیبانی نمیکرد — فقط برنامههای از پیش نصب شده اپل. watchOS 2 (۲۰۱۵) SDK را برای توسعهدهندگان باز کرد. watchOS 3 (۲۰۱۶) راهاندازی برنامهها را ۷ برابر سریعتر کرد. watchOS 6 (۲۰۱۹) App Store را روی ساعت معرفی کرد. watchOS 9 (۲۰۲۲) داروها و ردیابی پیشرفته خواب را اضافه کرد. watchOS 10 (۲۰۲۳) بزرگترین بهروزرسانی رابط کاربری از زمان عرضه شد.
| نسخه watchOS | سال | نوآوری کلیدی |
|---|---|---|
| Watch OS 1 | ۲۰۱۵ | نسخه اول، فقط برنامههای بومی اپل |
| watchOS 2 | ۲۰۱۵ | SDK باز، برنامههای شخص ثالث، Watch Connectivity |
| watchOS 3 | ۲۰۱۶ | راهاندازی فوری برنامهها، Dock، Scribble |
| watchOS 6 | ۲۰۱۹ | App Store روی ساعت، Cycle Tracking، Noise app |
| watchOS 9 | ۲۰۲۲ | داروها، مراحل خواب، همراه پیشرفته دویدن |
| watchOS 10 | ۲۰۲۳ | Smart Stack، Double Tap، صفحههای جدید ساعت |
معماری watchOS از سه سطح تشکیل شده است که سختافزار را از برنامههای کاربردی جدا میکند. برخلاف iOS، watchOS از رویکرد مؤلفهای استفاده میکند: برنامه از دو هدف تشکیل شده است — extension (افزونه) و میزبان روی iPhone.
سطح پایین — هسته اصلاحشده XNU با درایورهای تراشههای S4/S5/S6/S7/S8/S9 اپل. در Apple Watch Series 9 از S9 SiP با ۵٫۶ میلیارد ترانزیستور و Neural Engine 4 هستهای استفاده شده است. سرویسهای سیستمی شامل Core Bluetooth، Watch Connectivity، HealthKit و Core Motion هستند. تمام وظایف پسزمینه توسط BGTaskScheduler — زمانبند سیستمی که مصرف انرژی را بهینه میکند — مدیریت میشوند.
WatchKit — چارچوبی برای ایجاد رابطهای کاربری برنامههای watchOS. شامل WKInterfaceController، WKInterfaceGroup، WKInterfaceLabel و WKInterfaceButton. از watchOS 6 اپل به جای WatchKit، SwiftUI را توصیه میکند. SwiftUI همان قابلیتها را با نحو declarative و تطبیق خودکار با اندازه صفحه ارائه میدهد: ۳۸ میلیمتر (۲۷۲×۳۴۰)، ۴۲ میلیمتر (۳۱۲×۳۹۰)، ۴۰ میلیمتر (۳۲۴×۳۹۴)، ۴۴ میلیمتر (۳۶۸×۴۴۸)، ۴۵ میلیمتر (۳۹۶×۴۸۴)، ۴۹ میلیمتر (۴۱۰×۵۰۲ در Apple Watch Ultra).
watchOS برای صرفهجویی در باتری، کار پسزمینه برنامهها را محدود میکند. حالتهای پسزمینه موجود: Workout (تمرینات)، HealthKit (پایش سلامت)، Location (موقعیت جغرافیایی)، Audio (پخشکننده صدا) و Complication (دادههای روی صفحه ساعت). هر حالت یک capability جداگانه در entitlements درخواست میکند. مصرف انرژی معمول: برنامه فعال — ۵۰-۸۰ میلیآمپر، حالت پسزمینه — ۵-۱۵ میلیآمپر، آماده به کار — ۱-۳ میلیآمپر.
import BackgroundTasks
import WatchKit
/// برنامهریزی بهروزرسانی داده در پسزمینه در watchOS
class BackgroundTaskManager: NSObject {
func scheduleBackgroundRefresh() {
let request = BGAppRefreshTaskRequest(identifier: "com.example.refresh")
request.earliestBeginDate = Date(timeIntervalSinceNow: 30 * 60)
try? BGTaskScheduler.shared.submit(request)
}
func handleAppRefresh(task: BGAppRefreshTask) {
task.expirationHandler = { task.setTaskCompleted(success: false) }
DataService.shared.fetchData { result in
switch result {
case .success:
ComplicationController.reloadComplications()
task.setTaskCompleted(success: true)
case .failure:
task.setTaskCompleted(success: false)
}
}
}
}
/// ثبت وظیفه پسزمینه در WKExtensionDelegate
class ExtensionDelegate: NSObject, WKExtensionDelegate {
let manager = BackgroundTaskManager()
func handle(_ backgroundTasks: Set<WKBackgroundTask>) {
for task in backgroundTasks {
switch task {
case let refreshTask as BGAppRefreshTask:
manager.handleAppRefresh(task: refreshTask)
default:
task.setTaskCompleted(success: false)
}
}
}
}BGTaskScheduler تضمین میکند که وظایف پسزمینه در لحظات بهینه — زمانی که ساعت روی شارژر و متصل به iPhone است — اجرا شوند. WKExtensionDelegate وظایف پسزمینه ورودی را پردازش میکند و دادههای صفحه ساعت را بهروز میکند. ComplicationController.reloadComplications ویجتهای صفحه ساعت انتخابشده را بهروز میکند.
watchOS 10 — بزرگترین بهروزرسانی رابط کاربری در تاریخ پلتفرم است که در سپتامبر ۲۰۲۳ منتشر شد. سیستم از ناوبری سلسلهمراتبی به ناوبری محتوا‑محور تغییر کرد: صفحه اصلی به Smart Stack — پشته هوشمند ویجتها که جایگزین داک برنامهها شد — تبدیل شد.
Smart Stack — لیست عمودی ویجتهاست که در زیر صفحه ساعت نمایش داده میشود. ویجتها بر اساس زمینه رتبهبندی میشوند: صبح هوا و تقویم، بعدازظهر فعالیت و یادآوریها، عصر مدیتیشن و آمادگی برای خواب نمایش داده میشود. توسعهدهنده میتواند ویجتهای سفارشی را از طریق WidgetKit برای watchOS با استفاده از همان APIهای iOS 17 اضافه کند.
Double Tap — ژست جمع کردن انگشت اشاره و شست است که توسط شتابسنج و ژیروسکوپ بدون لمس صفحه تشخیص داده میشود. در Apple Watch Series 9 و Ultra 2 این ژست در سطح سختافزار از طریق Neural Engine انجام میشود. توسعهدهنده رویداد را از طریق UIDoubleTapGestureRecognizer یا از طریق modifier SwiftUI .onTapGesture(count: 2) دریافت میکند. این ژست نیاز به کالیبراسیون ندارد و در هر جهتی از دست کار میکند.
watchOS 10 معرفی کرد: SwiftUI Animation با پشتیبانی از انیمیشنهای Spring و Keyframe، MapKit برای نمایش نقشهها روی ساعت، VideoPlayer برای پخش ویدیوهای کوتاه (تا ۳۰ ثانیه)، VoiceOver بهبودیافته با ژستها و پارادایم ناوبری جدید NavigationStack به جای NavigationView.
| API | کاربرد | در دسترس از |
|---|---|---|
| WidgetKit for watchOS | ویجتهای Smart Stack | watchOS 10 |
| UIDoubleTapGesture | ژست Double Tap | watchOS 10 (S9+) |
| MapKit | نمایش نقشه روی ساعت | watchOS 10 |
| NavigationStack | پارادایم ناوبری جدید | watchOS 10 |
| SwiftUI Keyframe | انیمیشن فریم به فریم | watchOS 10 |
SwiftUI — چارچوب اصلی برای توسعه رابطهای کاربری watchOS است. اپل SwiftUI را برای همه پروژههای جدید از watchOS 7 توصیه میکند. SwiftUI برای ساعت از همان اصول iOS استفاده میکند اما با modifierها و کامپوننتهای مخصوص watchOS.
SwiftUI برای watchOS شامل: TabView با استایل page برای سوایپ بین صفحهها، DigitalCrownRotation برای پردازش چرخش تاج، SceneStorage برای ذخیره وضعیت بین راهاندازیها، WKNotificationScene برای اعلانهای سفارشی و ComplicationDescriptor برای دادههای صفحه ساعت.
import SwiftUI
import HealthKit
/// برنامه watchOS برای پایش ضربان قلب
@main
struct HeartMonitorApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
WKNotificationScene(
controller: NotificationController.self,
category: "heartAlert"
)
}
}
struct ContentView: View {
@State private var heartRate: Double = 0
private let healthStore = HKHealthStore()
var body: some View {
TabView {
HeartRateView(rate: heartRate)
.tabItem { Label("ضربان قلب", systemImage: "heart.fill") }
StepsView()
.tabItem { Label("گامها", systemImage: "figure.walk") }
SettingsView()
.tabItem { Label("تنظیمات", systemImage: "gear") }
}
.tabViewStyle(.page)
.onAppear(perform: setupHealthKit)
}
private func setupHealthKit() {
guard HKHealthStore.isHealthDataAvailable() else { return }
let heartType = HKQuantityType(.heartRate)
healthStore.requestAuthorization(toShare: nil, read: [heartType]) { success, error in
guard success else { return }
startHeartRateQuery()
}
}
private func startHeartRateQuery() {
let heartType = HKQuantityType(.heartRate)
let query = HKObserverQuery(sampleType: heartType, predicate: nil) { _, _, error in
guard error == nil else { return }
fetchLatestHeartRate()
}
healthStore.execute(query)
}
private func fetchLatestHeartRate() {
let heartType = HKQuantityType(.heartRate)
let sort = NSSortDescriptor(key: HKSampleSortIdentifierStartDate, ascending: false)
let query = HKSampleQuery(sampleType: heartType, predicate: nil,
limit: 1, sortDescriptors: [sort]) { _, samples, _ in
guard let sample = samples?.first as? HKQuantitySample else { return }
let rate = sample.quantity.doubleValue(for: HKUnit(from: "count/min"))
DispatchQueue.main.async { heartRate = rate }
}
healthStore.execute(query)
}
}
struct HeartRateView: View {
let rate: Double
var body: some View {
VStack(spacing: 12) {
Image(systemName: "heart.fill")
.foregroundStyle(.red)
.font(.system(size: 48))
.symbolEffect(.pulse)
Text("\(Int(rate))")
.font(.system(.title, design: .rounded))
.contentTransition(.numericText())
.bold()
Text("ضربان/دقیقه")
.font(.caption)
.foregroundStyle(.secondary)
}
}
}برنامه HeartMonitorApp ساختار معمول یک برنامه watchOS در SwiftUI را نشان میدهد: TabView با استایل page برای سوایپ بین صفحهها، یکپارچگی با HealthKit برای خواندن ضربان قلب در زمان واقعی، WKNotificationScene برای پردازش اعلانها. SymbolEffect با انیمیشن pulse از شتابدهی سختافزاری Neural Engine برای انیمیشن روان بدون مصرف CPU استفاده میکند.
Digital Crown — تاج روی پنل جانبی Apple Watch است. SwiftUI DigitalCrownRotation را برای اتصال مقدار به چرخش تاج ارائه میدهد. modifier یک binding، بازه و گام دریافت میکند. ژستها: tap (لمس)، longPress (فشار طولانی)، swipe (کشیدن) و pan (درگ کردن) — همه استاندارد برای SwiftUI و متناسب با اندازه صفحه ساعت تطبیق داده شدهاند.
WatchKit — چارچوب اصلی watchOS است که از رویکرد UIKit استفاده میکند. اگرچه اپل SwiftUI را توصیه میکند، WatchKit همچنان برای پروژههای قدیمی و وظایف خاص مانند انیمیشنهای پیچیده روی WKInterfaceGroup و یکپارچگی با SiriKit مرتبط است.
برنامه watchOS از دو هدف تشکیل شده است: WatchKit Extension (منطق و رابط کاربری) و iOS Companion App (تنظیمات و همگامسازی). از Xcode 15 به بعد، ایجاد برنامه standalone بدون همراه iOS امکانپذیر است. رابط کاربری در Interface.storyboard (WatchKit) یا به صورت برنامهنویسی از طریق SwiftUI توصیف میشود.
| کامپوننت | WatchKit | SwiftUI |
|---|---|---|
| صفحه | WKInterfaceController | View |
| دکمه | WKInterfaceButton | Button |
| جدول | WKInterfaceTable | List |
| گروه | WKInterfaceGroup | VStack / HStack |
| تصویر | WKInterfaceImage | Image / AsyncImage |
| برچسب | WKInterfaceLabel | Text |
| نقشه | WKInterfaceMap | Map (watchOS 10+) |
| صفحه ساعت | CLKComplicationDataSource | ComplicationDescriptor |
Complication — ویجتی است که دادهها را روی صفحه Apple Watch نمایش میدهد. توسعهدهنده پروتکل CLKComplicationDataSource را پیادهسازی میکند و قالبهایی برای انواع مختلف صفحههای ساعت (circular, rectangular, modular, extraLarge) ارائه میدهد. watchOS 10 از ComplicationDescriptor — API سادهشده برای SwiftUI پشتیبانی میکند. دادهها از طریق Background Tasks با دوره حداکثر ۳۰ دقیقه بهروز میشوند.
Watch Connectivity — چارچوبی برای تبادل داده بین Apple Watch و iPhone از طریق بلوتوث یا Wi-Fi است. تنها روش ارتباط بین دستگاههای جفتشده. WCSession — کلاس مرکزی مدیریت جلسه. برنامه iOS و افزونه watchOS باید WCSessionDelegate را پیادهسازی کنند.
Watch Connectivity چهار روش انتقال داده ارائه میدهد: sendMessage — ارسال فوری با تأیید (فقط زمانی کار میکند که هر دو برنامه فعال باشند)، transferUserInfo — تحویل پسزمینه دیکشنری داده، transferFile — انتقال فایلها با فراداده، updateApplicationContext — همگامسازی وضعیت مشترک. همه روشها تحویل را هنگام برقراری مجدد اتصال تضمین میکنند.
import WatchConnectivity
/// مدیر همگامسازی بین iPhone و Apple Watch
final class ConnectivityManager: NSObject, WCSessionDelegate {
static let shared = ConnectivityManager()
private let session = WCSession.default
override private init() {
super.init()
session.delegate = self
session.activate()
}
// MARK: — ارسال داده از iPhone به ساعت
func sendWorkoutData(_ data: [String: Any]) {
guard session.isReachable else {
// اگر ساعت در دسترس نیست — در زمینه ذخیره میکنیم
try? session.updateApplicationContext(data)
return
}
session.sendMessage(data, replyHandler: nil) { error in
print("Send error: \(error.localizedDescription)")
}
}
// MARK: — دریافت داده روی ساعت
func session(_ session: WCSession,
didReceiveMessage message: [String: Any]) {
DispatchQueue.main.async {
NotificationCenter.default.post(
name: NSNotification.Name("dataReceived"),
object: message
)
}
}
func session(_ session: WCSession,
activationDidCompleteWith activationState: WCSessionActivationState,
error: Error?) {
print("WCSession activated: \(activationState.rawValue)")
}
// در watchOS الزامی نیست، اما برای پروتکل اجباری است
func sessionDidBecomeInactive(_ session: WCSession) {}
func sessionDidDeactivate(_ session: WCSession) {
session.activate()
}
}ConnectivityManager یک singleton برای کار با WCSession پیادهسازی میکند. sendWorkoutData isReachable را بررسی میکند: اگر ساعت فعال باشد، دادهها از طریق sendMessage فوراً ارسال میشوند؛ در غیر این صورت — برای تحویل با تأخیر در applicationContext ذخیره میشوند. onReceiveMessage در سمت گیرنده پیامهای ورودی را پردازش میکند و از طریق NotificationCenter به برنامه اطلاع میدهد.
transferFile امکان انتقال حجم زیادی از دادهها را فراهم میکند: تصاویر، فایلهای صوتی، آرشیوها. حداکثر اندازه فایل — ۱۰۰ مگابایت. فایلها در دایرکتوری Inbox روی دستگاه گیرنده ذخیره میشوند. transferUserInfo برای دادههای JSON تا ۱۰۰ کیلوبایت مناسب است. همه روشها در پسزمینه کار میکنند: اگر دستگاه در دسترس نباشد، انتقال در صف قرار میگیرد و پس از برقراری مجدد اتصال به طور خودکار از سر گرفته میشود.
انتشار برنامه watchOS تابع همان قوانین iOS است: اشتراک Apple Developer Program (۹۹ دلار/سال) و گذراندن نظارت App Review الزامی است. برنامه در App Store Connect به عنوان بخشی از برنامه iOS یا به عنوان برنامه standalone بارگذاری میشود.
برنامه watchOS میتواند به دو صورت عرضه شود: به عنوان افزونه داخلی برنامه iOS (iOS app bundle شامل watchOS .app) یا به عنوان برنامه standalone (بدون iPhone بارگذاری و اجرا میشود). برای حالت standalone WKRunsIndependently = YES در Info.plist الزامی است. اندازه برنامه watchOS برای بارگذاری از طریق شبکه سلولی به ۵۰ مگابایت محدود شده است.
الزامات خاص برای watchOS: برنامه باید بدون iPhone فعال به درستی کار کند (اگر به عنوان standalone اعلام شده باشد)، رابط کاربری باید بدون بزرگنمایی قابل خواندن باشد، همه عناصر تعاملی — حداقل ۴۴ نقطه در اندازه. برنامههایی که عملکرد برنامههای داخلی را تکرار میکنند (مانند ضربانسنج بدون ارزش اضافی) ممنوع هستند.
| الزام | توضیحات |
|---|---|
| اندازه برنامه | تا ۵۰ مگابایت برای بارگذاری سلولی، تا ۴ گیگابایت از طریق Wi-Fi |
| حالت standalone | WKRunsIndependently = YES در Info.plist |
| اهداف لمسی | حداقل ۴۴ pt برای همه عناصر تعاملی |
| امنیت | دادههای HealthKit بدون رضایت قابل ارسال به سرور نیستند |
| عملکرد | راهاندازی برنامه حداکثر ۵ ثانیه |
سوالات متداول
زبان اصلی Swift با چارچوب SwiftUI است. WatchKit روی UIKit نیز پشتیبانی میشود، اما اپل SwiftUI را برای همه پروژههای جدید watchOS توصیه میکند. Objective-C فقط در برنامههای قدیمی منتشر شده قبل از ۲۰۱۹ استفاده میشود. از watchOS 7 تمام نمونههای اپل منحصراً از SwiftUI استفاده میکنند.
از watchOS 6 به بعد، Apple Watch میتواند برنامهها را مستقیماً از App Store بدون iPhone نصب کند. با این حال بسیاری از عملکردها — همگامسازی دادهها، اعلانهای push، موقعیت جغرافیایی — نیاز به جفت شدن با iPhone دارند. برنامههای کاملاً مستقل از watchOS 9 و WKRunsIndependently در تنظیمات ساخت امکانپذیر هستند.
عمر باتری معمول Apple Watch Series 9 — تا ۱۸ ساعت در حالت ترکیبی. با استفاده فعال از برنامه با GPS و ضربانسنج — ۵-۷ ساعت. watchOS 10 مصرف انرژی را از طریق Smart Stack و BGTaskScheduler بهینه میکند و فعالیت پسزمینه برنامهها را تا ۴ برابر در مقایسه با watchOS 9 کاهش میدهد.
چارچوب Watch Connectivity چهار روش ارائه میدهد: sendMessage (ارسال فوری)، transferUserInfo (پسزمینه)، transferFile (فایلها تا ۱۰۰ مگابایت) و updateApplicationContext (همگامسازی وضعیت). همه روشها از طریق بلوتوث یا Wi-Fi با قرار دادن خودکار در صف در هنگام قطع اتصال کار میکنند.
Apple Watch Series 9 و Ultra 2 شامل: شتابسنج، ژیروسکوپ، ضربانسنج نوری و الکتریکی، SpO2 (اشباع اکسیژن)، سنسور دمای مچ، فشارسنج، قطبنما، GPS L1+L5 و میکروفون. دسترسی به سنسورها — از طریق HealthKit و Core Motion. دادههای ضربان قلب و SpO2 نیاز به اجازه صریح کاربر دارند.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.