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-04-19中級

Rorkで作ったアプリが実機でクラッシュする——原因別の対処法

Rorkで生成したアプリがプレビューでは動くのに実機でクラッシュする問題の対処法。環境変数・ネイティブモジュール・Expo設定の落とし穴を原因別に整理しました。

troubleshooting25crash3expo11rork-max41native2debug

「Rorkのプレビューでは完璧に動いていたのに、実機にインストールしたらすぐクラッシュする」——この問題、思ったより多くの方が経験されています。

Rorkが生成するのはExpo (React Native) ベースのアプリです。Rork上のプレビュー環境と実機の間には、ネイティブモジュールの有無・環境変数の扱い・OS固有の挙動など、いくつかの重要な違いがあります。原因を知っていれば、多くのケースで30分以内に解決できます。

クラッシュの種類を見分ける

対処法は原因によって変わるため、まず「いつクラッシュするか」を観察することが大切です。

起動直後にクラッシュする場合 → 環境変数の未設定・ネイティブモジュールの初期化エラーの可能性が高い

特定の操作をしたときにクラッシュする場合 → そのアクションに使われているコードまたはAPIの問題

iOSだけ(またはAndroidだけ)でクラッシュする場合 → プラットフォーム固有のパーミッションまたはネイティブAPIの問題

この観察だけで、確認すべき範囲が大幅に絞れます。

原因1: 環境変数の未設定

Rorkのプレビュー環境では、設定画面で入力した環境変数(APIキー、URLなど)が自動的に注入されます。しかし、実機ビルドでは別途設定が必要です。

クラッシュログを確認すると、以下のようなエラーが出ていることがあります。

TypeError: undefined is not an object (evaluating 'process.env.EXPO_PUBLIC_API_KEY.length')

修正方法:

Expo Goを使っている場合は、プロジェクトルートに .env.local を作成します。

# .env.local(ローカル実機テスト用)
EXPO_PUBLIC_API_KEY=your_actual_api_key_here
EXPO_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
EXPO_PUBLIC_SUPABASE_ANON_KEY=your_anon_key_here

EASビルド(App Store提出用)の場合は、eas.json に設定するか、EASダッシュボードの「Environment Variables」に登録します。

{
  "build": {
    "production": {
      "env": {
        "EXPO_PUBLIC_API_KEY": "your_production_key"
      }
    }
  }
}

また、コード側では undefined チェックを追加しておくと、デバッグが格段に楽になります。

const apiKey = process.env.EXPO_PUBLIC_API_KEY;
if (\!apiKey) {
  console.error('API key is not configured. Check your .env file.');
  // アプリをクラッシュさせるより、エラーUIを表示する方がデバッグしやすい
}

原因2: ネイティブモジュールの互換性問題

Rorkが生成するコードには expo-cameraexpo-locationexpo-notifications などのネイティブモジュールが含まれることがあります。Expo GoやEAS Buildのバージョンと、これらのモジュールのバージョンが合っていないとクラッシュします。

確認手順:

# 現在のExpo SDKバージョンを確認
cat package.json | grep '"expo"'
 
# Expo Go の対応SDKバージョンを確認(公式ドキュメントで確認)
# https://docs.expo.dev/versions/latest/
 
# package.json のバージョンを固定する(Rorkが生成するコードは最新版を指定することが多い)
npx expo install --fix

特に expo-notificationsexpo-camera はバージョン差異によるクラッシュが多いモジュールです。

# よくある問題のあるパッケージを一括で互換バージョンに修正
npx expo install expo-notifications expo-camera expo-location expo-image-picker

原因3: iOS/Android固有のパーミッション設定漏れ

カメラ・位置情報・通知などを使うアプリは、ネイティブの権限リクエスト設定が必要です。Rorkのコード生成では app.json の設定が不十分な場合があります。

// app.json に追加が必要な設定例
{
  "expo": {
    "ios": {
      "infoPlist": {
        "NSCameraUsageDescription": "写真を撮影するためにカメラへのアクセスが必要です",
        "NSLocationWhenInUseUsageDescription": "現在地を取得するために位置情報へのアクセスが必要です",
        "NSMicrophoneUsageDescription": "音声入力のためにマイクへのアクセスが必要です"
      }
    },
    "android": {
      "permissions": [
        "CAMERA",
        "ACCESS_FINE_LOCATION",
        "RECORD_AUDIO"
      ]
    },
    "plugins": [
      ["expo-camera", { "cameraPermission": "写真撮影のためにカメラを使用します" }],
      ["expo-location", { "locationWhenInUsePermission": "現在地取得のため" }]
    ]
  }
}

この設定が漏れていると、iOSでは権限ダイアログが表示されずに即クラッシュ、Androidでは SecurityException が発生します。

原因4: Supabase・Firebase等の初期化タイミング

バックエンドサービスの初期化コードが非同期処理に対応していない場合、実機では起動時のタイミング差でクラッシュすることがあります。

// ❌ 非同期初期化が完了する前にデータ取得しようとするパターン
useEffect(() => {
  fetchUserData(); // supabaseクライアントがまだ初期化されていない可能性
}, []);
 
// ✅ 初期化完了を待つパターン
const [isReady, setIsReady] = useState(false);
 
useEffect(() => {
  const initialize = async () => {
    // 必要な初期化処理を全て完了させる
    await supabase.auth.getSession();
    setIsReady(true);
  };
  initialize();
}, []);
 
// isReady が true になるまでローディング画面を表示
if (\!isReady) {
  return <LoadingScreen />;
}

クラッシュログの読み方

実機でクラッシュした場合、ログを確認するのが一番の近道です。

iOS の場合: Xcodeを開いて Window → Devices and Simulators → 対象デバイス → View Device Logs でクラッシュレポートを確認できます。

Android の場合:

adb logcat *:E | grep "ReactNative\|expo"

Expo Go の場合: アプリをシェイクしてデバッグメニューを開き、Remote JS Debugging をオンにすると、Chromeのコンソールでエラーが確認できます。

まずやること

実機クラッシュに遭遇したら、以下の順番で確認してみてください。

  1. 環境変数が実機環境にも設定されているか確認する
  2. npx expo install --fix でモジュールバージョンを修正する
  3. app.json に使用している機能のパーミッション設定があるか確認する
  4. クラッシュログを確認して、エラーメッセージを特定する

Rorkが生成するコードはプレビュー環境で動くことを前提に作られているため、本番ビルドでは上記の追加設定が必要になることが多いです。慣れれば設定パターンは決まってくるので、最初の数アプリで一通り経験しておくと、その後の開発がずっとスムーズになります。

シェア

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

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

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

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

関連記事

開発ツール2026-06-17
誕生日を集めずに年齢を確認する — Declared Age Range API を Rork アプリに組み込む
iOS 26 の Declared Age Range API を使い、生年月日を保存せずに年齢層だけを受け取る実装方法。Rork Max のネイティブ Swift と、標準 Rork(Expo)のネイティブモジュール越しの呼び出しを、責務の線引きとともに整理します。
開発ツール2026-05-23
Rork Max で生成した Swift コードを Xcode で「赤いエラーだけ」消すまでの優先順序
Rork Max が生成した Swift プロジェクトを Xcode で開いたときに出る赤いエラーを、どの順序で潰すと最短で実機ビルドに到達するか。私が壁紙アプリ運営の経験から作った優先順序のメモです。
開発ツール2026-05-23
Rork 生成プロジェクト特有の expo start --offline forbidden — テンプレ構成が原因の4パターン
Rork が生成するテンプレート構成が原因で expo start --offline が forbidden になる4つのパターン(tsconfigPaths・expo-router キャッシュ・ネイティブプリビルド・lock 不一致)を、Rork プロジェクト固有の観点で切り分けます。汎用的な Expo 側の対処(プロキシ403・依存検証)は別記事にまとめています。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →