◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Expo SDK 58 が 10/15 に正式リリースされました(Beta は 09/15 から)。上げる前に依存の対応状況を確認しましょう●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Expo SDK 58 が 10/15 に正式リリースされました(Beta は 09/15 から)。上げる前に依存の対応状況を確認しましょう●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/開発ツール
⬡ 開発ツール/2026-04-05上級

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

Rork Max で iOS Widget・ロック画面ウィジェット・Dynamic Island 対応のライブアクティビティを実装した記録。Timeline の焼き込み設計、APNs のヘッダーと優先度、push-to-start、stale-date の扱いまで実運用の判断を残します。

Rork Max236WidgetKit11ライブアクティビティDynamic Island3iOS115WidgetApp Intents6Swift48

✦ プレミアム記事

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

個人開発で運用している壁紙アプリに「今日の一枚」を映すウィジェットを載せた夜、私が最初に面食らったのは、更新のされなさでした。getTimeline で数分おきに新しい画像へ差し替えるつもりでいたのですが、iOS は省電力のために再読み込みをかなり間引きます。翌朝ホーム画面を見ると、前日の絵柄がそのまま残っておりました。

そこで方針を変えました。一日分のエントリをあらかじめ Timeline に積んでおき、深夜0時に一度だけ全体を組み直す設計です。リクエストの回数は最小限に収まり、それでいてユーザーから見れば毎朝きちんと絵柄が変わります。この「先に焼き込む」考え方にたどり着けたのは、実機のホーム画面を何日も眺めたあとでした。いま思えば、Widget を本体アプリの縮小版として捉えていたことが遠回りの原因だったのかもしれません。

Widget は「呼ばれたときに作る画面」ではなく、「先に用意しておく紙芝居」です。 この見方に切り替えてから、更新まわりで手が止まる時間がはっきり減りました。

Rork Max はネイティブ Swift コードを生成できる AI アシスト開発環境です。WidgetKit・ActivityKit の実装もプロンプトドリブンで進められますが、SwiftUI の仕組みと Widget 固有の制約を押さえていないと、出力されたコードに誤りが混ざっていても気づけません——そして Widget の誤りは、クラッシュではなく「何も表示されない空白」として現れるぶん、なおさら見つけにくいのです。以降の各セクションでは、実装の原理と、実運用でつまずいた箇所の手触りを並べてお伝えします。

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

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

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

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

TimelineProvider。 iOS が「次のタイムラインをいつ更新するか」を判断するために呼び出すプロトコルです。placeholder・getSnapshot・getTimeline の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 を含めてください」のように、具体的な要件を指定するのがコツです。

✦

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

この記事の続きを読む

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

この記事で得られること
✦1日40〜70回に制限される Timeline 更新の中で、iOS 17 の containerBackground まで含めた実装を組み立てられる
✦APNs のヘッダー・優先度5と10の使い分け・push-to-start・stale-date まで含めて、サーバー主導の更新を設計できる
✦AppIntentConfiguration による設定可能ウィジェットと、約30MB のメモリ制約に収める描画設計を把握できる
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

⬡ 開発ツール2026-09-05
Widget Extension でも BGTaskScheduler.submit は成功します。走らないのは register が親アプリだけのものだからです
Widget Extension から BGTaskScheduler に依頼を出すとビルドも submit も通るのに、翌朝ウィジェットは変わりません。register がホストアプリ専用である事実から、更新の主語を親アプリへ戻す設計まで、壁紙アプリの運用で詰めた手順を残します。
⬡ 開発ツール2026-05-16
Rork Max 製 iOS アプリの Firebase CocoaPods を Swift Package Manager へ移行した実録——2026年10月の廃止前に対応した手順と3つの落とし穴
Firebase Apple SDK の CocoaPods 配信が2026年10月に停止します。Rork Max 製 iOS アプリ4本を Swift Package Manager へ移行した実体験をもとに、手順・落とし穴・Dropbox競合コピー問題の解決策を詳細に解説します。
⬡ 開発ツール2026-05-10
Rorkで作ったアプリのiOSウィジェットが「古いまま」になる本当の原因 — App Group共有とタイムライン更新の設計を見直す
Rorkで生成したアプリにiOSウィジェットを追加したら、起動するたびに古い情報を表示する。App Groupの発行・UserDefaults共有・タイムライン更新の3点を一本の設計に収めて、本番運用に耐える親子間データ共有を組み立てる実装ノートです。