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-10上級

Rorkで作ったアプリのiOSウィジェットが「古いまま」になる本当の原因 — App Group共有とタイムライン更新の設計を見直す

Rorkで生成したアプリにiOSウィジェットを追加したら、起動するたびに古い情報を表示する。App Groupの発行・UserDefaults共有・タイムライン更新の3点を一本の設計に収めて、本番運用に耐える親子間データ共有を組み立てる実装ノートです。

Rork515WidgetKit10App Group4iOS108ウィジェット7React Native209Expo Modules

プレミアム記事

壁紙アプリの月次アップデートを配信したあと、ホーム画面ウィジェットだけが「先月のデイリー壁紙」を表示し続けたことがありました。アプリを開けば最新画像は更新されているのに、ウィジェットは数時間どころか丸一日前のサムネイルを出しています。エンドユーザーから「古いままなんですが」とフィードバックが届いて、その晩は寝るどころではなくなりました。

WidgetKitのドキュメントには「親アプリと共有するにはApp Groupを使ってください」と1行だけ書いてあります。けれど、実際にRorkで生成したReact NativeアプリにWidget Extensionを後から足すと、その「1行」の裏側で詰まる箇所が3つあります。App Groupの発行ミス、UserDefaultsの読み書きの非対称、そしてタイムライン更新を呼ぶタイミング。今回はこの3点を1本の設計図に乗せて、本番運用に耐えるウィジェットを組み立て直します。

「ウィジェットが古いまま」が起きる仕組みのおさらい

iOSのアプリは、それぞれが独立したサンドボックスで動きます。これはRorkで生成したアプリでも、Xcodeに後付けしたWidget Extensionでも変わりません。Widget Extensionは見た目こそ親アプリの一部に見えますが、実体は別プロセス・別バンドルIDで起動する小さなアプリです。

つまり、親アプリがUserDefaults.standardに書いた値は、ウィジェット側から読んでもnilです。これは仕様であって、バグではありません。サンドボックスを越えてデータを共有するには、Appleが用意した「App Group」という共有ストアを明示的に発行する必要があります。

ここで多くの人が最初に詰まります。私自身、最初の試作では「親アプリで保存→ウィジェットで読む」という処理を疑うことなくUserDefaults.standardで書いていて、シミュレータでは動くのに実機ではnilが返るという状況を半日かけて再現していました。原因はApp Groupを通していなかった、それだけでした。

App Groupの発行 — 「親アプリのIDをそのまま使う」が初期の落とし穴

App Groupは、親アプリとExtensionが「共有のキー付き棚」を持つための仕組みです。Apple Developer Portalで発行し、両方のターゲットのCapabilitiesに追加します。命名はgroup.{逆順ドメイン}.{アプリ名}.sharedが慣例です。

ここで一番ハマりやすいのは「親アプリのバンドルID(com.example.myapp)をそのまま使ってしまう」ケースです。App Group IDは独立した別物として、頭にgroup.をつけて新規発行する必要があります。

設定の流れは次のとおりです。

  1. Apple Developer Portalの「Identifiers → App Groups」で新規発行(例: group.com.example.myapp.shared)
  2. 親アプリのIdentifierとExtensionのIdentifierの両方で、CapabilitiesのApp Groupsにチェックを入れて関連付け
  3. Xcodeのプロジェクト設定 → Signing & Capabilitiesで、両方のターゲットに「App Groups」を追加し、上で発行したIDをチェック
  4. 両方のターゲットの*.entitlementsファイルに以下が自動追加されることを確認
<key>com.apple.security.application-groups</key>
<array>
  <string>group.com.example.myapp.shared</string>
</array>

エンタイトルメントファイルが両方のターゲットに正しく書き込まれていない状態でビルドすると、ランタイムでは何のエラーも出ずに「データが書けたように見えるが読めない」という最悪の挙動になります。私はこれを2014年から個人開発でiOSアプリを触ってきた経験の中で何度も踏んでいて、いまでも新しいExtensionを足すたびにentitlementsの差分を最初に確認する癖がついています。

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

この記事の続きを読む

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

この記事で得られること
App Group・共有UserDefaults・タイムライン更新を一本の設計に収め、ウィジェットが古いまま固まる問題を根本から断ちます
システムの更新予算と折り合うreload設計、App Intentによる即時反映、widgetURLからExpoルーティングへのディープリンクまでを実装コード付きで解説します
TestFlightでは動くのにストア配信版だけ壊れる配信プロファイルの落とし穴と、その確認手順をまとめます
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-06-12
Rork 製アプリにホーム画面ウィジェットを追加する — Expo の制約を越えて WidgetKit を動かすまで
Rork が生成する Expo アプリにはホーム画面ウィジェットを直接追加できません。config plugin と App Group を使って WidgetKit を組み込む実装ルートを、詰まった点も含めて手順で整理します。
開発ツール2026-06-22
毎朝違う一言を出す日替わりリマインダーが、ある日から鳴らなくなる——iOSの保留64件という見えない上限
Rork(Expo)で作った日替わりリマインダーが、しばらく経つと無言で止まる原因はiOSの保留通知64件上限です。固定文言のカレンダートリガーと、日替わりコンテンツのローリング再スケジュールを動くコードで設計し、サマータイムや複数リマインダー併用でも狂わない通知を組みます。
開発ツール2026-06-15
Rork 製アプリのウィジェットにタップで動くボタンを置く — App Intents で「アプリを開かない操作」を実装する
Rork が生成する Expo アプリのウィジェットに、タップしてもアプリを開かずに状態を変えるボタンを置く方法です。App Intents と WidgetKit を App Group で結び、reloadTimelines まで往復させる実装を、詰まった2か所も含めて手順で整理します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →