RORK LABEN
TOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しましたTOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しました
記事一覧/開発ツール
開発ツール/2026-03-26中級

Rork Max で Apple Watch アプリを開発する — watchOS コンパニオンアプリ構築ガイド

Rork Max を使って Apple Watch(watchOS)コンパニオンアプリを構築する方法を解説。SwiftUI による WatchKit 開発、iPhone 連携、HealthKit 統合、コンプリケーション実装までステップバイステップで学べます。

Rork Max229Apple Watch3watchOS2SwiftUI63WatchKitHealthKit5コンパニオンアプリ

取り組みの背景

Apple Watch は世界で最も普及しているスマートウォッチであり、ヘルスケア・フィットネス・通知管理など日常的に使われるウェアラブルデバイスです。しかし、従来の watchOS アプリ開発は Xcode のセットアップ、WatchKit Extension の構成、iPhone アプリとの通信設計など、初中級者にとってハードルの高い作業が多く存在しました。

Rork Max を使えば、AI の力を借りて SwiftUI ベースの Apple Watch コンパニオンアプリを効率的に構築できます。ここではRork Max での watchOS アプリ開発の基本から、iPhone アプリとの連携、HealthKit データの活用、そしてコンプリケーション(文字盤ウィジェット)の実装までを順を追って解説します。

この記事の対象読者:

  • Rork でアプリ開発の基礎を学んだ方
  • Apple Watch 向けにアプリを拡張したい方
  • ウェアラブルデバイス対応で差別化を図りたい個人開発者

Rork Max の基本的な使い方については、Rork Max ネイティブ Swift 完全ガイドで詳しく解説していますので、あわせてご覧ください。

watchOS アプリの基本構造を理解する

Apple Watch アプリは、大きく分けて2つのアーキテクチャで構成されます。

独立型アプリ(Independent App): Apple Watch 単体で動作するアプリです。iPhone がなくても基本機能が使えます。watchOS 6 以降で対応しており、App Store for Apple Watch から直接ダウンロードできます。

コンパニオンアプリ(Companion App): iPhone アプリと連携して動作する Watch アプリです。データの同期やリモート操作など、双方向の通信が特徴です。多くの商用アプリがこの形式を採用しています。

Rork Max ではどちらの形式にも対応していますが、ここでは最も実用性の高い「iPhone アプリ + Watch コンパニオンアプリ」の構成を解説します。

watchOS プロジェクトのディレクトリ構成

Rork Max で watchOS ターゲットを追加すると、以下のような構成が自動生成されます。

MyApp/
├── MyApp/                    # iPhone アプリ本体
│   ├── ContentView.swift
│   └── MyAppApp.swift
├── MyAppWatch/               # Watch アプリ
│   ├── MyAppWatchApp.swift   # Watch アプリのエントリポイント
│   ├── ContentView.swift     # Watch のメイン画面
│   ├── ComplicationController.swift
│   └── Assets.xcassets
└── Shared/                   # iPhone・Watch 共通コード
    ├── Models/
    └── Services/

この構造を理解しておくと、Rork Max に対する指示がより的確になり、生成されるコードの質も向上します。

Rork Max で watchOS プロジェクトを作成する

ステップ1: プロジェクトの初期化

Rork Max でプロジェクトを新規作成し、watchOS ターゲットを含める指示を出します。

// Rork Max プロンプト例:
// 「iPhoneアプリとApple Watch コンパニオンアプリを持つプロジェクトを作成してください。
//   Watch側にはタスクリスト表示と完了トグル機能を実装してください。」
 
// 生成される Watch アプリのエントリポイント
import SwiftUI
 
@main
struct MyAppWatchApp: App {
    var body: some Scene {
        WindowGroup {
            TaskListView()
        }
    }
}

ステップ2: Watch 用 UI を SwiftUI で構築する

watchOS の UI は SwiftUI をベースに構築します。画面サイズが小さいため、情報の優先順位付けが重要です。

// TaskListView.swift — Watch 側のタスク一覧画面
import SwiftUI
 
struct TaskListView: View {
    @StateObject private var viewModel = TaskViewModel()
 
    var body: some View {
        NavigationStack {
            List {
                ForEach(viewModel.tasks) { task in
                    TaskRow(task: task) {
                        viewModel.toggleComplete(task)
                    }
                }
            }
            .navigationTitle("タスク")
        }
        .onAppear {
            viewModel.fetchTasks()
        }
    }
}
 
struct TaskRow: View {
    let task: TaskItem
    let onToggle: () -> Void
 
    var body: some View {
        Button(action: onToggle) {
            HStack {
                Image(systemName: task.isCompleted
                    ? "checkmark.circle.fill"
                    : "circle")
                    .foregroundColor(task.isCompleted ? .green : .gray)
                Text(task.title)
                    .strikethrough(task.isCompleted)
                    .lineLimit(2)
            }
        }
    }
}
 
// 期待される出力:
// Apple Watch 上にタスク一覧が表示され、
// タップで完了/未完了を切り替えられるリストが表示される

Watch UI を設計する際のポイントは、タップターゲットを十分な大きさに保つことと、一画面に表示する情報量を絞ることです。

iPhone と Apple Watch のデータ連携を実装する

コンパニオンアプリの最大の魅力は、iPhone との双方向データ同期です。Apple は WCSession(Watch Connectivity)フレームワークを提供しており、これを使ってリアルタイムのメッセージ交換やバックグラウンドでのデータ転送が可能です。

WCSession によるリアルタイム通信

// Shared/Services/WatchConnectivityManager.swift
import WatchConnectivity
 
class WatchConnectivityManager: NSObject, ObservableObject, WCSessionDelegate {
    static let shared = WatchConnectivityManager()
    @Published var receivedTasks: [TaskItem] = []
 
    private override init() {
        super.init()
        if WCSession.isSupported() {
            let session = WCSession.default
            session.delegate = self
            session.activate()
        }
    }
 
    // iPhone → Watch へタスクを送信
    func sendTasks(_ tasks: [TaskItem]) {
        guard WCSession.default.isReachable else { return }
 
        let data = tasks.map { [
            "id": $0.id.uuidString,
            "title": $0.title,
            "isCompleted": $0.isCompleted
        ] as [String: Any] }
 
        WCSession.default.sendMessage(
            ["tasks": data],
            replyHandler: nil
        ) { error in
            print("送信エラー: \(error.localizedDescription)")
        }
    }
 
    // 受信ハンドラ
    func session(
        _ session: WCSession,
        didReceiveMessage message: [String: Any]
    ) {
        if let tasksData = message["tasks"] as? [[String: Any]] {
            DispatchQueue.main.async {
                self.receivedTasks = tasksData.compactMap {
                    TaskItem(from: $0)
                }
            }
        }
    }
 
    // 必須デリゲートメソッド
    func session(
        _ session: WCSession,
        activationDidCompleteWith state: WCSessionActivationState,
        error: Error?
    ) {}
 
    #if os(iOS)
    func sessionDidBecomeInactive(_ session: WCSession) {}
    func sessionDidDeactivate(_ session: WCSession) {
        WCSession.default.activate()
    }
    #endif
}
 
// 期待される出力:
// iPhone でタスクを追加・更新すると、Watch 側にリアルタイムで反映される
// Watch でタスクを完了にすると、iPhone 側にも同期される

Application Context による永続化

sendMessage はリアルタイム通信に適していますが、Watch が非アクティブな場合にはメッセージが届きません。updateApplicationContext を使うと、最新のデータが永続化され、Watch が起動した際に最新の状態を取得できます。

// バックグラウンド対応のデータ同期
func syncTasksInBackground(_ tasks: [TaskItem]) {
    let context: [String: Any] = [
        "tasks": tasks.map { $0.toDictionary() },
        "lastUpdated": Date().timeIntervalSince1970
    ]
 
    do {
        try WCSession.default.updateApplicationContext(context)
    } catch {
        print("Context更新エラー: \(error.localizedDescription)")
    }
}
 
// Watch 側で受信
func session(
    _ session: WCSession,
    didReceiveApplicationContext context: [String: Any]
) {
    if let tasksData = context["tasks"] as? [[String: Any]] {
        DispatchQueue.main.async {
            self.receivedTasks = tasksData.compactMap {
                TaskItem(from: $0)
            }
        }
    }
}

HealthKit データを Watch アプリに統合する

Apple Watch の最大の強みの一つが、リアルタイムのヘルスケアデータへのアクセスです。HealthKit を統合することで、心拍数、歩数、ワークアウトデータなどを活用したアプリが構築できます。

// Shared/Services/HealthKitManager.swift
import HealthKit
 
class HealthKitManager: ObservableObject {
    private let healthStore = HKHealthStore()
    @Published var todaySteps: Int = 0
    @Published var currentHeartRate: Double = 0
 
    // HealthKit 利用許可をリクエスト
    func requestAuthorization() async throws {
        let typesToRead: Set<HKObjectType> = [
            HKQuantityType(.stepCount),
            HKQuantityType(.heartRate),
            HKQuantityType(.activeEnergyBurned)
        ]
 
        try await healthStore.requestAuthorization(
            toShare: [],
            read: typesToRead
        )
    }
 
    // 今日の歩数を取得
    func fetchTodaySteps() async {
        let stepsType = HKQuantityType(.stepCount)
        let startOfDay = Calendar.current.startOfDay(for: Date())
        let predicate = HKQuery.predicateForSamples(
            withStart: startOfDay,
            end: Date(),
            options: .strictStartDate
        )
 
        let descriptor = HKStatisticsQueryDescriptor(
            predicate: .init(
                quantityType: stepsType,
                predicate: predicate
            ),
            options: .cumulativeSum
        )
 
        do {
            let result = try await descriptor.result(for: healthStore)
            let steps = result?.sumQuantity()?
                .doubleValue(for: .count()) ?? 0
            await MainActor.run {
                self.todaySteps = Int(steps)
            }
        } catch {
            print("歩数取得エラー: \(error.localizedDescription)")
        }
    }
}
 
// 期待される出力:
// Watch アプリ上に「今日の歩数: 8,432歩」のように表示される

HealthKit を使ったアプリは App Store 審査でプライバシーポリシーの明示が求められます。審査対策について詳しく知りたい方は、Rork アプリの App Store 審査完全攻略ガイドが参考になります。

コンプリケーション(文字盤ウィジェット)を実装する

コンプリケーションは Apple Watch の文字盤に小さなウィジェットを配置する機能です。ユーザーがアプリを開かなくても一目で情報を確認できるため、エンゲージメント向上に大きく貢献します。

// ComplicationProvider.swift
import WidgetKit
import SwiftUI
 
struct TaskComplicationEntry: TimelineEntry {
    let date: Date
    let remainingTasks: Int
    let nextTask: String?
}
 
struct TaskComplicationProvider: TimelineProvider {
    func placeholder(in context: Context) -> TaskComplicationEntry {
        TaskComplicationEntry(
            date: Date(),
            remainingTasks: 3,
            nextTask: "サンプルタスク"
        )
    }
 
    func getSnapshot(
        in context: Context,
        completion: @escaping (TaskComplicationEntry) -> Void
    ) {
        let entry = TaskComplicationEntry(
            date: Date(),
            remainingTasks: 5,
            nextTask: "企画書を提出"
        )
        completion(entry)
    }
 
    func getTimeline(
        in context: Context,
        completion: @escaping (Timeline<TaskComplicationEntry>) -> Void
    ) {
        // 実際のタスクデータを取得してタイムラインを構築
        let tasks = TaskStorage.shared.incompleteTasks
        let entry = TaskComplicationEntry(
            date: Date(),
            remainingTasks: tasks.count,
            nextTask: tasks.first?.title
        )
 
        let nextUpdate = Calendar.current.date(
            byAdding: .minute, value: 30, to: Date()
        )!
        let timeline = Timeline(
            entries: [entry],
            policy: .after(nextUpdate)
        )
        completion(timeline)
    }
}
 
// コンプリケーションの表示 UI
struct TaskComplicationView: View {
    let entry: TaskComplicationEntry
 
    var body: some View {
        VStack(alignment: .leading) {
            Text("\(entry.remainingTasks)")
                .font(.title2)
                .fontWeight(.bold)
            Text("残タスク")
                .font(.caption2)
                .foregroundColor(.secondary)
        }
        .containerBackground(.fill.tertiary, for: .widget)
    }
}
 
// 期待される出力:
// 文字盤上に「5 残タスク」のようなコンプリケーションが表示される

まとめ

Rork Max を使った Apple Watch コンパニオンアプリ開発のポイントをまとめます。

  • watchOS アプリの基本構成: iPhone アプリ + Watch ターゲット + Shared コードの3層構造で設計する
  • SwiftUI ベースの Watch UI: 小さな画面に最適化したシンプルなインターフェースを心がける
  • WCSession によるデータ連携: リアルタイム通信には sendMessage、永続化には updateApplicationContext を使い分ける
  • HealthKit 統合: 歩数・心拍数・ワークアウトデータを活用してアプリの価値を高める
  • コンプリケーション: 文字盤ウィジェットでユーザーの日常にアプリを溶け込ませる

Apple Watch アプリ対応は、App Store での差別化要因として非常に有効です。多くの個人開発者がまだ watchOS に進出していない今こそ、Rork Max の AI コード生成を活かして素早く市場に参入するチャンスです。

Watch アプリをストアに公開する際の具体的な手順については、Rork Max の2クリック App Store 公開完全解説で詳しく解説しています。

シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

開発ツール2026-06-18
Rork Max で Apple Watch のコンプリケーションを WidgetKit で実装する
Rork Max が生成した SwiftUI アプリに、watchOS のコンプリケーションと Smart Stack 対応を後から足す実装手順を、データ共有と Timeline 設計まで具体的にまとめました。
開発ツール2026-03-20
Rork Max で作る本格フィットネストラッカー — HealthKit × Apple Watch × ウィジェット統合開発
Rork MaxでHealthKit・Apple Watch・ホーム画面ウィジェットを統合したフィットネストラッカーアプリを構築する上級チュートリアル。設計からApp Store公開まで完全解説。
開発ツール2026-07-13
HealthKitの差分同期でデータを取りこぼす — HKAnchoredObjectQueryのアンカーを設計する
HealthKitの差分同期で歩数や睡眠が二重に数えられたり欠けたりする原因は、HKQueryAnchorの永続化設計にあります。newAnchorとdeletedObjectsを正しく扱い、再インストールやバックグラウンド更新をまたいでも整合するローカル取り込みの実装を、動くSwiftコードでまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →