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-06-02中級

iOS 実機の Release ビルドで『No bundle URL present』が出るときの原因と対処

Rork から書き出したアプリを Xcode でローカルビルドしたときに出やすい『No bundle URL present』エラーの読み解き方をまとめました。Metro 接続が切れている場合と、Release ビルドに JS バンドルが埋め込まれていない場合を切り分け、オフラインバンドルを手動生成する手順までコード付きで解説します。

Rork515Expo149iOS108Metro4エラー対処3

壁紙アプリに WidgetKit 拡張を足したくて、Rork から書き出した Expo プロジェクトを Xcode で開き、実機に Release 構成でインストールした直後のことでした。スプラッシュが消えた瞬間、画面いっぱいに赤い文字が出ます。

No bundle URL present.

Make sure you're running a packager server or have included a .jsbundle file in your application bundle.

開発ビルドでは問題なく動いていたので、最初は自分のコードを疑いました。けれど原因はコードではなく、「JavaScript の中身がアプリのどこにも見当たらない」という、もっと手前の話でした。同じ赤い画面を Debug ビルドで見たことのある方もいると思いますが、Debug と Release では出る理由がまったく違います。ここを取り違えると半日溶かします。私も実際に溶かしました。

このエラーが伝えていること

No bundle URL present は、ネイティブ側(iOS アプリの本体)が起動時に「どこから JavaScript を読み込めばいいのか分からない」状態です。React Native / Expo のアプリは、ネイティブの殻の中に JavaScript の塊(バンドル)を抱えて動きます。そのバンドルの在りかは2通りあります。

  • Debug ビルド: Mac 上で動く Metro バンドラに http://<MacのIP>:8081 でつなぎ、その場で読み込む
  • Release ビルド: アプリの中に焼き込まれた main.jsbundle というファイルから読み込む

赤い画面は「この2つのどちらも見つからなかった」というサインです。つまり原因の切り分けは、まず Debug で出たのか Release で出たのか から始まります。

Debug ビルドで出た場合 — Metro につながっていない

Xcode の構成が Debug のまま実機に入れたなら、ほぼ Metro 接続の問題です。私が遭遇したケースで多かった順に並べます。

  1. Metro を起動していない。 ターミナルで npx expo start を立ち上げ忘れていただけ、というのが一番多い落とし穴です。
  2. Mac と iPhone が別の Wi-Fi にいる。 実機は localhost では Mac に届きません。同じネットワークに乗せるのが大前提です。
  3. 会社や自宅のルーターが端末間通信を遮断している。 ゲスト用 SSID やクライアント分離が有効な Wi-Fi だと、同じ SSID でも通信が通りません。

切り分けは単純で、iPhone の Safari で http://<MacのIP>:8081/status を開いてみてください。packager-status:running と返ってくれば経路は生きています。返ってこなければネットワーク側の問題です。

確実なのは、実機を USB でつないで次のコマンドで入れ直す方法です。

# 実機を USB 接続した状態で、ポートフォワードしつつ起動する
npx expo run:ios --device

expo run:ios は内部で xcrun devicectl などを使って端末を解決し、Metro へのポートも面倒を見てくれます。Wi-Fi が不安定な環境では、これが一番ストレスがありません。

Release ビルドで出た場合 — バンドルが焼き込まれていない

ここからが本題です。Release 構成では Metro につなぎません。アプリの中に main.jsbundle が入っていることが絶対条件で、それが無いと赤い画面になります。Rork から書き出したプロジェクトをローカルの Xcode でいじり始めた人が、ここで一番つまずきます。

原因は大きく2つです。

1. バンドル生成のビルドフェーズが走っていない

React Native の iOS プロジェクトには、ビルド時に JS をまとめる「Bundle React Native code and images」というシェルスクリプトのビルドフェーズがあります。Expo の prebuild で生成された素のプロジェクトには入っているはずですが、ネイティブを手で触っているうちにスキップ設定にしてしまったり、スクリプトの参照パスがずれていたりすると、Release でもバンドルが作られません。

Xcode で対象ターゲット → Build Phases を開き、Bundle React Native code and images フェーズが存在し、Run script only when installing のチェックが外れていることを確認してください。チェックが入っていると、通常の Run では走らず、Archive 時だけ走るため「実機に入れたら赤い画面、でも Archive は通る」という分かりにくい症状になります。

2. そもそも expo run:ios --configuration Release を使っていない

素の xcodebuild や Xcode の Run をそのまま Release で叩くより、Expo に Release ビルドを任せたほうが確実です。

# Expo にバンドル埋め込みごと Release ビルドを任せる
npx expo run:ios --configuration Release --device

このコマンドは内部でバンドルの生成とアプリへの同梱を済ませてから実機に入れてくれるので、手動のビルドフェーズ設定で悩む時間がぐっと減ります。

応急処置 — オフラインバンドルを手で作る

ビルドフェーズの設定をいじる前に「とにかく今すぐ実機で動かして確認したい」ときは、バンドルを手動で生成してプロジェクトに置く方法があります。

# ios ディレクトリ配下に main.jsbundle とアセットを生成する
npx react-native bundle \
  --platform ios \
  --dev false \
  --entry-file index.js \
  --bundle-output ios/main.jsbundle \
  --assets-dest ios

--entry-file は Expo Router を使っているプロジェクトでは node_modules/expo-router/entry.js になることがあります。エントリが見つからないと言われたら、package.jsonmain フィールドを確認してください。生成した main.jsbundle を Xcode のプロジェクトに「Create folder references」ではなくターゲットに追加しておけば、Release でもそこから読み込まれます。

ただしこれはあくまで応急処置です。手で置いたバンドルはコードを変えても自動更新されないため、原因(ビルドフェーズ)を直したら手動バンドルは外しておくのが安全です。何度かこの罠を踏んで、「動いたと思ったら古い JS が焼き込まれたままだった」という二次災害を起こしたので、ここは強めに書いておきます。

切り分けの順番(迷ったらこの順で)

赤い画面を見たら、私はいつもこの順で潰していきます。

  1. 構成は Debug か Release か(Xcode のスキーム左上で確認)
  2. Debug なら Metro が起動しているか、実機と Mac が同じ Wi-Fi か
  3. Release なら Build Phases にバンドル生成フェーズがあり、only when installing が外れているか
  4. それでも駄目なら expo run:ios --configuration Release --device で焼き直す
  5. 原因究明より先に動作確認を急ぐなら、オフラインバンドルを手動生成

この順を守るだけで、「コードを疑って延々ログを読む」という遠回りを避けられます。

予防 — 二度と半日溶かさないために

私は累計5,000万ダウンロードのアプリを2014年から個人で運用していますが、Rork で素早く骨格を作り、WidgetKit やライブアクティビティのようなネイティブ機能だけ Xcode で足す、という分業をよくします。そのとき毎回 Release で実機確認する癖をつけてから、このエラーで足を止めることはほぼ無くなりました。開発ビルドだけで「動いた」と判断せず、ストアに出す構成(Release)で一度は実機に入れておく。たったこれだけで、審査直前の青ざめる時間を防げます。

まず手元のプロジェクトを一度 npx expo run:ios --configuration Release --device で実機に入れてみてください。そこで赤い画面が出なければ、あなたの配布ビルドはバンドルをきちんと抱えています。同じところで止まっている方の参考になれば嬉しいです。

シェア

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

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

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

もしこの記事がお役に立ちましたら、チップ(¥150)で応援いただけると大変励みになります。広告なしでの運営を続けるため、皆さまのご支援が大きな力になっています。

関連記事

開発ツール2026-06-29
写真の「選択した項目だけ許可」に正しく向き合う設計
iOS の写真ライブラリ限定アクセス(選択した項目だけ許可)に Rork(Expo)アプリで正しく対応します。フルアクセス・限定・拒否の3状態の判定、選んだ写真だけを扱う前提の画面設計、追加選択を促す導線までを実装コードとともに整理します。
開発ツール2026-06-26
ユーザー自身の画像を「ファイル」アプリから取り込む — Rorkアプリのドキュメントピッカーとセキュリティスコープ付きURL
写真アプリにない画像を「ファイル」アプリやiCloud Driveから取り込むと、選んだはずのURLが直後に無効になります。expo-document-pickerとセキュリティスコープ付きURL、サンドボックスへの確実なコピーまでを、動くコードで整理します。
開発ツール2026-06-15
Rork 製アプリのウィジェットにタップで動くボタンを置く — App Intents で「アプリを開かない操作」を実装する
Rork が生成する Expo アプリのウィジェットに、タップしてもアプリを開かずに状態を変えるボタンを置く方法です。App Intents と WidgetKit を App Group で結び、reloadTimelines まで往復させる実装を、詰まった2か所も含めて手順で整理します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →