컴패니언 앱 — Apple Watch 및 Wear OS 웨어러블 기기용 컴패니언 애플리케이션으로, 스마트폰의 기본 애플리케이션과 함께 작동합니다. 컴패니언 앱은 WatchConnectivity(iOS) 또는 Wearable Data Layer(Android)를 통해 데이터를 동기화하고, 시계에 알림을 표시하며, 자율적으로 기능을 수행할 수 있습니다. 개발은 watchOS용 Swift와 Wear OS용 Kotlin으로 이루어집니다. 자세한 내용은 WatchConnectivity Docs를 참조하세요.
주요 내용
컴패니언 앱 — Apple Watch 또는 Wear OS 웨어러블 기기용 애플리케이션으로, 기본 iOS 또는 Android 앱과 함께 제공됩니다. 주요 목표는 손목으로 기능을 확장하는 것입니다: 빠른 정보 보기, 메시지 응답, 음악 제어, 운동 추적. 개발자가 빌드에 포함시킨 경우 휴대폰에 기본 앱을 설치할 때 컴패니언 앱이 시계에 자동으로 설치됩니다.
아키텍처 컴패니언 앱은 두 가지 구성 요소로 구성됩니다: iOS/Android 앱(기본)과 watchOS/Wear OS 앱(컴패니언). 이들 간의 통신은 시스템 API를 통해 이루어집니다: Apple용 WatchConnectivity와 Google용 Wearable Data Layer. 데이터는 Bluetooth 또는 Wi-Fi를 통해 백그라운드에서 전송되며, 사용자는 동기화 프로세스를 볼 수 없습니다. 시계의 앱은 모바일과 다른, 작은 화면에 적응된 자체 UI를 가질 수 있습니다.
컴패니언 앱의 유형은 휴대폰에 대한 의존도에 따라 다릅니다. 미러링 앱은 휴대폰 데이터의 복사본을 표시하며 연결 없이는 작동하지 않습니다. 분리형 앱은 자체 로직을 가지고 데이터를 캐시하며 휴대폰에서 연결이 끊어져도 일부 기능을 유지합니다. 독립형 앱(watchOS 6+ 및 Wear OS 3+)은 휴대폰 없이 설치할 수 있으며 자체 네트워크 액세스로 완전히 자율적으로 작동합니다.
WatchConnectivity — iPhone과 Apple Watch 간 양방향 통신을 위한 Apple의 프레임워크. 4가지 데이터 전송 메커니즘을 제공합니다: Application Context(마지막으로 알려진 상태), File Transfer(모든 크기의 파일), User Info(전송 보장 사전), Interactive Messaging(실시간 양방향 통신). 시스템은 거리와 신호 품질에 따라 자동으로 Bluetooth 또는 Wi-Fi를 선택합니다.
import WatchConnectivity
class PhoneSessionManager: NSObject, WCSessionDelegate {
func activateSession() {
WCSession.default.delegate = self
WCSession.default.activate()
}
func sendWorkoutData(_ data: WorkoutData) {
let dict = ["heartRate": data.heartRate,
"calories": data.calories] as [String: Any]
WCSession.default.transferUserInfo(dict)
}
func session(_: WCSession,
didReceiveUserInfo: [String: Any]) {
DispatchQueue.main.async {
NotificationCenter.default.post(
name: .workoutDataReceived,
object: didReceiveUserInfo)
}
}
}
Interactive Messaging — 실시간 전송이 보장된 유일한 WatchConnectivity 메커니즘. 연결이 활성화된 경우 메시지가 전송되고 200~500ms 내에 응답을 받습니다. 즉각적인 응답이 필요한 작업에 사용됩니다: 운동 시작, 결제 확인, 스마트 홈 도어 열기. 세션은 두 기기 모두에서 활성화되어야 합니다 — 시계가 잠겨 있거나 앱이 백그라운드에 있는 경우 전송이 보장되지 않습니다.
File Transfer API는 대량의 데이터(이미지, 오디오 파일, 내보낸 운동)를 위해 설계되었습니다. 앱이 종료되어도 파일은 백그라운드에서 전송됩니다. 제한은 대기열에서 최대 10개의 동시 전송입니다. Application Context는 가장 경제적인 메커니즘입니다: 마지막 상태만 전송하고 이전의 전송되지 않은 컨텍스트를 취소합니다. 설정 및 현재 상태 동기화에 이상적입니다.
Wearable Data Layer — Android 기기와 Wear OS 시계 간 데이터 동기화를 위한 Google Play Services의 API. 3가지 프로토콜을 제공합니다: DataItem(키-값 쌍 동기화), MessageClient(단방향 메시지), ChannelClient(스트리밍 데이터). DataItem은 Google Cloud를 통해 자동으로 동기화됩니다 — 휴대폰을 사용할 수 없는 경우 연결이 복원되면 데이터가 전송됩니다.
class WearableSyncService : WearableListenerService() {
override fun onDataChanged(dataEvents: DataEventBuffer) {
dataEvents.forEach { event ->
when (event.type) {
DataEvent.TYPE_CHANGED -> {
val uri = event.dataItem.uri
val path = uri.path // /workout/heartrate
val data = DataMapItem
.fromDataItem(event.dataItem)
.dataMap
val bpm = data.getInt("bpm")
updateUI(bpm)
}
}
}
}
}
MessageClient — 경로와 바이트 배열로 단방향 메시지를 전송합니다. "운동 시작" 또는 "음악 일시 중지"와 같은 명령에 사용됩니다. 기기가 연결되어 있으면 메시지가 안정적으로 전송됩니다. Wear OS에서 메시지를 수신하려면 WearableListenerService를 구현하고 매니페스트에 등록하세요. MessageClient는 자동 캐싱을 지원하지 않습니다 — 시계가 연결 해제되면 메시지가 손실됩니다.
ChannelClient — 스트리밍 데이터(오디오, 비디오, 연속 센서 스트림)를 위한 프로토콜입니다. 바이트 배열이 전송되는 양방향 채널을 엽니다. Wear OS 2.0+에서만 지원됩니다. ChannelClient는 Bluetooth를 통한 통화를 위해 휴대폰에서 시계로 오디오를 전송하고 외부 Bluetooth 센서(심박수 모니터, 자전거 컴퓨터)의 데이터를 휴대폰을 통해 시계로 중계하는 데 유용합니다.
자율 작동 — 컴패니언 앱이 휴대폰 연결 없이 기능할 수 있는 능력. Cellular 모듈이 있는 watchOS에서는 앱이 eSIM을 통해 직접 네트워크 요청을 보냅니다. LTE가 있는 Wear OS에서도 유사한 기능을 사용할 수 있습니다. 셀룰러 모듈이 없어도 시계는 휴대폰에서 최신 데이터를 캐시하고 연결이 끊어졌을 때 표시합니다 — 사용자는 마지막 동기화 시점의 정보를 봅니다.
| 모드 | 데이터 | 가용성 | 예시 |
|---|---|---|---|
| 온라인 | 서버/휴대폰에서 실시간 | 전체 | 내비게이션 경로 |
| 캐시됨 | 휴대폰에서 최신 | 제한됨 | 연락처 목록 |
| 오프라인 | 시계에 로컬 | 최소 | 타이머, 스톱워치 |
데이터 캐싱 — 자율 작동의 핵심 요소입니다. 앱은 마지막으로 수신한 상태를 시계의 로컬 저장소에 저장해야 합니다. watchOS에서는 UserDefaults 또는 CoreData가 사용되고, Wear OS에서는 Room Database 또는 DataStore가 사용됩니다. 연결이 복원되면 백그라운드 동기화를 통해 캐시가 업데이트됩니다. 데이터가 24시간 이상 지난 경우 앱은 "휴대폰 연결 업데이트" 메시지를 표시합니다.
제한된 화면을 위한 웨어러블 UI — 시계 화면은 1.5~2인치로, 컴패니언 앱 인터페이스는 가능한 한 간결해야 합니다. Apple은 watchOS에서 단일 열 NavigationView를 권장하고, Google은 Wear OS에서 스와이프 탐색이 있는 카드 목록을 권장합니다. 버튼은 편안한 터치를 위해 최소 44pt 이상이어야 합니다. 텍스트 입력 필드는 피하고 미리 정의된 답변, 받아쓰기 또는 Digital Crown 스크롤 휠을 사용하세요.
에너지 효율적인 디자인 — 컴패니언 앱이 몇 시간 안에 시계 배터리를 소모해서는 안 됩니다. 최소 간격으로 백그라운드 업데이트를 사용하세요. watchOS에서 WatchConnectivity는 배터리가 부족하면 전송을 일시 중지하고 충전 후 재개합니다. Wear OS에서 Wearable Data Layer는 에너지 절약을 위해 작은 전송을 자동으로 하나로 그룹화합니다. 손목 올리기 — 사용자가 손목을 들 때만 UI를 업데이트하세요.
컴패니언 앱 아키텍처는 잠재적인 연결 끊김을 고려하여 설계되어야 합니다. Repository 패턴을 사용하세요: 휴대폰의 단일 데이터 소스가 시계의 로컬 리포지토리와 동기화됩니다. 시계의 ViewModel은 로컬 리포지토리를 구독하고 연결 상태에 관계없이 데이터를 표시합니다. 연결이 복원되면 시계의 Repository가 WatchConnectivity 또는 Wearable Data Layer를 통해 데이터를 요청하고 로컬 저장소를 업데이트합니다.
class WorkoutRepository constructor(
private val localStorage: WorkoutDao,
private val wearableClient: WearableClient
) {
val workoutFlow: Flow<Workout?> = merge(
localStorage.observeWorkout(),
wearableClient.observeWorkout()
.onEach { localStorage.save(it) }
)
}
테스트 컴패니언 앱 테스트는 실제 시계 또는 에뮬레이터에서 검증이 필요합니다. Xcode는 iPhone 시뮬레이터와 페어링된 Apple Watch 시뮬레이터를 지원하므로 물리적 기기 없이 WatchConnectivity를 테스트할 수 있습니다. Android Studio에는 Wearable Data Layer를 지원하는 Wear OS 에뮬레이터가 포함되어 있습니다. 중요한 테스트 케이스: 전송 중 연결 끊김, 배터리 부족, 두 컴패니언 앱의 동시 작동, 독립형 시계에서 휴대폰 없이 설치.
컴패니언 앱 게시 watchOS에서는 App Store에 별도로 업로드할 필요가 없습니다 — 앱이 iOS 앱 바이너리에 포함되어 시계에 자동으로 설치 제안됩니다. Wear OS에서는 컴패니언 앱이 Google Play에 별도로 게시되지만 동일한 패키지를 통해 기본 앱과 연결됩니다. iOS의 App Group과 Android의 sharedUserId를 통해 기본 앱과 컴패니언 앱이 공유 데이터 저장소를 사용할 수 있습니다.
자주 묻는 질문
컴패니언 앱은 완전한 기능을 위해 iPhone 또는 Android에 기본 앱이 설치되어 있어야 합니다. 일반 독립형 시계 앱(예: 나침반 또는 스톱워치)은 휴대폰 없이 자율적으로 작동합니다. 컴패니언 앱은 휴대폰과 데이터를 동기화하고, 알림을 표시하고, 빠른 작업을 수행할 수 있지만 휴대폰 없이는 일부 기능을 잃습니다.
WatchConnectivity는 4가지 모드를 지원합니다: 이전 상태를 취소하고 현재 상태를 전송하는 Application Context, 모든 크기의 파일을 위한 File Transfer, 전송이 보장된 데이터 사전을 위한 User Info, 실시간 양방향 통신을 위한 Interactive Messaging. 데이터는 Bluetooth 또는 Wi-Fi를 통해 전송되며 시스템이 자동으로 최적의 채널을 선택합니다.
네, 컴패니언 앱은 자율적으로 작동합니다 — watchOS와 Wear OS는 휴대폰에서 받은 데이터를 캐시합니다. 셀룰러 모듈이 있는 시계에서는 앱이 eSIM 또는 LTE를 통해 직접 요청을 보냅니다. 캐시된 데이터는 연결 없이도 표시됩니다. 연결이 복원되면 백그라운드 동기화를 통해 캐시가 업데이트됩니다.
가장 인기 있는 카테고리: 운동 동기화가 있는 피트니스 트래커, 시계에서 메시지에 응답하는 메신저, 손목에 경로 안내를 표시하는 내비게이터, 재생 제어를 위한 뮤직 플레이어, 결제 시스템, 기기 제어를 위한 스마트 홈, 심박수와 혈압을 위한 의료 모니터입니다.
Apple Watch는 표준 사용 시 활성 컴패니언 앱으로 최대 18시간 작동을 제공합니다. Wear OS는 최대 24시간입니다. WatchConnectivity는 저전력 소비에 최적화되어 있습니다: 배터리가 부족하면 데이터 전송이 일시 중지되고 시계 충전 중에 대량 동기화가 수행됩니다.
요약
턴키 방식의 모바일 애플리케이션을 개발해 드립니다
IT Sectr는 2017년부터 스타트업과 기업을 위한 iOS 및 Android 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.