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

Rork生成アプリにネイティブモジュールを追加する — Expo Prebuild実践ガイド

Rorkで作ったプロトタイプにネイティブSDKやカスタムモジュールを追加したくなったとき、Expo Prebuildをどう使うかを実践的に解説します。Managed Workflowの限界とBare Workflowへの移行手順を具体的なコマンド例とともに整理します。

Rork515Expo Prebuildネイティブモジュール9React Native209EAS Build14Config Plugin3

Rorkでアプリのプロトタイプは作れたものの、いざ本番化を考え始めると「このSDKを追加したい」「このネイティブ機能を呼びたい」という壁にぶつかる方は多いのではないでしょうか。Stripe Mobile SDKの完全機能を使いたい、特殊なBLEデバイスと通信したい、社内独自のSDKを統合したい — こうしたケースで登場するのがExpo Prebuildです。

RorkアプリとExpoの関係をもう一度確認する

まず前提を整理しておきます。Rorkが出力するのは、app.jsonpackage.jsonを中心としたExpo Managed Workflowのプロジェクトです。ios/android/のディレクトリは存在せず、ネイティブビルドはEAS(Expo Application Services)に丸投げできる構成になっています。

この設計は、最初の数週間で動くアプリを作るには明確に強力です。しかし「Expoのexpo-系ライブラリでカバーされていない機能を使いたい」「特定のSDKがManaged Workflowでは動かない」という状況になると、ネイティブコードを書く必要が出てきます。

そのときに選べる道は次の3つです。

  • Config Plugin で済ませる: ネイティブ設定の追加だけで対応できるケース(権限文字列、Info.plist、AndroidManifest等)
  • Prebuild + 既存ネイティブモジュールを追加: NPMで配布されているネイティブモジュールを統合する
  • Prebuild + 自作ネイティブモジュールを追加: SwiftやKotlinでオリジナルの機能を実装する

どの道を選ぶかは、追加したい機能の性質によります。私の経験では、いきなりネイティブコードを書きに行くのではなく、まず「Config Pluginで足りないか」を確認するのが結果的に早道になります。

Prebuildに踏み切る前のチェックリスト

ネイティブコードに踏み込むと、後戻りはできなくはないものの、メンテナンスコストは確実に上がります。Prebuildする前に、以下を順番に確認することをおすすめします。

  • 追加したい機能はExpoのfirst-partyライブラリ(expo-cameraexpo-notifications等)でカバーされていないか
  • Expo Modulesエコシステム上で配布されているサードパーティライブラリで足りないか
  • やりたいことが「ネイティブ設定の変更」だけなら、Config Pluginを書くだけで済まないか
  • 本当にネイティブコードに踏み込む必要があるか、それとも別のアーキテクチャ(WebView経由、サーバー側処理)で代替できないか

ここで「Yes、ネイティブが必要」となって初めてPrebuildの出番です。

Expo Prebuildの基本コマンド

Prebuildは、app.jsonの設定をもとにios/android/のディレクトリを生成するコマンドです。Bare Workflowへの完全な移行ではなく、設定ファイルから毎回ネイティブプロジェクトを再生成する「CNG(Continuous Native Generation)」というアプローチを採用しています。

# 1. プロジェクトのバックアップ(重要)
git add . && git commit -m "Snapshot before prebuild"
 
# 2. 必要に応じてSDKバージョンを揃える
npx expo install --check
 
# 3. Prebuild実行(クリーンビルド推奨)
npx expo prebuild --clean
 
# 4. iOSの依存関係をインストール
cd ios && pod install && cd ..
 
# 5. ローカルで起動確認
npx expo run:ios   # または npx expo run:android

--cleanフラグは既存のios/android/を削除してから再生成するため、ネイティブディレクトリに手動で加えた変更は消えます。これが落とし穴になりやすいので、後述する「ネイティブ変更の永続化」に従ってください。

ネイティブモジュールを追加する具体例

例として、react-native-mlkit-ocrのようなネイティブビルドが必要なライブラリを追加する流れを見てみます。

# 1. ライブラリをインストール
npx expo install react-native-mlkit-ocr
 
# 2. Prebuildを再実行(ネイティブ依存を反映)
npx expo prebuild --clean
 
# 3. iOS依存関係を再インストール
cd ios && pod install && cd ..
 
# 4. ビルド確認
npx expo run:ios

ポイントは、ライブラリ追加後に必ずprebuild --cleanを再実行することです。これを忘れると、Podfileにライブラリのエントリが追加されず、ビルド時に「Native module cannot be found」エラーに遭遇します。私も最初の頃、この一手間を省いて30分溶かしたことがあります。

ネイティブ変更を永続化する2つの方法

prebuild --cleanはネイティブディレクトリを毎回再生成するため、Info.plistに手で書き足した設定や、AppDelegate.swiftに追加したコードはすべて失われます。これを防ぐには2つのアプローチがあります。

アプローチ1: Config Pluginで宣言的に管理する

Expo Config Pluginは、app.jsonの設定からネイティブファイルを書き換える仕組みです。例えばInfo.plistにカメラ使用許可文を追加するなら、以下のようにプラグインを書きます。

// plugins/with-camera-usage.js
const { withInfoPlist } = require('@expo/config-plugins');
 
module.exports = function withCameraUsage(config) {
  return withInfoPlist(config, (cfg) => {
    cfg.modResults.NSCameraUsageDescription =
      '名刺をスキャンするためにカメラを使用します';
    return cfg;
  });
};

そしてapp.jsonに登録します。

{
  "expo": {
    "plugins": ["./plugins/with-camera-usage"]
  }
}

これでprebuild --cleanを何度実行しても、設定が再現されます。

アプローチ2: Prebuildを諦めてBare Workflowに完全移行する

ネイティブコードの変更が広範囲に及ぶ場合は、prebuildをやめてios/android/をリポジトリにコミットし、Bare Workflowとして運用する選択肢もあります。ただしExpo SDKのバージョンアップ時にネイティブ側のマージ作業が発生するため、私はできる限りConfig Pluginで完結させる方針を取っています。

EAS Buildとの組み合わせ方

Prebuild後は、ローカルでビルドしてもよいのですが、EAS Buildを使うと環境差異を気にせずクラウドでビルドできます。eas.jsonは次のような構成が基本です。

{
  "cli": { "version": ">= 5.0.0" },
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal"
    },
    "preview": {
      "distribution": "internal",
      "ios": { "simulator": true }
    },
    "production": {
      "autoIncrement": true
    }
  }
}

ビルドコマンドは次のとおりです。

# 開発用ビルド(実機で動作確認)
eas build --profile development --platform ios
 
# TestFlight配信用
eas build --profile production --platform ios --auto-submit

EAS Buildはビルドのたびに自動でPrebuildを実行するため、ローカルではprebuildしなくてもCI上でネイティブプロジェクトが組み立てられます。ただし、ローカル開発でexpo run:iosを使いたい場合は、ローカルでも一度prebuildしておく必要があります。

つまずきやすいポイントと対処法

実際にPrebuildを使ってきて、よく遭遇する問題を3つ挙げます。

1. pod installがXcodeバージョン非互換でエラー

iOSのCocoaPodsは、Xcodeのバージョンとデプロイメントターゲットに敏感です。Podfileplatform :ios, '15.1'のような行と、各ライブラリが要求するiOS最低バージョンが噛み合わないとエラーになります。EAS Buildでimage: latestを指定しておくと、Cloudのビルド環境では最新のXcodeが使われるため、ローカルとの差異を最小化できます。

2. prebuild後にexpo-routerが動かなくなる

Rork生成アプリはexpo-routerに強く依存していますが、Prebuild後にAppDelegateが書き換わると、初期化順序が変わって画面が真っ白になることがあります。これは@expo/config-pluginsが同梱するexpo-routerのプラグインが正しく適用されているかを確認することで解決します。app.jsonplugins配列にexpo-routerが含まれているか必ずチェックしてください。

3. AndroidビルドでCould not find com.facebook.react:react-native

Androidでこのエラーが出るときは、android/build.gradleallprojects.repositoriesmaven { url 'https://www.jitpack.io' }が追加されていないケースが多いです。Config PluginのwithProjectBuildGradleで書き加えるか、ライブラリ側のドキュメントを再確認してください。

生成されたAppDelegateを読むだけで理解が一段深まる

私が個人的に習慣にしているのは、初めてPrebuildを実行したプロジェクトでは必ずios/{プロジェクト名}/AppDelegate.swiftを一度読んでみることです。最近のExpo Prebuildが生成するAppDelegateは比較的コンパクトで、ほとんどの処理をExpoAppDelegateに委譲しています。5分かけて目を通すだけで、次のことが一気にクリアになります。

  • プッシュ通知のトークンがどう受け渡されるか
  • URLハンドラがexpo-linkingや他のプラグインとどう協調しているか
  • バックグラウンドフェッチのエントリーポイントで何が起きているか
  • ExpoReactNativeFactoryがブリッジをどう初期化しているか

後でプッシュ通知がJS層まで届かない、ディープリンクが想定の画面に飛ばないといった問題に直面したとき、すでに頭の中にマップができているとブレークポイントを置く場所の見当がつきます。このマップがないままネイティブ側のデバッグに踏み込むと、当てずっぽうの作業になりがちです。

Androidについても同じで、android/app/src/main/java/.../MainApplication.ktを一度読んでおくと、プロジェクト全体の見通しが大きく変わります。生成コードは魔法ではないので、一度目を通すだけで「不透明なブラックボックス」感が消えるはずです。

マシン間でPrebuildの結果を再現可能にする

協業を始めた瞬間、あるいはCIに移した瞬間に効いてくるのが、ローカルのXcode・Node・CocoaPods・Rubyのバージョン差異です。これらを揃えておくと、Prebuildの結果が安定します。

# .nvmrc
20.11.1
 
# .ruby-version
3.2.2
 
# Podfile(Expoが既に設定済みだが確認推奨)
platform :ios, podfile_properties['ios.deploymentTarget'] || '15.1'

EAS Build側のXcodeバージョンはeas.jsonで固定します。

{
  "build": {
    "production": {
      "ios": { "image": "latest" }
    }
  }
}

これらが揃ってくると、「ローカルでは動くがCIで失敗する」という状況が確実に減ります。私の経験上、ここを最初に固めておくのが結果的にもっとも時間を節約してくれます。

より深く学ぶための参考資料

また、Rork × EAS の運用フローについては、Rork × EAS Build × GitHub Actions で完全自動化CI/CDパイプラインを構築するで実例とともに解説しているので、CI/CDまで踏み込みたい方はそちらも合わせてご覧ください。

ネイティブモジュール追加で個別のエラーに遭遇した場合は、Rork Max + EAS Build カスタムネイティブモジュール導入エラー完全解決ガイドに具体的なエラーパターンと対処法をまとめています。

全体を振り返ってに代えて — 次の一歩

Expo Prebuildは「Rorkで動くプロトタイプ」と「本番運用に耐えるネイティブアプリ」の間にある最も重要な橋渡しです。最初の一歩としておすすめするのは、いきなり大きなSDKを統合するのではなく、まず**expo prebuild --cleanを実行してネイティブディレクトリが生成されることを確認する**ことです。生成されたios/android/を眺めるだけでも、ManagedとBareの違いが体感的に理解できます。

そこから先は、追加したい機能を1つずつConfig Pluginで管理する習慣をつけていけば、長期的にメンテナンス可能なRorkアプリの基盤が整います。プロトタイプから本番アプリへの最後の一押しに、本記事の内容が役立てば嬉しいです。

シェア

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

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

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

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

関連記事

開発ツール2026-05-06
Rork アプリに Expo Dev Client を導入する手順 — ネイティブモジュールが Expo Go で動かなくなったときの最初の一手
Rork で生成したアプリに react-native-mmkv や RevenueCat などのネイティブモジュールを追加すると、Expo Go では起動しなくなります。Expo Dev Client(カスタム開発ビルド)の導入手順と、つまずきやすい3つのポイントを実例付きで解説します。
開発ツール2026-06-29
Rork × Vision Camera v4:QR・OCR・ML推論まで本番投入できるカメラ機能を仕上げる実装ノート
Rork のアプリで React Native Vision Camera v4 を本番品質に仕上げる実装手順を、フレームプロセッサ・ML 推論・QR/OCR から、発熱対策・実機テストマトリクス・ストア審査・段階リリースまで通してお伝えします。
開発ツール2026-05-11
Rork と Expo CLI、実機ビルドの体験はどう違うか — 個人開発12年の視点で比べた話
個人アプリ開発12年・累計5,000万DLの立場から、Rorkの実機ビルドフローとExpo CLIを実際に使い比べた記録。ターミナルに慣れた開発者がRorkに感じる距離感と、逆にRorkが優れていた点を率直に整理します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →