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-04-05上級

Rork Max × WidgetKit・ライブアクティビティ実装ガイド 2026 — Dynamic Island 対応まで

Rork Max で iOS Widget・ロック画面ウィジェット・Dynamic Island 対応のライブアクティビティを実装するための実践ガイド。WidgetKit の基礎から Timeline 更新戦略、App Intents 連携、収益化まで体系的に解説します。

Rork Max230WidgetKit10ライブアクティビティDynamic Island3iOS108WidgetApp Intents6Swift48

プレミアム記事

Rork Max × WidgetKit・ライブアクティビティ実装ガイド 2026 — Dynamic Island 対応まで

iOS 16 以降、Widget はホーム画面だけでなくロック画面にも配置できるようになりました。さらに Dynamic Island と連携したライブアクティビティが加わり、アプリのエンゲージメントを大きく高める機能として定着しています。ユーザーがアプリを開かなくても最新情報を届けられる Widget は、リテンション向上と収益化の両面で重要な役割を果たします。

Rork Max はネイティブ Swift コードを生成できる AI アシスト開発環境です。WidgetKit・ActivityKit の実装も Rork Max のプロンプトドリブン開発で行えますが、SwiftUI の仕組みや Widget 固有の制約を理解していないと、Rork Max が出力したコードに誤りが含まれていても気づけません。ここでは実装の原理から丁寧に解説し、プロが使える水準のウィジェットを構築するための知識を体系的に提供します。

私自身、個人開発で運用している壁紙アプリに「今日の一枚」を映すウィジェットを載せたとき、最初に面食らったのが更新のされなさでした。getTimeline で数分おきに新しい画像へ差し替えるつもりが、iOS は省電力のために再読み込みをかなり間引きます。そこで方針を変え、一日分のエントリをあらかじめ Timeline にまとめて積んでおき、深夜0時に一度だけ全体を組み直す設計にしました。リクエスト回数を最小限に抑えつつ、ユーザーから見れば毎朝きちんと絵柄が変わる。この「先に焼き込む」発想にたどり着くまで、何度も実機の挙動を観察した記憶があります。以降の各セクションでも、こうした実運用での手触りを添えながら進めていきます。

1. WidgetKit の基本アーキテクチャを理解する

WidgetKit はアプリ本体とは別プロセスで動作する Widget Extension として実装されます。アプリのコードを直接呼び出せないため、AppGroup や UserDefaults(suite 付き)を使ってデータを共有する設計が必要です。

Widget の核となるコンポーネントは3つです。

TimelineEntry。 特定の時刻における Widget の状態を表す構造体です。表示したいデータをすべてここに持たせます。

TimelineProvider。 iOS が「次のタイムラインをいつ更新するか」を判断するために呼び出すプロトコルです。placeholdergetSnapshotgetTimeline の3メソッドを実装します。

EntryView。 TimelineEntry を受け取って SwiftUI ビューを返す型です。ウィジェットの見た目はすべてここに書きます。

// 最小構成のWidgetKit実装
import WidgetKit
import SwiftUI
 
// 1. TimelineEntry — ウィジェットに表示するデータ
struct AppEntry: TimelineEntry {
    let date: Date
    let title: String
    let progress: Double  // 0.0 〜 1.0
}
 
// 2. TimelineProvider — タイムライン供給ロジック
struct AppProvider: TimelineProvider {
    func placeholder(in context: Context) -> AppEntry {
        AppEntry(date: .now, title: "読み込み中...", progress: 0.5)
    }
 
    func getSnapshot(in context: Context,
                     completion: @escaping (AppEntry) -> Void) {
        let entry = AppEntry(date: .now, title: "今日のタスク: 5件", progress: 0.6)
        completion(entry)
    }
 
    func getTimeline(in context: Context,
                     completion: @escaping (Timeline<AppEntry>) -> Void) {
        // AppGroupからデータを取得
        let defaults = UserDefaults(suiteName: "group.com.yourapp.shared")
        let title = defaults?.string(forKey: "widget_title") ?? "タスクなし"
        let progress = defaults?.double(forKey: "widget_progress") ?? 0.0
 
        let entry = AppEntry(date: .now, title: title, progress: progress)
        // 15分後に再更新をリクエスト
        let nextUpdate = Calendar.current.date(byAdding: .minute, value: 15, to: .now)!
        let timeline = Timeline(entries: [entry], policy: .after(nextUpdate))
        completion(timeline)
    }
}
 
// 3. EntryView — SwiftUIビューの定義
struct AppWidgetEntryView: View {
    var entry: AppProvider.Entry
 
    var body: some View {
        VStack(alignment: .leading, spacing: 8) {
            Text(entry.title)
                .font(.headline)
                .lineLimit(2)
            ProgressView(value: entry.progress)
                .tint(.blue)
            Text("\(Int(entry.progress * 100))% 完了")
                .font(.caption)
                .foregroundStyle(.secondary)
        }
        .padding()
        .containerBackground(.background, for: .widget)
    }
}
 
// 4. Widget定義
@main
struct AppWidget: Widget {
    let kind = "AppWidget"
 
    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: AppProvider()) { entry in
            AppWidgetEntryView(entry: entry)
        }
        .configurationDisplayName("進捗ウィジェット")
        .description("タスクの進捗を確認できます。")
        .supportedFamilies([.systemSmall, .systemMedium, .accessoryCircular, .accessoryRectangular])
    }
}

期待する出力: ホーム画面に「今日のタスク: 5件 / 60% 完了」のウィジェットが表示されます。

Rork Max にこの構造を理解させてプロンプトを書くと、実用的なコードが出力されます。「WidgetKit Extension を作成して、AppGroup 経由でデータを受け取り、ホーム画面とロック画面に対応したウィジェットを実装してください。supportedFamilies は small・medium・accessoryCircular・accessoryRectangular を含めてください」のように、具体的な要件を指定するのがコツです。

2. Rork Max でのプロジェクトセットアップ

Rork Max でウィジェットを実装する前に、Xcode 側での準備が必要です。Rork Max は基本的なファイル生成は行いますが、Xcode のターゲット設定や Capability の追加は手動で行う必要があります。

2-1. Widget Extension ターゲットを追加する

Xcode のメニューから「File → New → Target → Widget Extension」を選択します。このとき「Include Live Activity」にもチェックを入れておくと、ActivityKit 用のボイラープレートも生成されます。

ターゲット名は AppNameWidget のように命名するのが慣例です。バンドル ID は com.yourapp.widget という形式になります。

2-2. AppGroup を設定する

アプリ本体と Widget Extension の間でデータを共有するには AppGroup が必須です。Xcode の「Signing & Capabilities」タブから両ターゲットに同じ AppGroup ID(例: group.com.yourapp.shared)を追加します。

2-3. Rork Max へのプロンプト設計

セットアップが完了したら、Rork Max に次のようにプロンプトを渡します。

Widget Extension ターゲット「TaskWidget」が追加済みです。
AppGroup ID は「group.com.yourapp.shared」です。
以下の仕様で TaskWidgetBundle.swift・TaskWidget.swift を実装してください:
- アプリ側では UserDefaults(suiteName:) でタスク件数と完了率を保存する
- ウィジェット側では同じ UserDefaults から値を読み取り表示する
- 対応ファミリー: systemSmall, systemMedium, accessoryCircular, accessoryRectangular
- iOS 17 の .containerBackground モディファイアを使用する

具体的なファイル名・AppGroup ID・対応ファミリーを明示することで、Rork Max の出力精度が大幅に向上します。

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

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
WidgetKit の Timeline・Entry・Provider の仕組みを理解し、ホーム画面・ロック画面ウィジェットを実装できる
Dynamic Island に対応したライブアクティビティを ActivityKit で構築し、リアルタイムに状態を更新できる
App Intents と連携したインタラクティブ Widget・Siri ショートカットの設計パターンを習得できる
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

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

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

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

関連記事

開発ツール2026-07-06
Rork Max のアプリ機能を Apple Intelligence に開く — App Intents Assistant Schemas の設計と、収まらない機能の逃がし方
Rork Max が生成した Swift アプリの操作を Apple Intelligence から呼べるようにする App Intents Assistant Schemas の設計を、固定スキーマへの当てはめ方・収まらない機能の逃がし方・実機での確認手順まで含めて実装ノートとしてまとめます。
開発ツール2026-07-13
HealthKitの差分同期でデータを取りこぼす — HKAnchoredObjectQueryのアンカーを設計する
HealthKitの差分同期で歩数や睡眠が二重に数えられたり欠けたりする原因は、HKQueryAnchorの永続化設計にあります。newAnchorとdeletedObjectsを正しく扱い、再インストールやバックグラウンド更新をまたいでも整合するローカル取り込みの実装を、動くSwiftコードでまとめました。
開発ツール2026-07-11
Rork Max で App Clip を実装する — QR を読んだ瞬間にアプリの核だけを届ける設計メモ
Rork Max が出力するネイティブ Swift を土台に、App Clip の15MB制約・起動URLの受け取り・親アプリへの状態引き継ぎまでを実装ベースで整理します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →