watchOS는 Apple Watch용 Apple의 운영 체제로, 2015년 첫 Apple Watch와 함께 처음 출시되었습니다. watchOS 앱 개발은 SwiftUI와 WatchKit을 사용하여 Swift로 이루어집니다. 특징: 작은 직사각형 화면, 0.3Wh의 제한된 배터리 소모, Bluetooth를 통한 iPhone과의 긴밀한 통합.Counterpoint Research에 따르면, Apple Watch는 전 세계 스마트워치 시장의 30% 이상을 차지하고 있습니다.
핵심 요점
watchOS는 Apple의 스마트워치용 운영 체제로, Darwin XNU 커널을 기반으로 합니다. 2015년 4월 24일 Apple Watch Series 0과 함께 처음 출시되었습니다. 시스템은 iOS와 동일한 아키텍처로 구축되었지만, 작은 디스플레이(1.5~1.9인치), 제한된 메모리(Series 9에서 최대 1GB RAM), 최소 전력 소비에 최적화되어 있습니다.
StatCounter(2026)에 따르면, watchOS는 스마트워치 운영 체제 시장의 약 55%를 차지하며 Wear OS와 중국 제조업체의 독점 시스템을 앞서고 있습니다. Apple은 매년 주요 watchOS 업데이트를 출시하며, 출시 후 최대 5년까지 시계를 지원합니다.
watchOS의 주요 특징은 iPhone에 대한 의존성입니다. 대부분의 앱은 데이터 동기화에 Watch Connectivity를 사용합니다. watchOS 6부터 시계는 App Store에서 직접 앱을 설치할 수 있지만, iPhone으로부터의 완전한 독립성은 watchOS 9에서만 지원됩니다.
첫 번째 버전인 Watch OS 1.0은 타사 앱을 지원하지 않았으며 사전 설치된 Apple 앱만 있었습니다. watchOS 2(2015)는 개발자에게 SDK를 공개했습니다. watchOS 3(2016)는 앱 실행 속도를 7배 향상시켰습니다. watchOS 6(2019)는 시계에 App Store를 도입했습니다. watchOS 9(2022)는 약물 관리와 개선된 수면 추적을 추가했습니다. watchOS 10(2023)은 출시 이후 가장 큰 인터페이스 업데이트가 되었습니다.
| watchOS 버전 | 연도 | 주요 혁신 |
|---|---|---|
| Watch OS 1 | 2015 | 첫 번째 버전, Apple 네이티브 앱만 지원 |
| watchOS 2 | 2015 | 오픈 SDK, 타사 앱, Watch Connectivity |
| watchOS 3 | 2016 | 즉시 앱 실행, Dock, Scribble |
| watchOS 6 | 2019 | 시계의 App Store, Cycle Tracking, Noise 앱 |
| watchOS 9 | 2022 | 약물, 수면 단계, 개선된 러닝 컴패니언 |
| watchOS 10 | 2023 | Smart Stack, Double Tap, 새로운 워치 페이스 |
watchOS 아키텍처는 하드웨어를 사용자 애플리케이션으로부터 격리하는 세 개의 계층으로 구성됩니다. iOS와 달리, watchOS는 컴포넌트 기반 접근 방식을 사용합니다: 앱은 확장 프로그램과 iPhone 호스트의 두 가지 대상으로 구성됩니다.
최하위 계층은 Apple의 S4/S5/S6/S7/S8/S9 칩용 드라이버가 포함된 수정된 XNU 커널입니다. Apple Watch Series 9는 56억 개의 트랜지스터와 4코어 Neural Engine을 갖춘 S9 SiP를 사용합니다. 시스템 서비스에는 Core Bluetooth, Watch Connectivity, HealthKit 및 Core Motion이 포함됩니다. 모든 백그라운드 작업은 전력 소비를 최적화하는 시스템 스케줄러인 BGTaskScheduler를 통해 관리됩니다.
WatchKit은 watchOS 앱 인터페이스를 만들기 위한 프레임워크입니다. WKInterfaceController, WKInterfaceGroup, WKInterfaceLabel 및 WKInterfaceButton이 포함됩니다. watchOS 6부터 Apple은 WatchKit 대신 SwiftUI를 권장합니다. SwiftUI는 동일한 기능을 제공하지만 선언적 구문과 화면 크기 자동 적응 기능을 갖추고 있습니다: 38mm(272×340), 42mm(312×390), 40mm(324×394), 44mm(368×448), 45mm(396×484), 49mm(Apple Watch Ultra에서 410×502).
watchOS는 배터리 절약을 위해 앱의 백그라운드 활동을 제한합니다. 사용 가능한 백그라운드 모드: Workout(운동), HealthKit(건강 모니터링), Location(위치), Audio(오디오 플레이어), Complication(워치 페이스 데이터). 각 모드는 entitlements에서 별도의 capability가 필요합니다. 일반적인 전력 소비: 활성 앱 — 50-80mA, 백그라운드 모드 — 5-15mA, 대기 — 1-3mA.
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 — 플랫폼 역사상 가장 큰 인터페이스 업데이트로, 2023년 9월에 출시되었습니다. 시스템은 계층적 탐색에서 콘텐츠 중심 탐색으로 전환되었으며, 메인 화면은 앱 독을 대체한 지능형 위젯 스택인 Smart Stack이 되었습니다.
Smart Stack은 워치 페이스 아래에 표시되는 위젯의 세로 목록입니다. 위젯은 컨텍스트에 따라 순위가 매겨집니다: 아침에는 날씨와 캘린더, 낮에는 활동 및 알림, 저녁에는 명상 및 수면 준비를 표시합니다. 개발자는 iOS 17과 동일한 API를 사용하여 WidgetKit for watchOS를 통해 사용자 정의 위젯을 추가할 수 있습니다.
Double Tap은 검지와 엄지를 모으는 제스처로, 화면을 건드리지 않고 가속도계와 자이로스코프로 인식됩니다. Apple Watch Series 9 및 Ultra 2에서는 Neural Engine을 통해 하드웨어 수준에서 처리됩니다. 개발자는 UIDoubleTapGestureRecognizer 또는 SwiftUI 수정자 .onTapGesture(count: 2)를 통해 이벤트를 수신합니다. 이 제스처는 보정이 필요 없으며 모든 손 방향에서 작동합니다.
watchOS 10은 다음을 도입했습니다: Spring 및 Keyframe 애니메이션을 지원하는 SwiftUI Animation, 시계에서 지도를 표시하는 MapKit, 짧은 비디오(최대 30초)를 재생하는 VideoPlayer, 제스처가 개선된 VoiceOver, NavigationView를 대체하는 새로운 탐색 패러다임 NavigationStack.
| 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 인터페이스 개발을 위한 기본 프레임워크입니다. Apple은 watchOS 7부터 모든 새 프로젝트에 SwiftUI를 권장합니다. 시계용 SwiftUI는 iOS와 동일한 원칙을 사용하지만 watchOS 특정 수정자 및 구성 요소가 있습니다.
watchOS용 SwiftUI에는 다음이 포함됩니다: 화면 간 스와이프를 위한 페이지 스타일의 TabView, 크라운 회전 처리를 위한 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("bpm")
.font(.caption)
.foregroundStyle(.secondary)
}
}
}HeartMonitorApp은 SwiftUI의 일반적인 watchOS 앱 구조를 보여줍니다: 화면 간 스와이프를 위한 페이지 스타일의 TabView, 실시간 심박수 읽기를 위한 HealthKit 통합, 알림 처리를 위한 WKNotificationScene. 펄스 애니메이션이 있는 SymbolEffect는 CPU 부하 없이 부드러운 애니메이션을 위해 Neural Engine 하드웨어 가속을 사용합니다.
Digital Crown은 Apple Watch 측면의 휠입니다. SwiftUI는 크라운 회전에 값을 바인딩하는 DigitalCrownRotation을 제공합니다. 수정자는 바인딩, 범위 및 단계를 허용합니다. 제스처: tap(탭), longPress(길게 누르기), swipe(스와이프), pan(드래그) — 모두 SwiftUI 표준이며 시계 화면 크기에 적응되어 있습니다.
WatchKit은 UIKit 접근 방식을 사용하는 원래의 watchOS 프레임워크입니다. Apple은 SwiftUI를 권장하지만, WatchKit은 레거시 프로젝트와 특정 작업(WKInterfaceGroup의 복잡한 애니메이션 및 SiriKit 통합)에 여전히 유효합니다.
watchOS 앱은 두 가지 대상으로 구성됩니다: WatchKit Extension(로직 및 인터페이스)과 iOS Companion App(설정 및 동기화). Xcode 15부터 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 |
컴플리케이션은 Apple Watch 페이스에 데이터를 표시하는 위젯입니다. 개발자는 CLKComplicationDataSource 프로토콜을 구현하여 다양한 워치 페이스 유형(circular, rectangular, modular, extraLarge)에 대한 템플릿을 제공합니다. watchOS 10은 SwiftUI용 단순화된 API인 ComplicationDescriptor를 지원합니다. 데이터는 최대 30분 주기의 백그라운드 작업을 통해 업데이트됩니다.
Watch Connectivity는 Bluetooth 또는 Wi-Fi를 통해 Apple Watch와 iPhone 간에 데이터를 교환하기 위한 프레임워크입니다. 페어링된 장치 간의 유일한 통신 방법입니다. 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("전송 오류: \(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 활성화됨: \(activationState.rawValue)")
}
// watchOS에서는 필요하지 않지만 프로토콜에는 필수
func sessionDidBecomeInactive(_ session: WCSession) {}
func sessionDidDeactivate(_ session: WCSession) {
session.activate()
}
}ConnectivityManager는 WCSession 작업을 위한 싱글톤을 구현합니다. sendWorkoutData는 isReachable을 확인합니다: 시계가 활성화된 경우 sendMessage를 통해 즉시 데이터가 전송되고, 그렇지 않은 경우 지연 전달을 위해 applicationContext에 저장됩니다. 수신 측의 onReceiveMessage는 수신 메시지를 처리하고 NotificationCenter를 통해 앱에 알립니다.
transferFile은 대용량 데이터(이미지, 오디오 파일, 아카이브)를 전송할 수 있습니다. 최대 파일 크기는 100MB입니다. 파일은 수신 장치의 Inbox 디렉토리에 저장됩니다. transferUserInfo는 최대 100KB의 JSON 데이터에 적합합니다. 모든 방법은 백그라운드에서 작동합니다: 장치를 사용할 수 없는 경우 전송이 대기열에 추가되고 연결이 복원될 때 자동으로 재개됩니다.
watchOS 앱 게시는 iOS와 동일한 규칙을 따릅니다: Apple Developer Program 구독(연간 $99) 및 App Review 심사 통과가 필요합니다. 앱은 iOS 앱의 일부로 또는 독립 실행형 앱으로 App Store Connect에 업로드됩니다.
watchOS 앱은 두 가지 방법으로 배포할 수 있습니다: iOS 앱 확장 프로그램으로(iOS 앱 번들에 watchOS .app 포함) 또는 독립 실행형 앱으로(iPhone 없이 다운로드 및 실행). 독립 실행형 모드에는 Info.plist에 WKRunsIndependently = YES가 필요합니다. watchOS 앱 크기는 셀룰러 다운로드의 경우 50MB로 제한됩니다.
watchOS의 특별 요구 사항: 앱은 활성 iPhone 없이도 올바르게 작동해야 하며(독립 실행형으로 주장하는 경우), 인터페이스는 확대 없이 읽을 수 있어야 하며, 모든 대화형 요소는 최소 44포인트 크기여야 합니다. 내장 기능을 복제하는 앱(예: 부가 가치가 없는 심박수 모니터)은 금지됩니다.
| 요구 사항 | 설명 |
|---|---|
| 앱 크기 | 셀룰러 다운로드 최대 50MB, Wi-Fi 최대 4GB |
| 독립 실행형 모드 | Info.plist에서 WKRunsIndependently = YES |
| 터치 대상 | 모든 대화형 요소 최소 44pt |
| 보안 | HealthKit 데이터는 동의 없이 서버로 전송 불가 |
| 성능 | 앱 실행 5초 이내 |
자주 묻는 질문
주요 언어는 SwiftUI 프레임워크를 사용하는 Swift입니다. UIKit의 WatchKit도 지원되지만, Apple은 모든 새로운 watchOS 프로젝트에 SwiftUI를 권장합니다. Objective-C는 2019년 이전에 출시된 레거시 앱에서만 사용됩니다. watchOS 7부터 모든 Apple 예제는 독점적으로 SwiftUI를 사용합니다.
watchOS 6부터 Apple Watch는 iPhone 없이 App Store에서 직접 앱을 설치할 수 있습니다. 그러나 많은 기능(데이터 동기화, 푸시 알림, 위치 정보)은 iPhone과의 페어링이 필요합니다. 완전히 독립 실행형 앱은 watchOS 9와 빌드 설정의 WKRunsIndependently로 가능합니다.
Apple Watch Series 9의 일반적인 배터리 수명은 혼합 모드에서 최대 18시간입니다. GPS와 심박수 모니터를 활성 상태로 사용할 경우 — 5-7시간. watchOS 10은 Smart Stack과 BGTaskScheduler를 통해 전력 소비를 최적화하여 watchOS 9 대비 백그라운드 앱 활동을 최대 4배까지 줄입니다.
Watch Connectivity 프레임워크는 네 가지 방법을 제공합니다: sendMessage(즉시 전송), transferUserInfo(백그라운드), transferFile(최대 100MB 파일), updateApplicationContext(상태 동기화). 모든 방법은 Bluetooth 또는 Wi-Fi를 통해 작동하며 연결이 끊어지면 자동으로 대기열에 추가됩니다.
Apple Watch Series 9 및 Ultra 2에는 다음이 포함됩니다: 가속도계, 자이로스코프, 광학 및 전기 심박수 센서, SpO2(산소 포화도), 손목 온도 센서, 기압계, 나침반, GPS L1+L5, 마이크. 센서 액세스는 HealthKit 및 Core Motion을 통해 이루어집니다. 심박수 및 SpO2 데이터는 사용자의 명시적 허가가 필요합니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.