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

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

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

Rork515WidgetKit10iOS108SwiftUI63App 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 生成からビルドまでの実践ワークフロー
Rork でネイティブ iOS アプリを作りたいけれど、SwiftUI コードがどう生成されて、どうビルドされるのかが見えづらい、という声をよく聞きます。生成から TestFlight 配信まで、私が実際に通っているワークフローを具体例で紹介します。
開発ツール2026-05-10
Rorkで作ったアプリのiOSウィジェットが「古いまま」になる本当の原因 — App Group共有とタイムライン更新の設計を見直す
Rorkで生成したアプリにiOSウィジェットを追加したら、起動するたびに古い情報を表示する。App Groupの発行・UserDefaults共有・タイムライン更新の3点を一本の設計に収めて、本番運用に耐える親子間データ共有を組み立てる実装ノートです。
アプリ開発2026-07-01
Rork Max のネイティブ Swift で SharePlay を組む — 二人の画面を同じ状態で動かす設計
GroupActivities を使い、FaceTime 越しに二人の画面を同じ状態で動かす SharePlay を Rork Max のネイティブ Swift で組む実装メモです。GroupActivity の宣言、GroupSession への参加、GroupSessionMessenger での状態同期、遅延と競合の扱い、そして React Native 側から橋渡しするときの境界設計まで、実際に詰まった点を添えてまとめます。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →