WatchKitは、2014年にwatchOS 1とともに発表された、Apple Watch向けアプリケーションを作成するためのAppleのフレームワークです。WKInterfaceのUI要素(ボタン、ラベル、テーブル、マップ)と画面間のナビゲーションメカニズムを提供します。最新のwatchOS開発はますますSwiftUIに移行していますが、WatchKitは既存のアプリケーションのサポートやインターフェースを完全に制御する必要があるシナリオにおいて引き続き重要です。Apple Developer Documentation, 2026によると、WatchKitはwatchOS App Storeカタログの35%のアプリで依然として使用されており、フィットネスアプリ、ナビゲーター、データへのクイックアクセスのためのユーティリティが含まれています。
重要なポイント
WatchKitは、Apple Watch上でアプリケーションを作成するためのAPIを提供するAppleのフレームワークです。watchOS 2(2015年)以降、WatchKitアプリはiPhoneではなく時計上で直接実行されるため、電話との常時接続なしでデータを処理し、インターフェースを表示できます。それ以前のwatchOS 1では、すべてのアプリがiPhone上で実行され、時計は単なるリモートディスプレイであり、UIに大きな遅延が生じていました。
最新のWatchKitアーキテクチャには、WatchKit App(時計上のStoryboard+リソース)とWatchKit Extension(時計上で実行されるコード)の2つのコンポーネントが含まれています。ユーザーは親のiOSアプリケーションをインストールする際に、App Storeを通じて両方のコンポーネントをインストールします。WatchKitは、通知(UNUserNotificationCenter経由)、コンプリケーション(文字盤のデータ)、Workout API、HealthKitなどのシステム機能と統合されています。
Counterpoint Research(2025年)によると、Apple Watchは世界のスマートウォッチ市場の52%を占めており、平均的なユーザーはWatchKitまたはSwiftUIを使用する6~8個のサードパーティアプリをインストールしています。最も人気のあるカテゴリは、フィットネス(56%)、健康(22%)、ナビゲーション(9%)、ユーティリティ(8%)です。
SwiftUIは、watchOS 6以降のwatchOS向けインターフェースを作成するためのApple推奨の方法です。SwiftUIは宣言型構文と画面サイズへの自動適応を提供します。ただし、WatchKitはSwiftUIが登場する前に開始されたプロジェクト、特定の要素(WKInterfaceMap、WKInterfaceMovie)を使用する場合、およびwatchOS 6未満のバージョンのサポートが必要な場合において、引き続き重要性を保っています。
| 基準 | WatchKit | SwiftUI |
|---|---|---|
| Appleの推奨 | レガシー | 現行 |
| 最小watchOS | watchOS 1 | watchOS 6 |
| コード量 | 多い | 少ない |
| コンプリケーション統合 | クラス経由で直接 | WidgetKit経由 |
| WKInterfaceMap | あり | Map(MapKit) |
WKInterfaceControllerは、WatchKitで画面を管理するための基本クラスです。初期化(awake(withContext:))、表示(willActivate)、非表示(didDeactivate)、およびコントローラー間のコンテキスト転送など、ライフサイクルを処理します。アプリケーションの各画面は、Interface Builderを介してStoryboardに接続された個別のWKInterfaceControllerサブクラスで表されます。ナビゲーションは階層型(push)またはモーダル(present)にすることができます。
WatchKitは、WKInterfaceプレフィックスを持つインターフェース要素のセットを提供します:WKInterfaceLabel(テキスト)、WKInterfaceButton(ボタン)、WKInterfaceTable(テーブル)、WKInterfaceImage(画像)、WKInterfaceMap(マップ)、WKInterfaceGroup(角丸と背景を持つコンテナ)。すべての要素は非同期で動作します。UIの変更はキューに入れられ、レンダリングサイクル間でシステムによって適用され、時計画面で安定した30 FPSを保証します。
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は、BluetoothまたはWi-Fiを介したApple WatchとiPhone間の双方向通信のための中心的なクラスです。セッションでは、小さなデータ辞書の転送(updateApplicationContext)、即時応答付きメッセージの送信(sendMessage)、ファイルの転送(transferFile)、複雑なオブジェクトの同期(transferUserInfo)が可能です。WCSessionは非同期で動作し、最適な通信チャネルを自動的に選択します。
WCSessionを使用するには、両方のデバイスでセッションをアクティベートする必要があります。WatchアプリはwillActivate()メソッドでWCSessionを作成し、iOSアプリはAppDelegateまたはSceneDelegateで作成します。アクティベート後、デバイスは可能な場合に自動的にコンテキストを同期します。着信データを受信し、接続状態を監視するには、WCSessionDelegateを処理することが重要です。
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"])
}
}
コンプリケーションは、Apple Watchの文字盤に表示される小さなデータ要素で、アプリを開かずに情報に素早くアクセスできます。WatchKitはCLKComplicationDataSourceを提供します。これは、アプリがコンプリケーション用のデータを提供するためのプロトコルです。文字盤自体が、円形、長方形、角、モジュラーのどの位置が利用可能かを決定します。
開発者は3つのサイズファミリー用にコンプリケーションを提供できます:CLKComplicationFamily — circularSmall、extraLarge、graphicCircular、graphicRectangular、graphicCorner、graphicBezel、modularSmall、modularLarge、utilitarianSmall/Large。各ファミリーには独自の寸法と表示形式があります。アプリは複数のファミリーをサポートできますが、最低2つ(グラフィックとモジュラー)が推奨されます。
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)
}
}
WatchKitアプリの作成は、XcodeにWatchKit App Targetを追加することから始まります。XcodeはInterface.storyboardを初期コントローラーとともに生成し、自動的にInterfaceControllerクラスにリンクします。開発者はInterface Builderを介してUI要素を追加し、コードから操作するためのIBOutletを作成します。以下は、WCSessionを介してiPhoneから受信したデータのテーブルを持つ完全なコントローラーの例です。
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は、Apple Watch上でバックグラウンドでワークアウトを実行できるフィットネスアプリを作成するためのWatchKitクラスのセットです。APIは、加速度計、ジャイロスコープ、心拍数モニター(HKHealthStore経由)、GPS(GPS対応Watchモデル)などのセンサーへのアクセスを提供します。ワークアウトはHealthKitのHKWorkoutSessionを介して開始され、心拍数データはHKSampleQueryを通じてリアルタイムで更新されます。
Workout APIの主な利点はバックグラウンド動作です。ワークアウトがアクティブな場合、ユーザーが手首を下げてもwatchOSはアプリを一時停止しません。センサーはデータ収集を継続し、アプリは心拍数、距離、ペースなどのメトリクスを表示できます。ワークアウト終了後、データはHealthKitを介してiPhoneのヘルスケアアプリと同期され、ユーザーに統一されたフィットネスプロファイルを提供します。
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()
}
}
よくある質問
Appleは新しいwatchOSアプリにはSwiftUIを推奨しています。WatchKitは、レガシープロジェクトのサポートや、SwiftUIで利用できないWKInterfaceMapなどの特定の機能が必要な場合にのみ使用してください。
WCSessionは、transferUserInfoおよびtransferFileを介した遅延転送をサポートしています。データは、時計と電話の間に次回接続が確立されたときに配信されるため、一時的な接続断があっても配信が保証されます。
WatchKitで書かれたアプリは、Apple Watch Series 0以降(watchOS 1+)と互換性があります。ただし、一部の機能(GPS、心拍数モニター、Dynamic Island)は特定のモデルでのみ利用可能です。
はい、1つのアプリでSwiftUIとWatchKitを組み合わせることができます。WKHostingControllerを使用してWKInterfaceControllerにSwiftUIビューを埋め込むか、UIViewRepresentableを介してWKInterfaceObjectsを統合します。
接続されたデバイスでXcodeから両方のアプリ(iOS + watchOS)を実行します。デバッグコンソールを使用してWCSessionDelegateメッセージを監視します。両方のデバイスがBluetooth範囲内(最大10メートル)にあることを確認してください。
まとめ
ターンキー方式のモバイルアプリケーションを開発します
IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。