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

Rork Max + EAS Build カスタムネイティブモジュール導入エラー完全解決ガイド

Rork MaxアプリにカスタムネイティブモジュールをEAS Buildで導入するときのエラーを完全解決。Config Plugin作成・iOS/Androidビルドエラー・Hermes互換性・Podfileの競合解決まで実例コード付きで解説。

Rork Max229EAS Build14ネイティブモジュール9Config Plugin3iOS108Android43Podfileエラー2

Rork Max + EAS Build カスタムネイティブモジュール導入エラー完全解決ガイド

Rork MaxアプリでExpo SDKにない機能——Bluetoothデバイス連携、カスタムSDK統合、ハードウェアアクセスなど——を実装しようとすると、EAS Buildとカスタムネイティブモジュールの世界に踏み込むことになります。

これは一度乗り越えれば強力な武器になりますが、最初は「なぜビルドが通らないのか」「なぜモジュールが認識されないのか」と詰まることが多いです。

EAS BuildとConfig Pluginの仕組みを正しく理解する

カスタムネイティブモジュールをManaged WorkflowのExpo(Rork Maxが内部で使う方式)に追加するには、Config Pluginが必要です。Config Pluginとは、npx expo prebuild(またはEAS Buildが内部で実行する)のタイミングに、ネイティブコード(iOS PodfileやAndroid build.gradle)を自動的に変更するためのスクリプトです。

多くのライブラリは自前のConfig Pluginを提供しています(@config-plugins/react-native-ble-plxなど)。一方、公式Pluginがないライブラリでは自作が必要です。

全体フローの確認:

app.config.js の plugins 設定
    ↓
npx expo prebuild (EAS Build内で自動実行)
    ↓
ios/ と android/ ディレクトリが生成される
    ↓
iOS: pod install, Android: gradle build
    ↓
バイナリ生成

エラーパターン①:incompatible library または Podfile競合エラー

症状: EAS BuildのiOSビルドログに以下のようなエラーが出る。

[!] CocoaPods could not find compatible versions for pod "SomeLibrary":
  In snapshot (Podfile.lock):
    SomeLibrary (= 1.2.0)
  In Podfile:
    SomeLibrary (~> 2.0)

原因と解決法

複数のネイティブモジュールが同じPodの異なるバージョンを要求しているケースです。

# ios/Podfile に以下を追加して強制バージョンを固定する
# app.config.js の ios.podfileExtraContent ではなく、
# Config Plugin で Podfile を修正するのが正式な方法
 
# config-plugin.js(自作Config Plugin)
const { withPodfile } = require('@expo/config-plugins');
 
module.exports = (config) => {
  return withPodfile(config, (modConfig) => {
    const { modResults } = modConfig;
    
    // 競合するPodのバージョンを固定
    modResults.contents = modResults.contents.replace(
      /# Add any custom podfile content here/,
      `# Add any custom podfile content here
# Force version to resolve conflicts
pod 'SomeLibrary', '~> 2.0.0'`
    );
    
    return modConfig;
  });
};

app.config.jsで適用する:

// app.config.js
export default {
  expo: {
    plugins: [
      './config-plugins/force-pod-version'
    ]
  }
};

Podfile.lockをリセットする手順:

# ローカルのprebuildディレクトリをクリーン
npx expo prebuild --clean
 
# iOSディレクトリのPodをリセット
cd ios && rm Podfile.lock && pod install --repo-update
cd ..
 
# 変更を確認してからEAS Buildに投入

エラーパターン②:Config Pluginが見つからない、または適用されない

症状: ビルドは通るが、モジュールが実行時に Native module cannot be nullCannot read property of undefined でクラッシュします。

これはConfig Pluginが正しく適用されず、ネイティブモジュールのinitializationコードがネイティブプロジェクトに書き込まれていないことが原因です。

// app.config.js の plugins 設定を確認する
export default {
  expo: {
    plugins: [
      // ❌ 間違い:プラグインのパスや名前が違う
      'react-native-ble-plx',  // このライブラリはConfig Pluginがない場合がある
      
      // ✅ 正しい:@config-plugins名前空間のパッケージを使う
      '@config-plugins/react-native-ble-plx',
      
      // ✅ 設定が必要なプラグインは配列で指定
      ['@config-plugins/react-native-ble-plx', {
        bluetoothAlwaysPermission: "このアプリはBluetooth機器との通信に使用します",
        bluetoothPeripheralPermission: "このアプリはBluetooth機器に接続します"
      }],
    ]
  }
};

Config Pluginが適用されているか確認する方法:

# prebuildを実行してiosとandroidディレクトリを生成
npx expo prebuild --clean
 
# iOSのInfo.plistを確認(権限が追加されているか)
cat ios/MyApp/Info.plist | grep -A 2 "NSBluetooth"
 
# AndroidのAndroidManifest.xmlを確認
cat android/app/src/main/AndroidManifest.xml | grep "BLUETOOTH"

エラーパターン③:AndroidのGradleビルドエラー

症状: iOSビルドは成功するが、Androidで Execution failed for task ':app:mergeReleaseJavaResource' などのエラーが出る。

# よくあるAndroidビルドエラーのパターン
# 1. 重複クラスエラー
#    Duplicate class kotlin.collections.jdk8... 
# 2. minimum SDK versionの不一致
#    Manifest merger failed: uses-sdk:minSdkVersion 21 cannot be smaller than version 23
 
# build.gradle競合解決の例(Config Plugin経由で適用)
// config-plugins/fix-android-build.js
const { withAppBuildGradle } = require('@expo/config-plugins');
 
module.exports = (config) => {
  return withAppBuildGradle(config, (modConfig) => {
    const { modResults } = modConfig;
    
    // minSdkVersionを上げる(カスタムモジュールの要件に合わせる)
    modResults.contents = modResults.contents.replace(
      /minSdkVersion = \d+/,
      'minSdkVersion = 24'
    );
    
    return modConfig;
  });
};
// Kotlin version競合の解決
const { withProjectBuildGradle } = require('@expo/config-plugins');
 
module.exports = (config) => {
  return withProjectBuildGradle(config, (modConfig) => {
    const { modResults } = modConfig;
    
    modResults.contents = modResults.contents.replace(
      /kotlinVersion = '.*'/,
      "kotlinVersion = '1.9.0'"
    );
    
    return modConfig;
  });
};

エラーパターン④:Hermes JavaScriptエンジンとの非互換

症状: Calling synchronous methods on native modules is not supported や、特定のモジュールがNew Architectureで動かありません。

// app.config.js でHermesとNew Architectureの設定を確認
export default {
  expo: {
    jsEngine: "hermes",  // デフォルト(推奨)
    
    // New Architecture (Fabric + TurboModules) はOpt-in
    newArchEnabled: false,  // 互換性問題がある場合はfalseに戻す
    
    ios: {
      newArchEnabled: false,  // iOS個別の設定
    },
    android: {
      newArchEnabled: false,  // Android個別の設定
    }
  }
};

Hermes非対応モジュールの一時的な回避策:

// metro.config.js
const { getDefaultConfig } = require('expo/metro-config');
 
const config = getDefaultConfig(__dirname);
 
// Hermes非互換モジュールをJSCで動かすための設定(最後の手段)
// 基本的にはモジュールのアップデートを待つことを推奨
config.resolver.assetExts.push('cjs');
 
module.exports = config;

エラーパターン⑤:ネイティブモジュールのinitializationが漏れている

症状: MainApplication.java でモジュールが初期化されていないため実行時エラーになります。

古いReact Nativeライブラリの中には、Config Pluginを提供しておらず、MainApplication.javaAppDelegate.mに手動でコードを追加する必要があるものがあります。

// config-plugins/add-native-init.js
const { withMainApplication, withAppDelegate } = require('@expo/config-plugins');
 
// Android: MainApplication.javaにモジュールを追加
const withCustomAndroidModule = (config) => {
  return withMainApplication(config, (modConfig) => {
    const { modResults } = modConfig;
    
    // import文を追加
    if (!modResults.contents.includes('import com.example.CustomModule;')) {
      modResults.contents = modResults.contents.replace(
        'import com.facebook.react.ReactApplication;',
        `import com.facebook.react.ReactApplication;
import com.example.CustomModule;`
      );
    }
    
    // getPackages()にモジュールを追加
    modResults.contents = modResults.contents.replace(
      'packages.add(new MainReactPackage());',
      `packages.add(new MainReactPackage());
packages.add(new CustomModule());`
    );
    
    return modConfig;
  });
};
 
// iOS: AppDelegate.mmに初期化コードを追加
const withCustomIOSInit = (config) => {
  return withAppDelegate(config, (modConfig) => {
    const { modResults } = modConfig;
    
    if (!modResults.contents.includes('#import <CustomSDK/CustomSDK.h>')) {
      modResults.contents = modResults.contents.replace(
        '#import <React/RCTBridge.h>',
        `#import <React/RCTBridge.h>
#import <CustomSDK/CustomSDK.h>`
      );
      
      modResults.contents = modResults.contents.replace(
        '- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions',
        `- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions`
      );
    }
    
    return modConfig;
  });
};
 
module.exports = (config) => {
  config = withCustomAndroidModule(config);
  config = withCustomIOSInit(config);
  return config;
};

EAS Buildの効率的なデバッグ戦略

本番ビルドのデバッグはコストが高いため、ローカルでできる限り問題を再現・解決してからEAS Buildに投入する習慣をつけましょう。

# 1. prebuildで設定を事前確認
npx expo prebuild --clean
# → ios/ と android/ ディレクトリが生成される
# → 期待通りのネイティブコードが書き込まれているか確認
 
# 2. ローカルビルドでのテスト(macOS + Xcodeが必要)
npx expo run:ios --configuration Release
# または
npx expo run:android --variant Release
 
# 3. 問題の特定後にEAS Buildに投入
eas build --profile preview --platform ios
 
# 4. ビルドログの確認
eas build:list  # ビルド一覧
eas build:view [BUILD_ID]  # 特定ビルドのログ詳細

eas.jsonのマルチプロファイル設計:

{
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal",
      "ios": {
        "buildConfiguration": "Debug"
      }
    },
    "preview": {
      "distribution": "internal",
      "ios": {
        "buildConfiguration": "Release"
      },
      "env": {
        "API_URL": "https://staging.api.example.com"
      }
    },
    "production": {
      "distribution": "store",
      "ios": {
        "buildConfiguration": "Release"
      },
      "env": {
        "API_URL": "https://api.example.com"
      }
    }
  }
}

全体を振り返って

EAS Buildでのカスタムネイティブモジュール導入でよくあるエラーと解決策:

  • Podfile競合 → Config Plugin経由でバージョンを強制固定
  • Config Plugin未適用 → @config-plugins/名前空間パッケージを確認し、npx expo prebuildで事前検証
  • Gradleビルドエラー → withAppBuildGradleでminSdkVersion等を調整
  • Hermes非互換 → newArchEnabled: falseでフォールバック(モジュール更新を待つ)
  • ネイティブinitializationの漏れ → withMainApplication/withAppDelegateで自作Config Pluginを作成

ポイントは「EAS Buildに投入する前にnpx expo prebuildでローカル検証する」という習慣です。ビルドエラーのほとんどは、prebuildが生成したネイティブファイルを直接確認することで原因が特定できます。

EAS BuildとConfig Pluginの詳細については、Expo公式ドキュメントが最も信頼性の高いリファレンスです。

シェア

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

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

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

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

関連記事

開発ツール2026-05-02
Rork生成アプリにネイティブモジュールを追加する — Expo Prebuild実践ガイド
Rorkで作ったプロトタイプにネイティブSDKやカスタムモジュールを追加したくなったとき、Expo Prebuildをどう使うかを実践的に解説します。Managed Workflowの限界とBare Workflowへの移行手順を具体的なコマンド例とともに整理します。
開発ツール2026-05-01
Rork Max で画面録画と配信を実装する — ReplayKit と MediaProjection の本番運用ガイド
Rork Max のアプリに iOS ReplayKit と Android MediaProjection を統合し、ゲームプレイ録画・チュートリアル動画作成・ライブ配信機能を実装する本番運用ガイド。
開発ツール2026-04-25
Rork でアプリアイコンを変更したのに反映されない時の対処法
Rork でアプリアイコンを差し替えたのに古いアイコンが残る — iOS のアイコンキャッシュ、EAS Build のビルドキャッシュ、Android のアダプティブアイコン未設定など、原因別に確実な対処法をまとめました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →