Skip to content

Firebase iOS Pods Static Library Integration

Problem

When integrating Firebase with Flutter or React Native apps on iOS, you may encounter the error:

[!] The following Swift pods cannot yet be integrated as static libraries:

The Swift pod `FirebaseCoreInternal-library` depends upon `GoogleUtilities-library`, which does not define modules. To opt into those targets generating module maps (which is necessary to import them from Swift when building as static libraries), you may set `use_modular_headers!` globally in your Podfile, or specify `:modular_headers => true` for particular dependencies.

This occurs because newer versions of Firebase SDKs require static framework linking and modular headers to work properly with Swift-based dependencies.

Solutions

For Flutter Projects

Add the following to your ios/Podfile:

ruby
target 'Runner' do
  use_frameworks! :linkage => :static
  use_modular_headers!

  flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

For React Native Projects

Option 1: Configure with expo-build-properties (Expo)

bash
npx expo install expo-build-properties
json
{
  "expo": {
    "plugins": [
      [
        "expo-build-properties",
        {
          "ios": {
            "useFrameworks": "static",
            "podfileProperties": { "use_modular_headers!": true }
          }
        }
      ]
    ]
  }
}

After configuration, run:

bash
npx expo prebuild --clean

Option 2: Manual Podfile Configuration

Modify your ios/Podfile with these settings:

ruby
platform :ios, '12.4'
install! 'cocoapods', :deterministic_uuids => false

target 'YourApp' do
  config = use_native_modules!
  use_frameworks! :linkage => :static
  $RNFirebaseAsStaticFramework = true
  
  # Essential Firebase pods with modular headers
  pod 'Firebase', :modular_headers => true
  pod 'FirebaseCore', :modular_headers => true
  pod 'FirebaseCoreInternal', :modular_headers => true
  pod 'GoogleUtilities', :modular_headers => true

  # ... rest of your configuration

  post_install do |installer|
    react_native_post_install(installer)
    __apply_Xcode_12_5_M1_post_install_workaround(installer)
  end
end

Option 3: Minimal Configuration

If you only need basic Firebase functionality:

ruby
target 'YourApp' do
  config = use_native_modules!
  
  pod 'FirebaseCore', :modular_headers => true
  pod 'GoogleUtilities', :modular_headers => true
  
  # ... rest of configuration
end

Important Considerations

WARNING

Using use_frameworks! without :linkage => :static may conflict with Flipper debugging tools. If you need Flipper, use the modular headers approach instead.

DANGER

Some Firebase modules (particularly Firebase Functions and Firebase Storage) may not work with static frameworks. For these cases, consider alternative solutions like using axios for API calls or AWS S3 for file storage.

Migration Recommendation

For Expo users experiencing persistent issues with expo-firebase-analytics, consider migrating to React Native Firebase:

bash
# Follow the official migration guide
npx expo install @react-native-firebase/app

Official migration resources:

Troubleshooting

After making Podfile changes, always run:

bash
cd ios
pod install --repo-update

If you encounter build issues, try cleaning the project:

bash
npx expo prebuild --clean
# or for React Native CLI
cd ios && rm -rf Pods Podfile.lock && pod install

Conclusion

The Firebase iOS integration error occurs due to incompatible linking settings between Swift pods and static libraries. The solutions provided address this by either configuring static framework linkage with modular headers or using the expo-build-properties plugin for Expo projects. Choose the approach that best fits your project's requirements and Firebase module dependencies.