◉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-05-30中級

Rork で『TurboModuleRegistry.getEnforcing could not be found』が出たときの原因と対処

New Architecture が標準になってから増えた『TurboModuleRegistry.getEnforcing(...): could not be found』エラーの読み解き方を解説します。Expo Go と開発ビルドの違い、ネイティブ再ビルドの判断基準、互換性のないライブラリの切り分け手順までコード付きでまとめました。

Rork585New Architecture4TurboModuleExpo219エラー対処3

ある朝、いつものように Rork で生成したアプリを起動したら、見慣れない赤い画面が出ていました。メッセージはこうです。

TurboModuleRegistry.getEnforcing(...): 'RNSomeModule' could not be found.
Verify that a module by this name is registered in the native binary.

JavaScript 側のコードは何も変えていないのに、です。原因を辿っていくと、Expo SDK 53 以降で New Architecture(Fabric / TurboModules)が標準で有効になったことが引き金でした。同じエラーで手が止まっている方は少なくないと思います。2014年から個人開発を続け、累計5,000万ダウンロードに育った壁紙・癒し系アプリを運用してきましたが、このエラーに本気で向き合ったのは New Architecture が標準化されてからでした。6本の壁紙アプリを移行したときに整理した切り分け手順を、順を追って共有します。

このエラーが言っていること

getEnforcing は「この名前のネイティブモジュールが必ず存在するはずだから探してこい」という命令です。get なら見つからなくても null を返しますが、getEnforcing は見つからなければ即座に例外を投げます。

つまりこのエラーは「JavaScript はモジュール RNSomeModule を呼ぼうとした。でも今動いているネイティブバイナリの中に、その名前で登録されたモジュールが無かった」という状態を表しています。ポイントは、問題が JS ではなくネイティブバイナリ側にあるという点です。ここを取り違えると、いくら JS を直しても直りません。

原因は、経験上ほぼ次の4つに収束します。

原因1: Expo Go で動かしている

いちばん多いのがこれです。Expo Go は、あらかじめ決められたネイティブモジュールだけを内蔵したアプリです。あなたが追加したライブラリ(例: react-native-mmkv、課金系、独自のネイティブモジュール)は Expo Go の中には入っていません。

確認は単純で、起動方法を見てください。

# これは Expo Go 経由 → カスタムネイティブモジュールは動かない
npx expo start
 
# これが必要 → 自分のネイティブモジュールを含む開発ビルドを使う
npx expo start --dev-client

対処は、開発ビルド(development build)を作ることです。

# expo-dev-client を追加
npx expo install expo-dev-client
 
# 端末で動く開発ビルドを生成(クラウドビルドの例)
eas build --profile development --platform ios

開発ビルドは「あなたのライブラリ構成で焼き直した Expo Go」だと考えると分かりやすいです。一度入れてしまえば、以降の JS 変更はこれまで通りホットリロードで反映されます。

原因2: ネイティブを再ビルドせずに JS だけ更新した

ネイティブモジュールを含むライブラリを npm install した直後によく起きます。RNSomeModule を提供する新しいライブラリを入れても、今端末に載っているバイナリは古いままなので、新モジュールが登録されていません。JS のバンドルだけが新しくなり、ネイティブが追いついていない状態です。

ネイティブの再ビルドが必要です。

# ネイティブプロジェクトを作り直してから
npx expo prebuild --clean
 
# iOS は Pods を入れ直す
cd ios && pod install && cd ..
 
# 改めてネイティブからビルド
npx expo run:ios

「JS を直して保存したのに直らない」ときは、たいていネイティブの再ビルドを飛ばしています。ライブラリを追加・更新したら、リロードではなくビルドし直す、と覚えておくと無駄な時間を減らせます。

原因3: ライブラリが New Architecture に未対応

prebuild --clean から再ビルドしても消えない場合、そのライブラリ自体がまだ TurboModule に対応していない可能性があります。古いライブラリは旧来の Bridge 前提で書かれていて、Bridgeless モードで動く New Architecture では TurboModule として解決できません。

まず、どのライブラリが原因かを特定します。エラー内のモジュール名(RNSomeModule の部分)を、各ライブラリの README や React Native Directory で照合し、New Architecture 対応の表記があるかを確認してください。

対応版が出ているなら更新します。

npx expo install react-native-some-module@latest

対応版がまだ無い場合は、一時的に New Architecture を切るのが現実的です。app.json で次のように設定します。

{
  "expo": {
    "newArchEnabled": false
  }
}

設定後は必ず npx expo prebuild --clean からビルドし直してください。app.json を書き換えただけでは反映されません。なお、これは恒久対応ではなく時間稼ぎです。私は移行のとき、対応していないライブラリを1つずつ代替へ置き換え、すべて揃った段階で newArchEnabled を戻しました。

原因4: モジュール名の取り違え・自作スペックの不備

自分でネイティブモジュールを書いている場合は、Codegen に渡すスペック名と、ネイティブ実装で登録している名前がずれていることがあります。getEnforcing('Foo') に対して、実装側が Bar で登録されていれば当然見つかりません。スペックファイル(NativeFoo.ts 等)の名前、@ReactModule / RCT_EXPORT_MODULE の登録名、呼び出し側の3点が一致しているかを確認してください。

切り分けの早見手順

迷ったら、上から順に潰すのが速いです。

  1. Expo Go で動かしていないか(→ 開発ビルドに切り替え)
  2. ライブラリ追加後に再ビルドしたか(→ prebuild --clean から焼き直し)
  3. そのライブラリは New Architecture 対応か(→ Directory で確認、未対応なら一時的に newArchEnabled: false)
  4. 自作モジュールなら登録名が一致しているか

1と2でほとんどのケースは解決します。3まで来てようやくライブラリ互換性を疑う、という順番が効率的です。

同じ轍を踏まないために

New Architecture への移行は、全アプリを一度に切り替えようとすると原因の切り分けが難しくなります。私は6本のアプリのうち、依存が最も少ない1本を先に移行して上記の手順を固めてから、残りに横展開しました。最初の1本で詰まりどころを洗い出しておくと、2本目以降は驚くほど静かに終わります。

エラーが出たら、まず「これは JS の問題ではなくネイティブバイナリの問題だ」と思い出してください。そこさえ外さなければ、対処は今日まとめた4つの引き出しのどれかに収まります。同じ場面で足を止めている方の参考になれば幸いです。

シェア

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

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

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

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

関連記事

⬡ 開発ツール2026-10-15
EXPO_PUBLIC_ の値が、開発では読めて本番だけ undefined になる書き方を、変換結果で見分けます
API の URL が開発中は読めるのに、ビルドした途端に undefined になる。原因は process.env の書き方でした。babel-preset-expo の変換結果を開発・本番で並べ、置き換わる書き方と残ってしまう書き方を表にしました。
⬡ 開発ツール2026-10-13
リリース前に、書き出した Expo バンドルの中から自分の鍵を探してみる
ソースに鍵がなくても、出来上がったアプリの中に鍵が残ることがあります。Expo SDK 57 で実際に expo export を実行し、バンドルの中身を grep と 60 行ほどの Node スクリプトで調べて、見つかる鍵と見つからない鍵の違いを確かめました。
⬡ 開発ツール2026-10-07
日本語の見出しだけ太字にならない — Android で fontWeight が効かないときの切り分けと直し方
Rork で作ったアプリで、iPhone では太字なのに Android では日本語の見出しが細いままになる症状の切り分け記事です。原因の見分け方、fontFamily を重みごとに分ける直し方、確認用コードを載せています。