WatchKit — Apple Watch 프레임워크와 watchOS 설명

저자: IT Sectr 게시일: 2026-06-16 읽는 시간: 8 분

WatchKit은 2014년 watchOS 1과 함께 발표된 Apple Watch용 애플리케이션을 만들기 위한 Apple의 프레임워크입니다. WKInterface UI 요소(버튼, 레이블, 테이블, 지도)와 화면 간 탐색 메커니즘을 제공합니다. 최신 watchOS 개발이 점점 SwiftUI로 전환되고 있지만, WatchKit은 기존 애플리케이션 지원과 인터페이스를 완전히 제어해야 하는 시나리오에서 여전히 중요합니다. Apple Developer Documentation, 2026에 따르면, WatchKit은 watchOS App Store 카탈로그의 35% 앱에서 여전히 사용되며, 피트니스 앱, 내비게이터, 빠른 데이터 접근을 위한 유틸리티 등이 포함됩니다.

핵심 요점

  • WatchKit은 WKInterface UI 구성 요소와 WKInterfaceController 기반 탐색을 사용하여 Apple Watch에서 애플리케이션을 만들기 위한 Apple의 프레임워크입니다.
  • WKInterfaceController는 애플리케이션의 메인 화면 클래스로, iOS의 UIViewController와 유사하게 라이프사이클 관리와 계층 구조를 제공합니다.
  • WCSession은 Apple Watch와 iPhone 간의 통신 메커니즘으로, Bluetooth를 통해 데이터, 파일 및 컨텍스트를 전송할 수 있습니다.
  • WKInterfaceDevice는 화면 크기, 모델, watchOS 버전 및 하드웨어 구성 요소 기능과 같은 장치 정보를 제공합니다.
  • Complications Controller는 CLKComplicationDataSource를 통해 활성화되는, 시계 페이스에 데이터를 표시하기 위한 API입니다.

WatchKit이란 무엇이며 어떻게 작동하나요?

WatchKit은 Apple Watch에서 애플리케이션을 만들기 위한 API를 제공하는 Apple의 프레임워크입니다. watchOS 2(2015)부터 WatchKit 앱은 iPhone이 아닌 시계에서 직접 실행되므로, 전화와의 지속적인 연결 없이 데이터를 처리하고 인터페이스를 표시할 수 있습니다. 그 이전의 watchOS 1에서는 모든 앱이 iPhone에서 실행되었고 시계는 단순한 원격 디스플레이였으며, 이로 인해 UI에 심각한 지연이 발생했습니다.

최신 WatchKit 아키텍처는 WatchKit App(시계의 Storyboard + 리소스)과 WatchKit Extension(시계에서 실행되는 코드)의 두 가지 구성 요소로 구성됩니다. 사용자는 부모 iOS 애플리케이션을 설치할 때 App Store를 통해 두 구성 요소를 모두 설치합니다. WatchKit은 알림(UNUserNotificationCenter 통해), 컴플리케이션(시계 페이스의 데이터), Workout API 및 HealthKit과 같은 시스템 기능과 통합됩니다.

Counterpoint Research(2025)에 따르면, Apple Watch는 글로벌 스마트워치 시장의 52%를 점유하고 있으며, 평균 사용자는 WatchKit 또는 SwiftUI를 사용하는 6~8개의 타사 앱을 설치합니다. 가장 인기 있는 카테고리는 피트니스(56%), 건강(22%), 내비게이션(9%), 유틸리티(8%)입니다.

watchOS용 WatchKit vs SwiftUI

SwiftUI는 watchOS 6부터 watchOS용 인터페이스를 만드는 Apple의 권장 방식입니다. SwiftUI는 선언적 구문과 화면 크기에 대한 자동 적응을 제공합니다. 그러나 WatchKit은 SwiftUI가 등장하기 전에 시작된 프로젝트, 특정 요소(WKInterfaceMap, WKInterfaceMovie) 사용, watchOS 6 미만 버전 지원이 필요한 경우에 계속 중요합니다.

기준WatchKitSwiftUI
Apple 권장레거시최신
최소 watchOSwatchOS 1watchOS 6
코드 양더 많음더 적음
컴플리케이션 통합클래스를 통해 직접WidgetKit을 통해
WKInterfaceMapMap(MapKit)

WatchKit 인터페이스: WKInterfaceController 및 요소

WKInterfaceController는 WatchKit에서 화면을 관리하기 위한 기본 클래스입니다. 초기화(awake(withContext:)), 표시(willActivate), 사라짐(didDeactivate) 및 컨트롤러 간 컨텍스트 전송 등 라이프사이클을 처리합니다. 각 앱 화면은 Interface Builder를 통해 Storyboard에 연결된 별도의 WKInterfaceController 서브클래스로 표시됩니다. 탐색은 계층적(push) 또는 모달(present)일 수 있습니다.

WatchKit은 WKInterface 접두사가 있는 인터페이스 요소 세트를 제공합니다: WKInterfaceLabel(텍스트), WKInterfaceButton(버튼), WKInterfaceTable(테이블), WKInterfaceImage(이미지), WKInterfaceMap(지도), WKInterfaceGroup(모서리가 둥글고 배경이 있는 컨테이너). 모든 요소는 비동기적으로 작동합니다. UI 변경 사항은 대기열에 추가되고 렌더링 주기 사이에 시스템에서 적용되어 시계 화면에서 안정적인 30FPS를 보장합니다.

기본 WKInterfaceController

swift
class MainInterfaceController: WKInterfaceController {
    @IBOutlet weak var titleLabel: WKInterfaceLabel!
    @IBOutlet weak var actionButton: WKInterfaceButton!
    
    override func awake(with context: Any?) {
        super.awake(with: context)
        titleLabel.setText("안녕, Watch!")
    }
    
    override func willActivate() {
        super.willActivate()
        actionButton.setTitle("시작")
    }
    
    @IBAction func didTapButton() {
        pushController(withName: "DetailController", context: nil)
    }
}

WCSession: Watch와 iPhone 간 통신

WCSession은 Bluetooth 또는 Wi-Fi를 통한 Apple Watch와 iPhone 간의 양방향 통신을 위한 중앙 클래스입니다. 세션을 통해 작은 데이터 사전 전송(updateApplicationContext), 즉시 응답 메시지 전송(sendMessage), 파일 전송(transferFile), 복잡한 개체 동기화(transferUserInfo)가 가능합니다. WCSession은 비동기적으로 작동하며 최적의 통신 채널을 자동으로 선택합니다.

WCSession을 사용하려면 두 장치 모두에서 세션을 활성화해야 합니다. Watch 앱은 willActivate() 메서드에서 WCSession을 생성하고, iOS 앱은 AppDelegate 또는 SceneDelegate에서 생성합니다. 활성화 후 장치는 가능한 경우 자동으로 컨텍스트를 동기화합니다. 들어오는 데이터를 수신하고 연결 상태를 모니터링하려면 WCSessionDelegate를 처리하는 것이 중요합니다.

Watch 쪽의 WCSession 예제

swift
class SessionManager: NSObject, WCSessionDelegate {
    private let session = WCSession.default
    
    func activate() {
        session.delegate = self
        session.activate()
    }
    
    func sendDataToPhone(key: String, value: Any) {
        guard session.isReachable else { return }
        session.sendMessage([key: value],
            replyHandler: { response in
                print("Response: \(response)")
            },
            errorHandler: { error in
                print("Error: \(error.localizedDescription)")
            }
        )
    }
    
    func session(_ session: WCSession,
               didReceiveMessage message: [String: Any],
               replyHandler: @escaping ([String: Any]) -> Void) {
        handleIncomingData(message)
        replyHandler(["status": "ok"])
    }
}

Complications: 시계 페이스의 데이터

Complications은 Apple Watch 페이스에 표시되는 작은 데이터 요소로, 앱을 열지 않고도 정보에 빠르게 접근할 수 있게 해줍니다. WatchKit은 CLKComplicationDataSource를 제공합니다. 이는 앱이 컴플리케이션용 데이터를 제공할 수 있도록 하는 프로토콜입니다. 시계 페이스 자체가 원형, 직사각형, 코너 또는 모듈식 중 어떤 위치를 사용할 수 있는지 결정합니다.

개발자는 세 가지 크기 패밀리에 대한 컴플리케이션을 제공할 수 있습니다: CLKComplicationFamily — circularSmall, extraLarge, graphicCircular, graphicRectangular, graphicCorner, graphicBezel, modularSmall, modularLarge 및 utilitarianSmall/Large. 각 패밀리에는 고유한 크기와 표시 형식이 있습니다. 앱은 여러 패밀리를 지원할 수 있지만 최소 두 개(그래픽 및 모듈식)가 권장됩니다.

CLKComplicationDataSource 예제

swift
class ComplicationController: NSObject, CLKComplicationDataSource {
    func getCurrentTimelineEntry(
        for complication: CLKComplication,
        withHandler handler: @escaping (CLKComplicationTimelineEntry?) -> Void
    ) {
        let template = CLKComplicationTemplateModularSmallSimpleText()
        template.textProvider = CLKSimpleTextProvider(text: "96%")
        let entry = CLKComplicationTimelineEntry(
            date: Date(),
            complicationTemplate: template
        )
        handler(entry)
    }
}

Swift로 작성된 WatchKit 앱 예제

WatchKit 앱 만들기는 Xcode에 WatchKit App Target을 추가하는 것으로 시작됩니다. Xcode는 초기 컨트롤러와 함께 Interface.storyboard를 생성하고 자동으로 InterfaceController 클래스에 연결합니다. 개발자는 Interface Builder를 통해 UI 요소를 추가하고 코드 상호 작용을 위한 IBOutlet을 만듭니다. 다음은 WCSession을 통해 iPhone에서 받은 데이터 테이블이 있는 완전한 컨트롤러 예제입니다.

swift
class ItemRowController: NSObject {
    @IBOutlet weak var itemLabel: WKInterfaceLabel!
    
    func configure(with text: String) {
        itemLabel.setText(text)
    }
}

class ListController: WKInterfaceController {
    @IBOutlet weak var itemsTable: WKInterfaceTable!
    private var items: [String] = []
    
    override func awake(with context: Any?) {
        super.awake(with: context)
        items = context as? [String] ?? []
        
        itemsTable.setNumberOfRows(items.count,
            withRowType: "ItemRow")
        for i in 0..if let row = itemsTable
                .rowController(at: i) as? ItemRowController {
                row.configure(with: items[i])
            }
        }
    }
}

피트니스 애플리케이션을 위한 Workout API

Workout API는 Apple Watch에서 백그라운드로 운동을 실행할 수 있는 피트니스 앱을 만들기 위한 WatchKit 클래스 세트입니다. API는 가속도계, 자이로스코프, 심박수 모니터(HKHealthStore 통해) 및 GPS(GPS 지원 Watch 모델)에 대한 접근을 제공합니다. 운동은 HealthKit의 HKWorkoutSession을 통해 시작되며, 심박수 데이터는 HKSampleQuery를 통해 실시간으로 업데이트됩니다.

Workout API의 주요 장점은 백그라운드 작동입니다. 운동이 활성화되면 사용자가 손목을 내려도 watchOS가 앱을 일시 중단하지 않습니다. 센서는 계속 데이터를 수집하고 앱은 심박수, 거리, 페이스 및 기타 측정항목을 표시할 수 있습니다. 운동 종료 후 데이터는 HealthKit을 통해 iPhone의 건강 앱과 동기화되어 사용자에게 통합된 피트니스 프로필을 제공합니다.

센서로 운동 시작하기

swift
class WorkoutManager: NSObject {
    private let healthStore = HKHealthStore()
    private var session: HKWorkoutSession!
    
    func startWorkout(activityType: HKWorkoutActivityType) {
        let config = HKWorkoutConfiguration()
        config.activityType = activityType
        config.locationType = .outdoor
        
        session = try! HKWorkoutSession(
            healthStore: healthStore,
            configuration: config
        )
        session.startActivity(with: Date())
    }
    
    func stopWorkout() {
        session.stopActivity(with: Date())
        session.end()
    }
}

자주 묻는 질문

새 프로젝트에서 WatchKit을 사용해야 하나요?

Apple은 새로운 watchOS 앱에 SwiftUI를 권장합니다. WatchKit은 레거시 프로젝트 지원이나 SwiftUI에서 사용할 수 없는 WKInterfaceMap과 같은 특정 기능이 필요한 경우에만 사용하세요.

연결 없이 Watch에서 iPhone으로 데이터를 전송하려면?

WCSession은 transferUserInfo 및 transferFile을 통한 지연 전송을 지원합니다. 데이터는 시계와 전화 간에 다음 연결이 설정될 때 전달되므로 일시적인 연결 끊김에도 전달이 보장됩니다.

WatchKit 앱이 모든 Apple Watch 모델에서 작동하나요?

WatchKit으로 작성된 앱은 Apple Watch Series 0 이상(watchOS 1+)과 호환됩니다. 그러나 일부 기능(GPS, 심박수 모니터, Dynamic Island)은 특정 모델에서만 사용할 수 있습니다.

같은 앱에서 SwiftUI와 WatchKit을 함께 사용할 수 있나요?

, 하나의 앱에서 SwiftUI와 WatchKit을 결합할 수 있습니다. WKHostingController를 사용하여 WKInterfaceController에 SwiftUI 뷰를 포함시키거나 UIViewRepresentable을 통해 WKInterfaceObjects를 통합하세요.

실제 기기에서 WCSession을 디버깅하려면?

연결된 기기에서 Xcode로 두 앱(iOS + watchOS)을 실행하세요. 디버그 콘솔을 사용하여 WCSessionDelegate 메시지를 모니터링하세요. 두 기기가 Bluetooth 범위(최대 10미터) 내에 있는지 확인하세요.

요약

  • WatchKit은 WKInterface UI 구성 요소와 WKInterfaceController 컨트롤러를 사용하여 Apple Watch에서 앱을 만들기 위한 Apple의 프레임워크입니다.
  • WCSession은 메시지, 파일 및 컨텍스트 지원과 함께 Bluetooth/Wi-Fi를 통한 Watch와 iPhone 간의 양방향 통신을 위한 중앙 메커니즘입니다.
  • Complications은 CLKComplicationDataSource를 통한 Apple Watch 페이스의 데이터로, 9개의 표시 패밀리를 지원합니다.
  • Workout API는 HKWorkoutSession을 통해 심박수, GPS 및 가속도계 데이터를 백그라운드에서 수집하는 피트니스 앱용 클래스 세트입니다.
  • SwiftUI는 새 프로젝트를 위한 Apple의 권장 방식이지만, WatchKit은 레거시 앱 및 특정 기능에 대해 계속 중요합니다.
  • 결합은 WKHostingController와 UIViewRepresentable을 통해 하나의 앱에서 WatchKit과 SwiftUI를 결합할 수 있습니다.

턴키 방식의 모바일 애플리케이션을 개발해 드립니다

IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기