◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SDK 58 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●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 — Beta が 09/15 から。stable の案内はまだなく、Expo Go でのプロジェクト実行は 09/03 からログインが必要です●WIDGET — iOS のウィジェットが本番ビルドだけ真っ黒になる原因を追った報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/アプリ開発
◇ アプリ開発/2026-05-26上級

Rork アプリに WidgetKit で iOS ウィジェットを後付けする実装ノート — 壁紙アプリ 6 本に同時導入した設定とトレードオフ

Rork で骨格を作った iOS アプリに WidgetKit Extension を後付けする実装手順と、壁紙アプリ 6 本へ同時導入したときの App Group・Timeline Provider・メモリ上限まわりの実運用メモを、個人開発の現場目線でまとめます。

Rork585WidgetKit11iOS115SwiftUI66App Group4Wallpaper3AppIntent

✦ プレミアム記事

個人でアプリ開発を 2014 年から続けている廣川政樹です。最近、Rork で叩き台を作った壁紙系の iOS アプリに WidgetKit でウィジェットを後付けする作業をまとめてやり、累計 5,000 万 DL を超えた既存ラインアップにも展開しました。Rork は React Native ベースのコードを素早く吐いてくれますが、Widget Extension は JavaScript ランタイムを持たない別ターゲットなので、後付けするときは「ネイティブ側で完結する小さな世界」を上から重ねるイメージで設計する必要があります。

本ノートは Rork で組み立てたアプリに WidgetKit Extension を後付けし、壁紙アプリ 6 本に同時導入したときの段取りを、現場目線で残したものです。Timeline Provider の選び方や App Group の共有ディスク I/O、30MB のメモリ上限といった、後から触ると沼にハマりやすい部分を中心に書きます。

なぜ Rork ベースのアプリに後から Widget を足したのか

きっかけは、壁紙アプリの一部で「アプリを開かなくても今日のおすすめ壁紙が見たい」という要望が App Store のレビューに連続して書き込まれたことでした。当時の運用では、配信中の壁紙データは Rork が生成した React Native の画面側でしか触っていなかったため、ウィジェットを後付けするには JS 層とネイティブ層の境界を一度引き直す必要がありました。

もう一つの理由は ASO 観点です。App Store の検索結果は、ウィジェットに対応しているアプリでスクリーンショットに「Widget」の表示が出る関係で、検索面のアピールが微妙に変わります。私のラインアップでは、Widget を載せたバージョンを公開した直後の 2 週間で、Beautiful HD Wallpapers の「wallpaper widget」の検索流入が前 2 週間比で約 11% 増えました。額としては絶対値が小さい流入経路ですが、後付けの工数が 1 アプリあたり 1 〜 1.5 営業日で済むなら十分に黒字化できる施策だと判断しました。

最後に運用面でも、Widget があると「アプリを起動しなくても画像を眺めて気分転換できる」という用途が増えるため、ユーザーから見ると「壁紙を変える前のプレビュー的役割」を担えます。これによって、本体アプリ側の壁紙詳細画面の離脱率が体感で改善しました。後で書きますが、6 本のうち継続的に毎週使われているのはホーム画面 Widget で、Lock Screen 側はバージョン公開直後だけ盛り上がる傾向が出ました。

App Group と共有ストレージ — Rork が出した JS 層とネイティブ Widget の橋渡し

WidgetKit Extension は JavaScript を実行できないため、Rork 側で AsyncStorage や React Native の状態として持っているデータは、そのままでは Widget 側から読めません。橋渡しに使うのが App Group の共有 UserDefaults と、共有コンテナディスクのファイルです。

私の構成では、メイン App から JavaScript 経由で叩けるネイティブブリッジを 1 枚挟み、その先で UserDefaults(suiteName:) と FileManager.default.containerURL(forSecurityApplicationGroupIdentifier:) を使って App Group コンテナにデータを書き出す形にしています。Widget Extension 側は同じ App Group の Suite を読むだけです。

// AppGroup.swift(メイン App と Widget Extension の両方に追加するファイル)
import Foundation
 
enum AppGroup {
    static let identifier = "group.net.dolice.wallpapers.shared"
 
    static var defaults: UserDefaults {
        guard let d = UserDefaults(suiteName: identifier) else {
            fatalError("App Group の Suite が見つかりません。Capabilities を確認してください。")
        }
        return d
    }
 
    static var containerURL: URL {
        guard let url = FileManager.default.containerURL(
            forSecurityApplicationGroupIdentifier: identifier
        ) else {
            fatalError("App Group コンテナが取得できません。プロビジョニングを確認してください。")
        }
        return url
    }
}

落とし穴は 2 つあります。まず、AppGroup.identifier をメイン App と Widget Extension の両方の Signing & Capabilities タブで「App Groups」に有効化しておかないと、本番ビルドでだけ Widget が無音で空表示になります。シミュレータ上は通ってしまうことがあるので、毎回 TestFlight に上げて実機で確認する手順を入れています。

もう一つは、共有コンテナのファイル名にロケール依存の文字を入れない方が安全だという点です。Widget は省電力下で読み出しに失敗するケースがあり、ファイル名が長くても短くてもエラーになるパターンを目視で何度か観測しました。今は wallpaper-current.jpg のような ASCII 短名で固定し、メタデータは UserDefaults の Codable で別管理にしています。

✦

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

この記事の続きを読む

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

この記事で得られること
✦Rork が出力した React Native ベースの iOS プロジェクトに、JS 層を触らず WidgetKit Extension を後付けする最小構成の組み立て手順
✦壁紙アプリ 6 本に同時導入したときに使い分けた Timeline Provider 3 パターン(静的・タイマー・アプリ起動連動)の判断軸
✦AppIntent ベースの Configuration、App Group 共有ディスク I/O、Widget の 30MB メモリ上限と画像最適化、Lock Screen Widget の差分まで含む後付け実装の運用ノウハウ
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

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

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

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

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

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

関連記事

◇ アプリ開発2026-04-26
Rork でネイティブ iOS アプリを作る — SwiftUI 生成から TestFlight 配信までの実践ワークフロー
Rork の新規 iPhone プロジェクトは Swift/SwiftUI で生成され、Rork Pro で App Store まで届きます。古い Expo プロジェクトとの見分け方、クレジットで見る費用、骨格プロンプト、実機確認、Xcode に降りる基準、TestFlight 提出までを手順で追います。
⬡ 開発ツール2026-05-10
Rorkで作ったアプリのiOSウィジェットが「古いまま」になる本当の原因 — App Group共有とタイムライン更新の設計を見直す
Rorkで生成したアプリにiOSウィジェットを追加したら、起動するたびに古い情報を表示する。App Groupの発行・UserDefaults共有・タイムライン更新の3点を一本の設計に収めて、本番運用に耐える親子間データ共有を組み立てる実装ノートです。
⬡ 開発ツール2026-09-05
Widget Extension でも BGTaskScheduler.submit は成功します。走らないのは register が親アプリだけのものだからです
Widget Extension から BGTaskScheduler に依頼を出すとビルドも submit も通るのに、翌朝ウィジェットは変わりません。register がホストアプリ専用である事実から、更新の主語を親アプリへ戻す設計まで、壁紙アプリの運用で詰めた手順を残します。