◉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-04-16中級

シミュレーターで動くのに実機でクラッシュ — Rork Max アプリの原因特定と修正ガイド

Rork Maxで生成したSwiftUIアプリがシミュレーターでは動くのに実機でクラッシュする問題を、5つのパターン別に解説します。挙動が異なる理由、クラッシュログの読み方による原因の特定、実機テストの習慣づけ、クラッシュ直後のチェックリストまで紹介します。

Rork Max236SwiftUI66デバッグ22クラッシュ5実機テスト15トラブルシューティング85iOS115

Rork Max でネイティブアプリを生成して「シミュレーターでは問題なく動くのに、実機に入れたとたんクラッシュする」という経験をされた方は多いのではないでしょうか。

これは iOS 開発の世界で昔から繰り返されるトラブルのひとつです。AI でコードが自動生成されるようになった今も、残念ながらこの問題は変わらず起きます。むしろ、生成コードが膨大になるぶん、原因の特定に時間がかかることもあります。

ここではRork Max 利用者が実際によく遭遇するクラッシュパターンを5つに絞り、それぞれの原因と修正方法を具体的にご紹介します。

なぜシミュレーターと実機で挙動が異なるのか

まずは前提として、この差異が生まれる理由をご理解いただくと、問題解決の筋道が立てやすくなります。

CPU アーキテクチャの違いがもっとも根本的な原因のひとつです。Mac 上のシミュレーターは x86_64(Intel Mac)または arm64(Apple Silicon Mac)で動作しますが、iOS 実機は arm64 のみです。ライブラリが特定アーキテクチャ向けにビルドされていると、シミュレーターでは動いても実機で動かないケースが出てきます。

メモリの扱いも大きく異なります。 シミュレーターは Mac のメモリを自由に使えるため、数 GB のメモリを消費するコードも平然と動きます。一方、実機は搭載メモリが限られており、iOS の jetsam(メモリ管理)が容赦なくプロセスをキルします。

パーミッションとサンドボックスも実機だけに厳しく適用されます。Info.plist に使用説明文を書いていないカメラや位置情報へのアクセスは、シミュレーターでは見逃されることがありますが、実機では即座にクラッシュします。

よくある5つのクラッシュパターンと修正方法

パターン1: Info.plist のプライバシー使用説明文が不足している

最も多いのがこのケースです。カメラ・マイク・位置情報・フォトライブラリなどにアクセスするコードを Rork Max が生成した場合、対応する NSXxxUsageDescription が Info.plist に入っていないとアプリは即クラッシュします。

// Rork Max が生成するカメラアクセスコード例
import AVFoundation
 
func requestCameraAccess() {
    AVCaptureDevice.requestAccess(for: .video) { granted in
        // この処理の前にInfo.plistの記述が必須
    }
}

修正は Rork Max のプロジェクト設定(Info.plist に相当する部分)に以下を追加することです。

NSCameraUsageDescription = "プロフィール写真の撮影に使用します"
NSPhotoLibraryUsageDescription = "写真の選択と保存に使用します"
NSMicrophoneUsageDescription = "動画撮影時の音声収録に使用します"
NSLocationWhenInUseUsageDescription = "近くのスポットを表示するために使用します"

Rork Max のプロンプトに「カメラを使う機能を追加する際は、Info.plist のプライバシー説明文も一緒に追加してください」と明示すると、生成時に含めてもらいやすくなります。

パターン2: EAS Build の Entitlement 不足

プッシュ通知・App Groups・Sign in with Apple・HealthKit などの機能は、Entitlements ファイルへの記述が必要です。シミュレーターでは Entitlements が無くても動作するため、実機テストで初めて発覚するケースが多いです。

Rork Max の EAS Build 設定(app.json)を確認してください。

{
  "expo": {
    "ios": {
      "bundleIdentifier": "com.yourname.yourapp",
      "entitlements": {
        "aps-environment": "production",
        "com.apple.developer.associated-domains": ["applinks:yourapp.com"]
      }
    }
  }
}

特に aps-environment は development(TestFlight 用)と production(App Store 用)で正しく切り替える必要があります。EAS Build のプロファイル設定を見直してみてください。

パターン3: サードパーティライブラリのアーキテクチャ問題

Rork Max が npm パッケージを介してネイティブモジュールを取り込んだ場合、そのモジュールが arm64 実機向けにビルドされていないと動きません。

クラッシュログに Termination Reason: Namespace DYLD, Code 1 Library missing や image not found が出ていたら、このパターンを疑ってください。

# EAS Build ログでアーキテクチャエラーを確認する
eas build --platform ios --profile preview --local
 
# ビルド済み .ipa の中のバイナリアーキテクチャを確認
lipo -archs YourApp.app/YourApp
# → arm64 のみ表示されるのが正常

このエラーが出た場合、問題のあるライブラリを最新バージョンに更新するか、Rork Max のプロンプトで「React Native 0.73 以降対応のライブラリを使ってください」と指定して再生成するのが有効です。

パターン4: メモリ不足による強制終了(jetsam kill)

画像処理・機械学習モデル・大量のデータ読み込みをシミュレーターで試すと余裕で動くのに、実機(特に古い iPhone)では強制終了されるケースです。

クラッシュログに EXC_RESOURCE RESOURCE_TYPE_MEMORY や jetsam の文字が出ていれば確認です。

// 画像をメモリ上に全部展開してしまうコード(危険)
let images = urls.map { UIImage(contentsOfFile: $0.path) } // シミュレーターでは動く
 
// 推奨: 必要なときだけ読み込む
func loadImage(at url: URL) -> UIImage? {
    // ディスクから逐次読み込みにすることでメモリを節約
    return UIImage(contentsOfFile: url.path)
}

Rork Max に対して「メモリ効率を考慮して、画像は遅延読み込みにしてください」と指示すると、LazyVStack や AsyncImage を使ったコードを生成してもらえます。

パターン5: CoreML モデルが実機の Neural Engine に対応していない

AI 機能を含むアプリで CoreML を使う場合、モデルが特定の計算ユニット(Neural Engine)向けにコンパイルされていないと、実機でのパフォーマンスが著しく低下したり、場合によってはクラッシュしたりします。

// CoreML モデルのロード時に計算ユニットを明示する
let config = MLModelConfiguration()
config.computeUnits = .all // CPU・GPU・Neural Engine を状況に応じて自動選択
 
do {
    let model = try MyMLModel(configuration: config)
    // モデル使用
} catch {
    // エラーハンドリングを必ず実装する
    print("モデルのロードに失敗しました: \(error.localizedDescription)")
}

Rork Max に CoreML を使う機能を生成させる際は、「CoreML のモデルロード時にエラーハンドリングと計算ユニット設定を含めてください」と明示するとよいでしょう。

クラッシュログの読み方 — 原因の素早い特定

実機でクラッシュが起きたとき、原因を特定する最短ルートはクラッシュログを読むことです。

TestFlight 経由のクラッシュ: App Store Connect の「TestFlight」→「クラッシュ」タブに自動収集されます。

Xcode Organizer: デバイスを繋いで Xcode の「Window」→「Organizer」→「Crashes」を開くと、接続した実機のクラッシュログが確認できます。

見るべき主なフィールドは以下の2つです。

Exception Type: EXC_BAD_ACCESS (SIGSEGV)  ← メモリ参照エラー
Exception Type: EXC_CRASH (SIGABRT)       ← アサーション・フォース終了

Thread 0 Crashed:
0  libswiftCore.dylib    0x... swift_unknownObjectRetain  ← Swiftのメモリ管理問題
1  YourApp               0x... ContentView.body.getter    ← クラッシュした箇所

スタックトレースの一番上から順番に読んでいくと、クラッシュが起きた箇所がわかります。YourApp から始まる行(自分のコード)に注目するのが基本です。

シミュレーター依存を断ち切るための実機テスト習慣

根本的な解決策として、TestFlight を開発の早い段階から使うことをお勧めします。機能が完成してからまとめて実機テストするのではなく、1画面作ったら TestFlight に入れるというサイクルにすると、問題の発見が早く修正コストも小さく済みます。

Rork Max での開発フローとしては、プロンプトで機能を追加するたびに EAS Build を走らせて TestFlight 配布するのが理想的です。詳しいビルド〜配布の流れはRork Max TestFlight ガイドをご覧ください。

また、実機特有のバグが多い場合は、Rork Max ビルドエラー完全解決ガイドも合わせて参考にしていただければ、より広い範囲のトラブルに対応できます。

最初にやること — クラッシュ直後のチェックリスト

実機でクラッシュが発生したときに最初に確認すべきことをまとめます。

  • Info.plist に必要なプライバシー使用説明文がすべて記述されているか
  • Entitlements に使用している機能(プッシュ通知・Associated Domains 等)が含まれているか
  • クラッシュログの Exception Type を確認して原因を絞り込む
  • TestFlight で配布して複数の実機(特に古めのデバイス)で検証する
  • メモリ使用量が異常に多い処理がないか Xcode Instruments で確認する

シミュレーターと実機の差異は「なぜか動かない」ではなく、必ず理由があります。クラッシュログを手がかりにひとつずつ確認していくと、ほとんどのケースで解決できます。まずはクラッシュログを開いてみてください。

シェア

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

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

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

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

関連記事

⬡ 開発ツール2026-05-15
Rork Max Android アプリが古い OS バージョンだけクラッシュする原因と Java 8 デシュガリング修正
Rork Max で生成した Android アプリが古い OS バージョン(Android 6〜8 など)でのみクラッシュする問題の診断方法と、Java 8 デシュガリング設定による根本解決を解説します。
⬡ 開発ツール2026-09-21
exit code 0 で止まるビルド — ログを黙らせていた設定と、空ファイルを通した存在チェック
eas build --local が exit code 0 but produced no further output で止まる件と、0 バイトのスタブが埋め込まれず dyld で落ちる件。どちらも原因は出力を減らす設定でした。自分のスクリプトを棚卸しする手順まで書き残します。
⬡ 開発ツール2026-07-18
文字サイズ最大とドイツ語で、生成された画面は静かに詰まる — Rork Max の SwiftUI にレイアウト耐性の検証を通した記録
Rork Max が生成した SwiftUI 画面を疑似ローカライズと最大文字サイズに通し、どこから詰まるかを機械的に洗い出した記録です。ViewThatFits・ScaledMetric・layoutPriority の使いどころと、再生成のたびに回帰を捕まえるスナップショット検証を、実際の数値とともにまとめました。