Skip to content

Conversation

@safaiyeh
Copy link
Contributor

Summary

The RNFBAppCheck pod is an Obj-C static library that doesn't set DEFINES_MODULE or include a module map. When projects use useFrameworks: "static" (required by firebase-ios-sdk), the Expo config plugin's import RNFBAppCheck in AppDelegate.swift fails with:

No such module 'RNFBAppCheck'

This is a widely reported issue:

Changes

Updates the Expo config plugin (plugin/src/ios/appDelegate.ts) to:

  1. Remove import RNFBAppCheck from AppDelegate.swift (including cleaning up any previously added imports)
  2. Add #import <RNFBAppCheckModule.h> to the project's bridging header (ProjectName-Bridging-Header.h)

The RNFBAppCheckModule class is then available to Swift through the bridging header, which is the standard way to consume Obj-C pods without module maps from Swift.

Why not add DEFINES_MODULE?

Adding DEFINES_MODULE = YES to the podspec would also fix the Swift import, but would be a larger change affecting all consumers. The bridging header approach is the minimal, targeted fix that matches how the Obj-C path already works (using #import).

Testing

  • Verified with expo prebuild --platform ios --clean that import RNFBAppCheck is removed and bridging header is updated
  • Verified xcodebuild build succeeds
  • Tested with Expo SDK 54, React Native 0.81, @react-native-firebase/app-check 23.8.4

Fixes #8700
Fixes #8757

The `RNFBAppCheck` pod is an Obj-C static library without
`DEFINES_MODULE` or a module map, so `import RNFBAppCheck` in
Swift AppDelegate fails with "No such module 'RNFBAppCheck'" when
using `useFrameworks: "static"` (required by firebase-ios-sdk).

This changes the Expo config plugin to:
1. Remove `import RNFBAppCheck` from AppDelegate.swift
2. Add `#import <RNFBAppCheckModule.h>` to the bridging header

The Obj-C class `RNFBAppCheckModule` is then available to Swift
through the bridging header, which is how Obj-C pods without module
maps should be consumed from Swift.

Fixes invertase#8700
Fixes invertase#8757

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@vercel
Copy link

vercel bot commented Jan 31, 2026

@safaiyeh is attempting to deploy a commit to the Invertase Team on Vercel.

A member of the Team first needs to authorize it.

@CLAassistant
Copy link

CLAassistant commented Jan 31, 2026

CLA assistant check
All committers have signed the CLA.

Copy link
Collaborator

@mikehardy mikehardy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@safaiyeh you are the hero we needed, thanks so much for this. App-Check + Expo 54 was the last item on my todo list to feel like we supported Expo well at a technical level (with https://github.com/mikehardy/rnfbdemo/blob/main/make-expo-demo.sh to prove it). We still have a ways to go on the documentation side but simply having it all working (and demonstrated with a build demo) is a huge step for us and this was all that's missing.

Worked great when I tested it locally

@mikehardy mikehardy added the Workflow: Pending Merge Waiting on CI or similar label Jan 31, 2026
@mikehardy
Copy link
Collaborator

it only affects the plugin so none of the e2e test results will be important and they are flaky right now (see #8865 ) - that won't gate merge.

Just need lint and jest to pass - I see jest failed locally for me because it's verifying an import that isn't there anymore, I'll fix that up and get this in since I already qualified that it worked locally

… tests

the existing tests needed a little fix after the Swift version of the app-check
mod was converted to altering the bridging header, and I added a new test that
was bridging header specific
@safaiyeh
Copy link
Contributor Author

safaiyeh commented Feb 1, 2026

Glad I could help!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[🐛] RNFBAppCheck [🐛] IOS no such module RNFBAppCheck on AppDelegate.swift

3 participants