Mike Miller
May 04, 2026

Table of contents
TL;DR
What this means for your app
The Firebase and CocoaPods timeline
Will Firebase stop working with CocoaPods?
Why this matters for push notifications
Which Firebase pods are affected?
Audit your app before you migrate
Choose your migration path
How to migrate Firebase from CocoaPods to SPM
Product-specific migration checks
Update CI/CD after removing CocoaPods
Push notification smoke test after migration
What about React Native, Flutter, Unity, and C++?
Your action plan
Wrapping up
Frequently asked questions
After October 2026, pod update FirebaseMessaging will not get you the latest Firebase Messaging fixes. Firebase says it will stop publishing new Firebase Apple SDK versions to CocoaPods, so if an iOS, Xcode, APNs, or Firebase change affects push delivery, your CocoaPods-based app may be stuck on the wrong side of the fix.
That is the uncomfortable part of the Firebase CocoaPods migration. Firebase is not pulling old pods from the registry, so pod install can still pass, CI can still go green, and your app can still ship.
But new Firebase Apple SDK releases will move through Swift Package Manager or manual installation. If your app uses Firebase Cloud Messaging through CocoaPods, FirebaseMessaging can quietly become the old part of your push pipeline.
Push notifications depend on a long chain: APNs registration, FCM token mapping, backend targeting, iOS display rules, and tap handling. When one part of that chain gets stuck on an aging SDK, failures do not always look like build errors. They look like missing notifications, stale tokens, broken analytics callbacks, or bugs that show up after an Xcode or iOS upgrade.
FirebaseMessaging.Firebase CocoaPods migration is primarily a push notification risk if your app uses FirebaseMessaging. That SDK sits between your app, APNs, FCM tokens, notification callbacks, and notification analytics. Once Firebase stops publishing new Apple SDK versions to CocoaPods, any future FirebaseMessaging fixes or improvements will land somewhere else first: Swift Package Manager or manual installation.
The bad outcomes are concrete. You can end up with stale or hard-to-debug FCM token behavior. You can hit foreground or background delivery bugs after an iOS or Xcode upgrade and find that the fix is not coming through pod update. You can have CI passing while your app quietly builds against a frozen Firebase SDK stack.
The blast radius is not limited to push. You can also miss Firebase fixes for auth, Firestore, Crashlytics, Remote Config, and analytics. But if FirebaseMessaging is part of your iOS notification path, this is first and foremost a notification reliability deadline.
This guide focuses on that path: what changes, what does not change, how to audit FirebaseMessaging, and how to migrate Firebase from CocoaPods to Swift Package Manager without accidentally breaking APNs registration, FCM token generation, or notification delivery.
There are two related deadlines: Firebase's publishing cutoff and CocoaPods trunk read-only mode.
| Date | What happens | What it means for your app |
|---|---|---|
| May 2026 | Firebase says you may see CocoaPods deprecation warnings during pod install or pod update | Your builds should still work, but the warning is your migration signal |
| October 2026 | Firebase stops publishing new Firebase Apple SDK versions to CocoaPods | CocoaPods users stop receiving new Firebase Apple SDK releases |
| November 1-7, 2026 | CocoaPods plans a read-only test run | Publishing automation may surface issues before the final registry change |
| December 2, 2026 | CocoaPods trunk becomes permanently read-only | No new pod versions or podspecs can be published to the central CocoaPods registry |
The gap between October and December also gives wrapper SDKs time to absorb the change, because frameworks like FlutterFire, Firebase Unity SDK, and Firebase C++ SDK depend on the native Firebase Apple SDK release cycle.
No. Firebase will not stop working with CocoaPods on the cutoff date.
Existing Firebase pod versions will remain available in the CocoaPods registry, and deployed apps using those versions will keep running. CI pipelines that run pod install against existing versions should also keep resolving those pods.
The change is about future updates. After October 2026, Firebase will stop publishing new Firebase Apple SDK versions to CocoaPods. If your app still depends on Firebase through a Podfile, you can keep building against old versions, but you will not receive new Firebase features, performance improvements, or critical bug fixes through CocoaPods.
That distinction matters. "My build still works" is not the same as "my notification infrastructure is healthy."
If you use Firebase Cloud Messaging on iOS, the affected dependency is FirebaseMessaging. That SDK sits in the middle of your APNs and FCM registration flow. It maps APNs tokens to FCM registration tokens, handles notification callbacks, and supports Firebase's analytics behavior around notifications.
The risk is not that FirebaseMessaging disappears. The risk is that your app gets stuck on a frozen CocoaPods version while Firebase continues shipping updates somewhere else.
Here is the chain reaction to watch:
Podfile and Podfile.lock.FirebaseMessaging version stops receiving future updates through pod update.That is why this migration belongs on your notification reliability plan. If push is a critical channel for your product, you should not treat FirebaseMessaging CocoaPods migration as a last-minute dependency chore.
Firebase says the CocoaPods change applies to all Firebase CocoaPods and their associated dependencies. That includes commonly used pods like:
FirebaseFirebaseAnalyticsFirebaseAppCheckFirebaseAuthFirebaseCoreFirebaseCrashlyticsFirebaseDatabaseFirebaseFirestoreFirebaseFunctionsFirebaseInstallationsFirebaseMessagingFirebasePerformanceFirebaseRemoteConfigFirebaseStorageIf you use Firebase through CocoaPods, assume you are affected unless you have confirmed that your app is already using Swift Package Manager or manual installation.
Before you run pod deintegrate, figure out exactly where Firebase and CocoaPods show up in your project. This is especially important if you maintain more than one iOS app, a white-label app, or a cross-platform app where CocoaPods is hidden under a framework.
Start with the obvious files:
Podfile.Podfile.lock for Firebase entries and pinned versions..xcworkspace.FirebaseMessaging, FirebaseCrashlytics, FirebaseAnalytics, FirebaseAuth, and FirebaseApp.configure().GoogleService-Info.plist is included in the right app target.pod install, pod update, bundle exec pod install, or CocoaPods caching.Then check your target configuration:
-ObjC, especially if you use Firebase Analytics.If your app uses push notifications, audit the registration flow too:
registerForRemoteNotifications()?didRegisterForRemoteNotificationsWithDeviceToken?This audit gives you the migration map. Without it, you are guessing.
Firebase recommends Swift Package Manager for new Apple projects, and for most existing apps it is the right migration target. But there are a few valid paths depending on your dependency graph.
| Option | Best for | Trade-off |
|---|---|---|
| Migrate Firebase to Swift Package Manager | Most native iOS apps that can move dependencies to SPM | You need to update project settings, CI, and any Firebase-specific scripts |
| Use manual XCFramework installation | Apps with non-Firebase dependencies that cannot move off CocoaPods yet | More manual updates and version management |
| Stay pinned on existing CocoaPods versions temporarily | Apps that need time to migrate safely | You stop receiving new Firebase Apple SDK updates through CocoaPods |
| Host private podspecs | Apps with unusual build constraints that must keep CocoaPods | You own the maintenance burden, and Firebase does not recommend this as the long-term path |
Firebase warns that mixing CocoaPods and Swift Package Manager in the same target can create dependency cycles and build errors. Mixing dependency managers across separate targets can be workable during a migration, but avoid linking the same Firebase products through both systems in one target. Firebase's guidance is to use a single installation method for the target you are migrating.
If your non-Firebase dependencies do not support SPM yet, manual Firebase installation may be the more stable short-term bridge while you clean up the rest of the project.
For a straightforward native iOS app, the Firebase Swift Package Manager migration usually follows this shape.
First, close Xcode. From the root of your iOS project, remove CocoaPods integration:
Copied!
pod deintegrate
Then remove the generated workspace:
Copied!
rm -rf YourApp.xcworkspace
Open the .xcodeproj file in Xcode, not the old .xcworkspace.
In Xcode:
Copied!
https://github.com/firebase/firebase-ios-sdk.git
FirebaseMessaging, FirebaseAnalytics, FirebaseCrashlytics, FirebaseAuth, or FirebaseFirestore.If you use a Package.swift manifest, Firebase dependencies look like this:
Copied!
dependencies: [.package(name: "Firebase",url: "https://github.com/firebase/firebase-ios-sdk.git",from: "11.0")]
Then add the Firebase products to the target that needs them:
Copied!
.target(name: "NotificationsApp",dependencies: [.product(name: "FirebaseMessaging", package: "Firebase"),.product(name: "FirebaseAnalytics", package: "Firebase"),.product(name: "FirebaseCrashlytics", package: "Firebase")])
The version above is illustrative. Use the current Firebase Apple SDK version from Firebase's release notes when you migrate. Do not copy a version from an old blog post and call it done.
Firebase's official Swift Package Manager install path is https://github.com/firebase/firebase-ios-sdk.git. Some Firebase products use prebuilt binary targets internally, but you should follow Firebase's current SPM installation docs rather than switching to a different package URL unless Firebase explicitly recommends it.
Some Firebase products need extra attention after you move from CocoaPods to SPM.
For FirebaseMessaging, verify both APNs and FCM token flow.
At minimum, confirm:
registerForRemoteNotifications().didRegisterForRemoteNotificationsWithDeviceToken still receives an APNs token.Messaging.messaging().token returns an FCM registration token.If you disabled Firebase method swizzling with FirebaseAppDelegateProxyEnabled, check your manual callback forwarding carefully. Your code will compile fine while analytics, token mapping, or notification handling silently stops behaving the way you expect. Firebase's FCM receive docs call out a few places that need explicit wiring:
application(_:didRegisterForRemoteNotificationsWithDeviceToken:) should set Messaging.messaging().apnsToken = deviceToken.Messaging.messaging().delegate should be set, and messaging(_:didReceiveRegistrationToken:) should still send token refreshes to your backend.userNotificationCenter(_:willPresent:) should call Messaging.messaging().appDidReceiveMessage(userInfo) if you rely on Firebase notification analytics for foreground notifications.userNotificationCenter(_:didReceive:) should call Messaging.messaging().appDidReceiveMessage(userInfo) for notification taps.application(_:didReceiveRemoteNotification:fetchCompletionHandler:) should call Messaging.messaging().appDidReceiveMessage(userInfo) for silent or background pushes.If the token callbacks are missing after the migration, FCM tokens can go stale silently. If the notification callbacks are missing, delivery analytics and downstream handling can drift from what you expect. Either way, nobody notices until a campaign underdelivers.
If your app uses rich push (images, mutable content, decryption, custom UI), your Notification Service Extension is a separate target with its own dependency graph. SPM does not link the extension automatically.
After moving Firebase to SPM, check:
FirebaseMessaging (and any other Firebase products it uses) under Frameworks and Libraries.Info.plist still declares NSExtension correctly and the deployment target matches the main app.Smoke test the NSE specifically by sending a push with mutable-content: 1 and an image attachment. If the image renders, your extension is linked and running. If only the text shows up, the extension is not getting invoked.
Firebase Analytics may require the -ObjC linker flag, especially when included transitively. After migrating to SPM, check your target's Other Linker Flags and make sure Analytics events still appear where you expect.
Crashlytics dSYM upload scripts change because the SDK no longer lives under PODS_ROOT.
With Swift Package Manager, Firebase documents the run script path as:
Copied!
${BUILD_DIR%Build/*}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run
If your CI was calling a script from Pods/FirebaseCrashlytics, update that path and test symbol upload before you rely on Crashlytics for production crash visibility.
If you use Firebase Performance, include it in your post-migration smoke tests. Confirm FirebasePerformance is linked through SPM and that performance data still appears after a release build. Unlike Crashlytics, Firebase's general SPM install docs do not call out a separate Performance upload script, so avoid carrying over CocoaPods-specific build phase assumptions unless your project added custom Performance scripts.
These products are less likely to affect push delivery directly, but they can still affect launch behavior, authentication flows, feature flags, and data reads. After migration, test the startup path for every target that initializes Firebase.
Your local Xcode project is only half the migration. Your CI pipeline probably has CocoaPods assumptions too.
Look for steps like:
Copied!
bundle exec pod install --repo-updatexcodebuild -workspace YourApp.xcworkspace
After moving to SPM, you will likely build the project instead of the workspace. Resolve packages as a separate step first so dependency fetches do not eat into your build timeout, then build:
Copied!
xcodebuild -resolvePackageDependencies \-project YourApp.xcodeproj \-scheme YourAppxcodebuild \-project YourApp.xcodeproj \-scheme YourApp \-destination "generic/platform=iOS Simulator" \build
Splitting the resolve step also makes SPM caching easier on hosted runners because you can cache the resolved SourcePackages directory between jobs. Use generic/platform=iOS Simulator for build-only CI jobs. If you run tests, replace the destination with a simulator installed on your CI runner.
You may also need to update:
PODS_ROOT..xcworkspace exists.Podfile.lock.Run a clean CI build before merging the migration. A migration that works only on one developer machine is not finished.
Do not stop after the app builds. If you use Firebase push notifications on iOS, run a push notification smoke test on a physical device.
Use this checklist:
didRegisterForRemoteNotificationsWithDeviceToken receives a token.content-available: 1. Confirm the app wakes and application(_:didReceiveRemoteNotification:fetchCompletionHandler:) runs to completion.Simulators are better for push than they used to be. iOS 16 and later support drag-and-drop .apns files for local delivery testing, which is great for smoke checks during development. But real APNs delivery, background wakeups, and token behavior still need a physical device. That was true for the iOS 26 UISceneDelegate warning, and it is true here too.
You may be affected even if you never manually added pod 'FirebaseMessaging' to a native iOS project.
Firebase says most Unity and Flutter developers do not need direct action for the Firebase migration itself, because updating to the latest SDKs should migrate the underlying Apple dependency manager to Swift Package Manager.
That does not mean you can ignore your iOS folder. If your Flutter app has other iOS dependencies managed through CocoaPods, you still need to audit those dependencies separately. Check ios/Podfile, ios/Podfile.lock, and your CI setup.
React Native apps often use CocoaPods under the hood for native iOS dependencies. If you use React Native Firebase, check your current React Native version, your React Native Firebase version, and your ios/Podfile.
Look for:
@react-native-firebase/app@react-native-firebase/messagingios/Podfile.lockcd ios && pod installReact Native Firebase SPM support has been actively evolving, so verify against the current library docs before planning a migration.
Firebase says the transition also impacts distributions that wrap the native Firebase Apple SDK, including the Firebase Unity SDK and Firebase C++ SDK. If you manage underlying iOS dependencies through CocoaPods, follow Firebase's migration guidance for Apple apps and verify the wrapper SDK's current release notes.
Here is the practical order of operations.
Podfile, Podfile.lock, .xcworkspace, Firebase imports, and CI pipeline.FirebaseMessaging, FirebaseCrashlytics, and FirebaseAnalytics.The Firebase CocoaPods migration is not an emergency today, but it is a real deadline. October 2026 is when Firebase stops publishing new Apple SDK updates to CocoaPods. December 2, 2026 is when CocoaPods trunk becomes read-only.
If your app uses Firebase through CocoaPods, your existing build should keep working. But staying there means accepting a frozen Firebase update path. For notification-heavy apps, that is not a great long-term place to be.
Start with an audit. Move Firebase to Swift Package Manager or manual installation when your dependency graph is ready. Then test the parts that matter most: APNs registration, FCM token generation, push delivery, notification tap handling, and your CI release pipeline.
Push notifications are only reliable when the whole chain is reliable. Your package manager is now part of that chain.
What is CocoaPods?
CocoaPods is a dependency manager for Apple app projects. You list third-party SDKs in a Podfile, run pod install, and CocoaPods downloads those libraries, wires them into Xcode, and generates an .xcworkspace for the app. For years, it was one of the default ways to install SDKs like Firebase in iOS apps.
Will Firebase stop working with CocoaPods in 2026?
No. Existing Firebase CocoaPods versions will remain available, and apps using those versions will keep working. The change is that Firebase stops publishing new Apple SDK versions to CocoaPods in October 2026.
When does Firebase stop publishing Apple SDK updates to CocoaPods?
Firebase will stop publishing new Firebase Apple SDK versions to CocoaPods in October 2026.
When does CocoaPods become read-only?
CocoaPods trunk is scheduled to become permanently read-only on December 2, 2026. After that, the central registry will not accept new pod versions or new podspecs.
Do I need to migrate Firebase to Swift Package Manager?
If you want to keep receiving new Firebase Apple SDK updates, yes, you should migrate away from CocoaPods. Firebase recommends Swift Package Manager for most Apple projects, with manual installation available for projects that need it.
Can I keep using Firebase CocoaPods after 2026?
You can keep using existing Firebase pod versions, but you will be pinned to versions published before Firebase's October 2026 cutoff unless you take on your own private podspec maintenance.
Does CocoaPods read-only affect Firebase Messaging?
Yes. FirebaseMessaging is one of the Firebase Apple SDK pods affected by the CocoaPods publishing cutoff. Existing versions will remain available, but future updates will not be published to CocoaPods after October 2026.
How do I test push notifications after migrating Firebase to SPM?
Test on a physical device. Confirm APNs registration, FCM token generation, foreground delivery, background delivery, silent pushes with content-available: 1, cold-start tap handling, and any Firebase analytics callbacks you rely on.
Should I remove CocoaPods entirely?
That depends on your other dependencies. Firebase recommends avoiding mixed CocoaPods and SPM usage in the same target because it can create dependency cycles and build errors. Mixing dependency managers across separate targets can be workable during a migration, but avoid linking the same Firebase products through both systems in one target. If you use use_frameworks! in your Podfile, watch for modular header conflicts when you start mixing in SPM-linked Firebase. If non-Firebase dependencies still require CocoaPods, consider manual Firebase installation as a bridge while you migrate the rest of the project.

Inbox SDKs for Vue and Angular: a native in-app notification center
Courier now ships first-class inbox SDKs for Angular and Vue. Drop in a real-time notification center, toasts, and a preferences center with native components, an injectable service, and a composable, all backed by the same in-app inbox that already powers React and JavaScript apps.
By Mike Miller
June 19, 2026

Human-in-the-loop for AI payment agents: building approval notifications that work
AI agents need human approval before taking consequential actions: financial commitments, irreversible changes, decisions that affect other people. This post covers how to design those checkpoints and build the notification infrastructure: multi-channel delivery, live context, escalation, and a back-and-forth question loop between reviewers and the agent.
By Eric Lee
May 26, 2026

Create a customer journey from AI coding agent
Use Courier's Journey API to create multistep customer engagement workflows from your coding agent of choice. Describe the kind of journey you'd like to create, answer a few questions, and publish to the platform.
By Kyle Seyler
May 20, 2026
Β© 2026 Courier. All rights reserved.