Free tool · React Native 0.87 · iOS

Migrate React Native from CocoaPods to Swift Package Manager

CocoaPods stops accepting new pods on December 2, 2026. Find out in 2 minutes what stands between your app and Swift Package Manager.

# Before: Ruby + CocoaPods
bundle exec pod install

# After: Xcode only
cd ios
npx react-native spm --deintegrate

✓ Package.swift injected
✓ Podfile removed
✓ .xcodeproj kept in place

The CocoaPods deadline

Your app keeps building after December 2. The risk is slower: every native SDK that moves to Swift Package Manager only stops shipping fixes and security patches to your Podfile.

  1. Aug 11, 2026

    React Native 0.87

    Experimental, opt-in Swift Package Manager support for iOS.

  2. Oct 2026

    Firebase leaves CocoaPods

    New Firebase iOS SDK versions ship through SPM only.

  3. Nov 1–7, 2026

    Read-only test run

    CocoaPods trunk is temporarily frozen. No pod can be published.

  4. Dec 2, 2026

    Trunk goes read-only

    No new pod versions, ever. Existing ones still install.

12 checks · 2 minutes

Your SPM readiness check

Answer No, Unknown or Yes. Your score shows up instantly.

Step 1/4 · React Native

01React Native

0/3

Your app runs React Native 0.87 or later (or the upgrade is planned this quarter). Swift Package Manager support does not exist before 0.87.

You consume the prebuilt React Native XCFrameworks and do not patch React Native native code (no patch-package on ReactCommon or React-Core).

Your AppDelegate and native modules use framework-style includes like #import <React/RCTAppDelegate.h>, not bare-form #import <RCTAppDelegate.h>.

How the migration works in React Native 0.87

React Native 0.87 injects Swift package references into your existing .xcodeproj. Signing, capabilities and build phases stay untouched. No Ruby, no Bundler, no pod install.

  1. Upgrade to React Native 0.87.
  2. Run the migration from the ios folder.
  3. Generate a Package.swift for each library that lacks one.
  4. Replace pod install with npx react-native spm in CI and after a fresh clone.

The full design lives in RFC #994.

# Migrate from CocoaPods
cd ios
npx react-native spm --deintegrate

# Library without Package.swift
npx react-native spm scaffold

# Fresh clone or CI (replaces pod install)
npx react-native spm

# Roll back
npx react-native spm deinit

What blocks a migration today

SPM support is experimental and not production-ready yet. These are the issues we expect on real codebases.

Swift + C++ libraries

SPM cannot mix Swift and C++ in one target. Nitro modules, VisionCamera and MMKV are affected until they split their targets.

Podspec script phases

Libraries running Ruby or shell logic from their podspec need an SPM plugin or a new build step.

Bare header imports

Headers now come from ReactNativeHeaders.xcframework. #import <RCTAppDelegate.h> becomes #import <React/RCTAppDelegate.h>.

Podfile post_install hooks

Build settings patched in Ruby have no SPM equivalent. Move them to the Xcode project or drop them.

Build from source

The first phase consumes prebuilt XCFrameworks only. Patching React Native native code means staying on CocoaPods.

Expo

Available in expo@canary only. Managed and CNG apps should wait for a stable SDK.

Also on your list before the next release? Run the free React Native security audit.

Frequently asked questions

No. CocoaPods trunk becomes read-only, so existing pod versions keep installing. What stops is new releases: SDKs that move to Swift Package Manager only (Firebase already did) will no longer ship fixes or security patches through CocoaPods.

Migrating a production app?

We map every native dependency, flag the blockers and hand you a migration plan you can ship before your SDKs leave CocoaPods.

Discover the full audit