Watch Appはウェアラブルデバイス向けアプリケーションです:watchOSを搭載したApple WatchとGoogleのWear OSを搭載したスマートウォッチ。モバイルアプリとは異なり、Watch Appは小型画面(1.5~2インチ対角)、短い操作セッション(5~15秒)、特定のシナリオ(フィットネス、通知、クイック返信、音声入力)に最適化されています。開発はApple WatchにはSwiftUI、Android向けには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年)によると、世界のスマートウォッチ市場は年間1億5000万台を超え、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はスマートウォッチ向けAppleのオペレーティングシステムで、iOSをベースにして同じフレームワーク(Foundation、UIKitの適応版、SwiftUI)を使用しています。開発はXcodeでSwiftを使って行われます。メインのUIフレームワークはSwiftUIで、watchOS固有のコンポーネント(カルーセル付きTabView、NavigationStack、DigitalCrownModifierによるデジタルクラウン、長押しメニュー)を提供します。
watchOSのナビゲーションは階層的パラダイムに基づいています。主な要素:階層スタック(自動戻り付きNavigationStack)、モーダル表示(sheet)、ページベースのナビゲーション(.tabViewStyle(.page)付きTabView経由)、長押しのコンテキストメニュー。デジタルクラウンはコンテンツのスクロールと値の変更を可能にします。ジェスチャー:タップ、長押し、スワイプ、Force Touch(watchOS 7まで)、デジタルクラウンの回転。
watchOSの主要フレームワーク:HealthKit(健康データへのアクセス — 心拍数、歩数、睡眠、ECG)、CoreMotion(加速度計、ジャイロスコープ)、WatchConnectivity(iPhoneとのデータ交換)、ClockKit(文字盤のコンプリケーション)、BackgroundTasks(最大10分のバックグラウンド更新)、ARKit(Series 9+のFaceTimeエフェクト)。Watch Appはフル機能(ドック内の独立したアプリ)または拡張機能(iOS版と同時)のいずれかになります。
Wear OSはAndroidをベースにしたGoogleのスマートウォッチ向けプラットフォームです。最新の開発はJetpack Compose for Wear OSを備えたKotlinで行われます — 丸型画面に最適化されたコンポーネント群:Scaffold、ScalingLazyColumn、Chip、Button、Card、Stepper。モバイルComposeとは異なり、Wear OSは独自のモディファイア(垂直スクロール用のscrollable、スワイプ用のswipable、クラウン制御用のRotaryInput)を使用します。
Wear OSのナビゲーションはサイドパネル(SwipeToDismiss)とカード画面を使用します。主な要素:SwipeDismissableNavHost(スワイプバックによるナビゲーション)、画面配置(リスト用のScalingLazyColumn)、水平カルーセル(Carousel)、文字盤(WatchFaceService経由のWatchFace)。Googleは戻る操作にサイドスワイプ、リストに垂直スクロールを推奨しています。時計の電源ボタンは最近のアプリ一覧を開きます。
Wear OSの健康とセンサー:Health Services API(データプロバイダー経由の歩数、心拍数、カロリー、睡眠、SpO2)、SensorManager(加速度計、ジャイロスコープ、気圧計、磁力計)、Location Services(FusedLocationProvider経由のGPS)。Wear OS 5+は自動アクティビティ種別検出によるランニング、ウォーキング、サイクリング、水泳のトラッキングをサポートしています。データはHealth Connectを介してGoogle Fitと同期されます。
SwiftUIとHealthKitを使用したApple Watch向け心拍数トラッキングアプリを見てみましょう。
import SwiftUI
import HealthKit
// 心拍数データモデル
struct HeartRateData: Identifiable {
let id = UUID()
let bpm: Double
let date: Date
}
// HealthKit用ViewModel
@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はデバイス上でローカルにデータを処理するため、サーバーリクエストは不要です。
Jetpack ComposeとHealth Services APIを備えたKotlinによるWear OS向けの同様のアプリです。
// 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の主要コンポーネント:標準レイアウト用のTimeTextとVignetteを備えたScaffold、丸型画面対応の.scrollable()モディファイア、心拍数センサーアクセス用のHealthService(Horologist)。Jetpack Compose for Wear OSは丸型および角型画面に自動的にインターフェースを適応させるため、開発者が異なるフォームファクターを手動で処理する必要はありません。
よくある質問
Watch Appは画面が限られており(対角1.5~2インチ)、小型バッテリーで動作し、ジェスチャーコントロールを使用します。操作は短く — 5~15秒、アプリは可能な限り簡潔で、1~2つの主要指標を表示する必要があります。
Apple Watch向けはSwiftUIおよびWatchKitフレームワークを備えたSwiftです。Wear OS向けはJetpack Compose for Wear OSを備えたKotlinです。両プラットフォームとも宣言的なアプローチでインターフェースを構築します。
はい、LTE搭載のApple Watch Series 3とwatchOS 6+以降、アプリは時計のApp Storeを通じて自律的に動作できます。Wear OSも時計のGoogle Playを通じてスタンドアロン動作のLTEバージョンをサポートしています。
主な制限:画面サイズ(最大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アプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。