ANTIGRAVITY LABEN
記事一覧/アプリ開発
アプリ開発/2026-04-03中級

Antigravity で始めるwatchOS アプリ開発 — Apple Watch 向けアプリをAIエージェントで効率的に作る方法

Antigravity を使ったwatchOS アプリ開発の完全ガイド。SwiftUI・Complications・HealthKit連携をAIエージェントで効率化する手順を初めてApple Watch向け開発に挑戦する方向けに解説します。

watchOSApple WatchSwiftUI9HealthKitapp-dev47antigravity435

取り組みの背景 — watchOS アプリ開発に Antigravity を使う理由

Apple Watch 向けのアプリ開発は、iPhoneアプリとは異なる制約や設計思想が求められます。小さな画面サイズ、バッテリー効率、Complications(コンプリケーション)、HealthKit との連携など、watchOS 固有の要素を理解しながら開発を進める必要があります。

Antigravity のAIエージェントは、こうした watchOS 固有のパターンを熟知しており、SwiftUI コードの自動生成から Xcode プロジェクトの設定まで、開発者の作業を大幅に効率化してくれます。実際のプロジェクトを例に取りながら、Antigravity を活用した watchOS アプリ開発の全工程を順を追って整理していきます。

この記事で学べること:

  • watchOS プロジェクトのセットアップと Antigravity エージェントとの連携方法
  • SwiftUI ベースの Watch アプリ UI 構築のコツ
  • Complications(文字盤の情報表示)の実装手順
  • HealthKit を使ったヘルスデータ取得の AI 支援実装
  • WatchConnectivity による iPhone との通信設計

iOSアプリ開発の基本を学びたい方は、まず AntigravityでiOSアプリを作る入門ガイド:Swift・SwiftUIを使ったはじめての開発 から始めることをおすすめします。


watchOS 開発の基礎知識

watchOS の構成要素

watchOS アプリは大きく以下の3つの要素で構成されます。

  • Watch App: Apple Watch 上で動作するメインのアプリ本体
  • Watch Extension: バックグラウンド処理やデータ取得を担うターゲット(watchOS 7 以降は統合)
  • iPhone App(オプション): iPhone 側のアプリとデータを共有する場合に用意

watchOS 7 以降は Watch App と Extension が統合され、シンプルな構成になっています。watchOS 開発では「軽量・素早い操作・必要な情報だけ表示」という設計哲学が重要です。

Antigravity で watchOS を扱う前の準備

Antigravity を使って watchOS 開発を始める前に、以下の環境を整えておきましょう。

  • macOS 15 以上
  • Xcode 26(または最新版)
  • Apple Developer Program への加入(実機テスト・リリースに必要)
  • Apple Watch 実機(シミュレータでも基本動作は確認可能)

Step 1 — Xcode で watchOS プロジェクトを作成する

プロジェクトテンプレートの選択

Xcode を起動し、「File → New → Project」から「watchOS」タブを選択します。「Watch App」テンプレートを選ぶと、Watch アプリ単体のプロジェクトが作成されます。iPhone アプリとペアで動かしたい場合は「Watch App for iOS App」を選択してください。

プロジェクト作成後、Antigravity に以下のようなプロンプトを送ると、プロジェクト構成の最適化を任せることができます。

@Antigravity プロジェクトの構成を確認して、watchOS 開発に最適なフォルダ構造と
初期ファイル配置を提案してください。SwiftUI を使ったシンプルな
フィットネストラッカーアプリを作ります。

Antigravity は ContentView.swiftApp.swift、そして Complications 用の ComplicationController.swift の骨格を自動生成し、コメント付きで提案してくれます。


Step 2 — SwiftUI で Watch UI を設計する

小画面向け UI の考え方

watchOS の画面は iPhone と比べて極めて小さいため、UI 設計の原則が異なります。

  • 1画面に表示する情報は最小限に絞る
  • タップ操作はシンプルに(デジタルクラウンの活用も検討)
  • リストやスクロールビューは縦方向のみ
  • テキストは大きめのフォントサイズで可読性を確保

Antigravity に以下のように依頼すると、watchOS に最適化された UI コンポーネントを生成できます。

// Antigravity に生成させた watchOS 向けリストビューの例
struct WorkoutListView: View {
    let workouts: [Workout]
 
    var body: some View {
        // watchOS では NavigationStack が使用可能(watchOS 9 以降)
        NavigationStack {
            List(workouts) { workout in
                NavigationLink(destination: WorkoutDetailView(workout: workout)) {
                    HStack {
                        Image(systemName: workout.iconName)
                            .foregroundColor(.orange)
                            .frame(width: 28, height: 28)
                        VStack(alignment: .leading, spacing: 2) {
                            Text(workout.name)
                                .font(.system(size: 15, weight: .semibold))
                            Text(workout.duration)
                                .font(.system(size: 13))
                                .foregroundColor(.secondary)
                        }
                    }
                }
            }
            .navigationTitle("ワークアウト")
        }
    }
}

デジタルクラウン対応

watchOS アプリならではのインタラクションとして、デジタルクラウンの回転操作があります。.focusable() モディファイアと digitalCrownRotation を使うと、スクロール操作に利用できます。

struct HeartRateView: View {
    @State private var crownValue: Double = 70.0
 
    var body: some View {
        VStack {
            Text("目標心拍数")
                .font(.footnote)
                .foregroundColor(.secondary)
            Text("\(Int(crownValue))")
                .font(.system(size: 48, weight: .bold, design: .rounded))
                .foregroundColor(.red)
            Text("bpm")
                .font(.footnote)
        }
        // デジタルクラウンで値を調整
        .focusable()
        .digitalCrownRotation(
            $crownValue,
            from: 50,
            through: 200,
            by: 1,
            sensitivity: .medium
        )
    }
}
// 期待する出力: クラウンを回すと心拍数の目標値がリアルタイムで変化する

Step 3 — Complications(コンプリケーション)の実装

Complications は Apple Watch の文字盤に表示できる小さな情報ウィジェットです。ユーザーが文字盤を一目見るだけでアプリの情報を確認できるため、watchOS アプリのエンゲージメントを大きく向上させます。

ClockKit から WidgetKit Complications へ

watchOS 9 以降、Complications の実装は WidgetKit ベースに移行しました。これにより、iOS のホーム画面ウィジェットと同じ API を使って実装できます。

Antigravity に「watchOS Complication を WidgetKit で実装して」と指示するだけで、以下のような雛形を生成してくれます。

import WidgetKit
import SwiftUI
 
// Complication のエントリ(表示するデータ)
struct FitnessEntry: TimelineEntry {
    let date: Date
    let stepCount: Int
    let caloriesBurned: Double
}
 
// Complication のビュー定義
struct FitnessComplicationView: View {
    var entry: FitnessEntry
 
    var body: some View {
        VStack(alignment: .leading, spacing: 2) {
            Image(systemName: "figure.walk")
                .foregroundColor(.green)
            Text("\(entry.stepCount)")
                .font(.system(size: 14, weight: .bold))
                .minimumScaleFactor(0.7)
            Text("歩")
                .font(.system(size: 10))
                .foregroundColor(.secondary)
        }
    }
}
 
// タイムラインプロバイダ(データ更新ロジック)
struct FitnessProvider: TimelineProvider {
    func getTimeline(in context: Context, completion: @escaping (Timeline<FitnessEntry>) -> Void) {
        let entry = FitnessEntry(
            date: Date(),
            stepCount: 8432,      // 実際は HealthKit からデータ取得
            caloriesBurned: 312.5
        )
        let timeline = Timeline(entries: [entry], policy: .atEnd)
        completion(timeline)
    }
 
    func placeholder(in context: Context) -> FitnessEntry {
        FitnessEntry(date: Date(), stepCount: 0, caloriesBurned: 0)
    }
 
    func getSnapshot(in context: Context, completion: @escaping (FitnessEntry) -> Void) {
        completion(FitnessEntry(date: Date(), stepCount: 8432, caloriesBurned: 312.5))
    }
}

ホーム画面ウィジェットの実装についてはさらに詳しく、Antigravity × SwiftUI WidgetKit 完全ガイド — AIエージェントでホーム画面ウィジェットを高速開発する でも解説しています。


Step 4 — HealthKit でヘルスデータを取得する

権限リクエストの設定

HealthKit を使用するには、Info.plist への説明文追記と、Capabilities での HealthKit 有効化が必要です。

Antigravity に「HealthKit のセットアップをして、歩数と心拍数を取得するコードを書いて」と依頼すると、権限リクエストから実際のデータ取得まで一貫したコードを生成してくれます。

import HealthKit
 
class HealthKitManager: ObservableObject {
    private let healthStore = HKHealthStore()
 
    // 取得を許可するデータ型
    private let typesToRead: Set<HKObjectType> = [
        HKObjectType.quantityType(forIdentifier: .stepCount)!,
        HKObjectType.quantityType(forIdentifier: .heartRate)!,
        HKObjectType.quantityType(forIdentifier: .activeEnergyBurned)!
    ]
 
    // 権限リクエスト
    func requestAuthorization() async throws {
        guard HKHealthStore.isHealthDataAvailable() else {
            throw HealthKitError.notAvailable
        }
        try await healthStore.requestAuthorization(
            toShare: [],
            read: typesToRead
        )
    }
 
    // 今日の歩数を取得
    func fetchTodayStepCount() async -> Int {
        let type = HKQuantityType(.stepCount)
        let startOfDay = Calendar.current.startOfDay(for: Date())
        let predicate = HKQuery.predicateForSamples(
            withStart: startOfDay,
            end: Date(),
            options: .strictStartDate
        )
 
        return await withCheckedContinuation { continuation in
            let query = HKStatisticsQuery(
                quantityType: type,
                quantitySamplePredicate: predicate,
                options: .cumulativeSum
            ) { _, result, _ in
                let count = result?.sumQuantity()?.doubleValue(for: .count()) ?? 0
                continuation.resume(returning: Int(count))
            }
            self.healthStore.execute(query)
        }
    }
}
// 期待する出力: 今日の歩数が Int 型で取得できる

Step 5 — WatchConnectivity で iPhone と通信する

WatchConnectivity の基本設計

アプリの設定データや大きなデータセットは iPhone 側で管理し、Watch 側では表示に必要な最小限のデータだけを扱うのが watchOS 開発の基本パターンです。WCSession を使うことで、iPhone と Apple Watch 間でリアルタイムにデータを送受信できます。

import WatchConnectivity
 
class WatchSessionManager: NSObject, WCSessionDelegate, ObservableObject {
    @Published var receivedData: [String: Any] = [:]
 
    override init() {
        super.init()
        if WCSession.isSupported() {
            WCSession.default.delegate = self
            WCSession.default.activate()
        }
    }
 
    // iPhone からメッセージを受信
    func session(
        _ session: WCSession,
        didReceiveMessage message: [String: Any]
    ) {
        DispatchQueue.main.async {
            self.receivedData = message
        }
    }
 
    // Watch から iPhone へメッセージを送信
    func sendToPhone(_ message: [String: Any]) {
        guard WCSession.default.isReachable else { return }
        WCSession.default.sendMessage(message, replyHandler: nil) { error in
            print("送信エラー: \(error.localizedDescription)")
        }
    }
 
    // --- WCSessionDelegate の必須メソッド ---
    func sessionDidBecomeInactive(_ session: WCSession) {}
    func sessionDidDeactivate(_ session: WCSession) {
        WCSession.default.activate()
    }
    func session(
        _ session: WCSession,
        activationDidCompleteWith activationState: WCSessionActivationState,
        error: Error?
    ) {}
}

Antigravity では「WatchConnectivity を使って iPhone のユーザー設定を Watch に同期する」と指示するだけで、送受信両側の実装コードを同時生成してくれます。複数ファイルにまたがる実装でも、コンテキストを維持したまま整合性の取れたコードを出力するのが Antigravity の強みです。


Step 6 — テストとデバッグ

シミュレータでのテスト

Xcode の Watch シミュレータを使うと、実機なしで基本動作を確認できます。ただし HealthKit の実際のデータ取得や Complications のリアルタイム更新は、実機テストが必要です。

Antigravity を使ったデバッグの効率化には、以下のプロンプトが便利です。

@Antigravity 現在のコードで Xcode に表示されているエラーをすべて修正して。
また watchOS シミュレータで HealthKit テスト用のモックデータを注入する
テストコードも追加してほしい。

よくあるエラーと対処法

「HealthKit is not available on this device」エラー

シミュレータでは HealthKit が使えないため、HKHealthStore.isHealthDataAvailable() で確認し、シミュレータ向けにはモックデータを返す設計にしましょう。

Complications が文字盤に反映されない

WidgetKit の Timeline が更新されていない可能性があります。WidgetCenter.shared.reloadAllTimelines() を適切なタイミングで呼び出してください。

WatchConnectivity のメッセージが届かない

iPhone と Apple Watch が同一の Apple ID でサインインしていること、Bluetooth が有効なことを確認してください。


Antigravity エージェントを活用する実践的なプロンプト集

watchOS 開発で特に役立つ Antigravity へのプロンプトをまとめます。

プロジェクト設計フェーズ

watchOS 向けのフィットネストラッカーアプリを設計してほしい。
機能要件: 歩数・心拍数の表示、ワークアウト開始/停止、Complication 対応。
SwiftUI + HealthKit + WatchConnectivity を使った
アーキテクチャを提案して。

UI 生成フェーズ

Apple Watch Ultra のディスプレイサイズに最適化した
ワークアウト中画面を SwiftUI で作成して。
心拍数・経過時間・消費カロリーをリアルタイム表示する。

デバッグフェーズ

この watchOS アプリが Xcode 26 でビルドエラーになっている。
エラーログを解析して原因と修正方法を教えて。
[エラーログをペースト]

まとめ

Antigravity を使った watchOS アプリ開発では、SwiftUI による UI 構築から HealthKit・WatchConnectivity の連携実装まで、AIエージェントが一貫してサポートしてくれます。watchOS 固有の設計パターン(Complications・デジタルクラウン・軽量UI)を理解した上で Antigravity に具体的な指示を出すことで、開発速度を大幅に高めることができます。

次のステップとして、アプリ内課金を組み込む場合は Antigravity × StoreKit 2 アプリ内課金実装ガイド — AI エージェントでサブスクリプション課金を高速開発する も参考にしてください。SwiftUI によるより高度なアプリ開発を深めたい方には、Antigravity SwiftUI スキルで iOS アプリ開発を加速する完全ガイド 2026 もおすすめです。

また、watchOS アプリの開発をさらに実践的に深めたい方には、CloudKit を使ったデバイス間データ同期の実装について詳しく解説したプレミアム記事「Antigravity × SwiftUI + CloudKit:iCloud 同期アプリを本番実装するアドバンスガイド」もご覧ください。

シェア

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

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

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

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

関連記事

アプリ開発2026-07-13
画像の一括最適化をエージェントに任せる前に置く、見た目の劣化を止めるゲート
壁紙アプリの数百枚のアセットをエージェントに一括再エンコードさせたら、数枚だけ色がくすんでいました。サイズ削減率だけでは劣化を見抜けません。SSIM・ΔE・ファイルサイズの3軸でマージ前に不良変換を弾くゲートの設計と、Pillow と scikit-image で動く判定スクリプトをまとめます。
アプリ開発2026-07-09
エージェントが直した .proto がバイナリ互換を壊す前に — buf breaking で wire 互換を門番する
エージェントに .proto を編集させると、テキストとしては正しくても wire 互換を静かに壊すことがあります。フィールド番号の再利用と型変更をどう機械で止めるか、buf breaking と reserved を組み合わせたゲートを動くコードで示します。
アプリ開発2026-07-03
ダウンロードサイズの逆行に提出直前で気づかないために — AAB/IPA のサイズ予算をエージェントの週次ゲートで守る
メディエーションSDKやアセットの追加で静かに膨らむダウンロードサイズに、bundletool と App Thinning レポートを使ったサイズ台帳・予算ゲート・増分の内訳特定で歯止めをかける設計をまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →