●TOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13●OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude Code●SIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App Store●MAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessage●NATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core ML●SEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the round●TOOLING — Rork's developer repos keep moving: rork-xcode was updated on July 16, rork-device on July 15, and rork-plist on July 13●OPUS46 — Claude Opus 4.6 is live in Rork, and Rork Max is built to assemble apps on top of Claude Code●SIM — A cloud iOS simulator runs in the browser, with one click to install on a device and two clicks to publish to the App Store●MAX — Rork Max emits pure Swift rather than React Native, reaching iPhone, iPad, Apple Watch, Apple TV, Vision Pro, and even iMessage●NATIVE — That opens up HealthKit, ARKit and LiDAR, NFC, Dynamic Island, Live Activities, 3D through Metal, and on-device inference with Core ML●SEED — Rork raised a $15M seed led by Left Lane Capital, with Peak XV and a16z Speedrun joining the round
Migrating Firebase CocoaPods to Swift Package Manager in Rork Max iOS Apps — Real Migration Log and 3 Pitfalls to Avoid Before October 2026
Firebase Apple SDK's CocoaPods distribution ends in October 2026. Here's a detailed migration log from moving 4 Rork Max iOS apps to Swift Package Manager — including dSYM failures, module errors, and the Dropbox conflict copy problem you'll definitely hit.
Earlier this year, the Firebase team published an announcement that caught my attention: CocoaPods-based distribution for the Firebase Apple SDK would be discontinued in October 2026.
I run 4 iOS apps — Beautiful HD Wallpapers, Ukiyo-e Wallpapers, Relaxing Healing, and Law of Attraction Everyday. I've been building and maintaining iOS apps independently since 2013, and all four apps have accumulated more than 50 million downloads combined. Every one of them uses Firebase Crashlytics and Analytics, which means every one of them is affected by this change.
My first reaction was "October is months away." But once I actually started the migration, I kept hitting problems I hadn't anticipated — a Dropbox sync conflict that corrupted SPM's index, a dSYM upload script pointing at a path that no longer existed, and an issue specific to Rork Max where project regeneration silently restored the Podfile I had just deleted.
I started with Relaxing Healing as a pilot, and documenting what broke made the remaining three apps dramatically faster. This article is the full log.
Why This Can't Wait Until October
CocoaPods was the dominant iOS package manager for most of the 2010s. Apple integrating Swift Package Manager into Xcode natively changed the trajectory, and Firebase's October 2026 deadline is the clearest possible signal about where things are heading.
The practical consequence: if you stay on CocoaPods past October, you'll be frozen on whatever Firebase SDK version exists at that point. No security patches. No bug fixes. No support for new iOS versions or App Store requirements. Over time, apps built on a frozen SDK fail review, behave incorrectly on current hardware, or stop working altogether.
For an independent developer running real apps with real users, this is concrete risk — not hypothetical. Having maintained iOS apps since 2013, I've seen what happens when a dependency falls behind: crashes appear on new iOS versions, App Store reviews slow down while Apple flags outdated dependencies, and eventually recovery becomes much more disruptive than a planned migration would have been.
Beyond Firebase's specific deadline, CocoaPods maintenance itself has slowed considerably. Major contributors have moved on to SPM, Tuist, and other modern tooling. With each Xcode release, CocoaPods compatibility issues become slightly more common and resolution slightly slower. Starting the migration now, on your own schedule, is vastly preferable to doing it under pressure.
My Setup — 4 Apps, All Using Firebase via CocoaPods
Here's the Firebase dependency for each app before migration:
Beautiful HD Wallpapers (since 2013): Firebase/Core, Firebase/Crashlytics, Firebase/Analytics, Firebase/RemoteConfig
Law of Attraction Everyday (since 2014): Firebase/Core, Firebase/Crashlytics, Firebase/Analytics, Firebase/RemoteConfig
All four projects use Rork Max for development and maintenance work, but Firebase configuration is handled directly in Xcode. There's a specific Rork Max concern to be aware of around project regeneration, which I'll cover later.
I chose Relaxing Healing as the first migration because it uses the most Firebase modules — four, including Performance Monitoring, which has less migration documentation than the others. Starting with the most complex case meant I'd encounter the broadest set of issues in a single run.
✦
Thank you for reading this far.
Continue Reading
What follows includes implementation code, benchmarks, and practical content we hope you'll find useful. This site runs without ads — server and development costs are supported entirely by members like you. If it's been helpful, we'd be truly grateful for your support.
WHAT YOU'LL LEARN
✦Get a step-by-step SPM migration path you can start today, based on migrating 4 production apps with 50M+ total downloads
✦Prevent the 3 most common post-migration failures: dSYM upload errors, module not found in editor, and Dropbox conflict copies
✦Learn the Rork Max–specific pitfall where project regeneration can silently restore your deleted Podfile
Secure payment via Stripe · Cancel anytime
✦
Unlock This Article
Get full access to the rest of this article. Buy once, read anytime. This site is ad-free — your support goes directly toward keeping it running.
Pre-Migration: Auditing Your CocoaPods Dependencies
Before removing anything, list every pod in your Podfile and verify SPM availability for each one.
# Relaxing Healing Podfile (before migration)platform :ios, '14.0'use_frameworks!target 'RelaxingHealing' do pod 'Firebase/Core' pod 'Firebase/Crashlytics' pod 'Firebase/Analytics' pod 'Firebase/Performance'end
One decision to make on Analytics: the standard FirebaseAnalytics includes IDFA access. If your app doesn't request ATT authorization, FirebaseAnalyticsWithoutAdIdSupport avoids review friction. My apps all use ATT prompts, so I stayed with the standard variant.
If you have non-Firebase pods that don't have SPM support, you won't be able to remove Podfile entirely. You can run Firebase through SPM while keeping other dependencies in CocoaPods — it's a supported configuration, just slightly more to manage. For all four of my apps, Firebase was the only CocoaPods dependency, so I could do a clean removal.
Step-by-Step Migration — The Relaxing Healing Walkthrough
Step 1: Remove CocoaPods Completely with pod deintegrate
Don't just delete the Podfile — run pod deintegrate first to cleanly remove all CocoaPods integration artifacts from your .xcodeproj.
cd /path/to/RelaxingHealingpod deintegrate# Remove Podfile and related filesrm -f Podfile Podfile.lockrm -rf Pods/
After this, use .xcodeproj directly in Xcode. The .xcworkspace file was generated by CocoaPods and is no longer needed once Pods are gone.
Step 2: Add Firebase via Swift Package Dependencies
In Xcode, with your .xcodeproj open:
Select the project in the navigator
Open the Package Dependencies tab
Click + to add a package
Enter https://github.com/firebase/firebase-ios-sdk
Only check what you were using via CocoaPods. Adding modules you don't need increases binary size and build time. The first package resolution downloads the full SDK and takes a few minutes. Subsequent builds use cached packages and are significantly faster.
Step 3: Remove CocoaPods Residue from Build Settings
Even after pod deintegrate, some CocoaPods-injected settings can linger. Open Build Settings in Xcode and search for PODS. Remove any remaining references.
Things to check and remove:
Other Linker Flags: -ObjC (usually only needed for CocoaPods)
Header Search Paths: $(PODS_ROOT)/... entries
Library Search Paths: $(PODS_ROOT)/... entries
Build the project and confirm it compiles cleanly before moving on.
Pitfall 1: Dropbox Conflict Copies Corrupting SPM Index
This was the most time-consuming problem I ran into, and it's completely undocumented.
I sync my projects through Dropbox across multiple Macs. After adding Firebase via SPM, Xcode creates .swiftpm/xcuserdata directories inside the project. Dropbox aggressively syncs these, and when Xcode was open on two machines simultaneously, the file locking conflicts corrupted SPM's package index.
The symptom: error: cannot find module 'Firebase' in scope appeared in the editor persistently, even though clean builds succeeded. Autocomplete stopped working. The inconsistency between editor behavior and build results is the signature of this problem.
The fix is to mark the affected directories as Dropbox-ignored using xattr:
# Run from your project rootxattr -w com.dropbox.ignored 1 ".swiftpm"xattr -w com.dropbox.ignored 1 "$(find . -name 'xcshareddata' -path '*swiftpm*' 2>/dev/null | head -1)"
After applying this, quit Xcode, let Dropbox finish syncing, then reopen the project. The module errors cleared up immediately and have not recurred.
I encountered similar Dropbox sync issues with CocoaPods' xcuserdata directories back when I started using this setup in 2014. SPM's paths are different, but the underlying problem is the same. If you manage iOS projects in Dropbox, apply this fix before opening the project in Xcode for the first time after migration.
Pitfall 2: The dSYM Upload Script That Breaks Silently
Firebase Crashlytics requires a Run Script build phase to upload dSYM files for crash symbolication. The CocoaPods version references $(PODS_ROOT):
# Old CocoaPods version — breaks after migration"${PODS_ROOT}/FirebaseCrashlytics/run"
After removing CocoaPods, this path doesn't exist. Depending on how your Run Script phase is configured, this either causes a build error or fails silently — the latter being worse, because builds succeed but your crash reports in App Store Connect will show unsymbolicated hex addresses instead of file names and line numbers. You won't notice the problem until you're looking at an actual user crash.
The SPM replacement path:
# Swift Package Manager version"${BUILD_DIR%Build/*}SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run"
For a more robust version that's resilient to DerivedData location changes:
#!/bin/bash# Firebase Crashlytics dSYM upload — SPM versionFIREBASE_RUN=$(find "${BUILD_DIR%Build/*}SourcePackages/checkouts" \ -name "run" \ -path "*/Crashlytics/run" \ 2>/dev/null | head -1)if [ -z "$FIREBASE_RUN" ]; then echo "warning: Firebase Crashlytics run script not found. Skipping." exit 0fi"$FIREBASE_RUN"
Also check this setting, which is easy to overlook:
Build Settings → Debug Information Format
Release: DWARF with dSYM File ← Required for symbolication to work
(NOT just "DWARF" — that omits dSYM output entirely)
Pitfall 3: Editor Module Errors That Persist After Successful Builds
A common post-migration symptom: the app builds and runs correctly, but Xcode's editor shows persistent red underlines on Firebase imports with module 'FirebaseCore' not found. Autocomplete is broken. Everything looks wrong but actually works.
This three-step sequence resolves it almost every time. If the errors persist, close the project completely and reopen the .xcodeproj. I've seen this issue occur once or twice after the initial migration; after that, it doesn't come back.
Build Performance After Migration
The first full build after adding Firebase via SPM is noticeably slower — SPM compiles and caches packages fresh. This is expected. The issue is if every subsequent build is also slow.
If incremental builds are slower than before, check your Run Script build phases. Any script running unconditionally adds time on every build. Enable "Based on dependency analysis" on scripts that don't need to run when nothing has changed:
Build Phases → Each Run Script phase
→ ✅ Check "Based on dependency analysis"
→ The Firebase Crashlytics dSYM script will only run when the binary changes
Enabling this on Relaxing Healing brought incremental build times from about 6 minutes back down to around 90 seconds. The difference matters significantly during active development when you're building frequently.
Expanding to the Other Three Apps
With Relaxing Healing done, I migrated Beautiful HD Wallpapers, Ukiyo-e Wallpapers, and Law of Attraction Everyday using a consistent pre-migration script:
#!/bin/bash# pre-spm-migration.sh — run before opening each project in Xcodeecho "1. Deintegrating CocoaPods..."pod deintegrateecho "2. Removing CocoaPods files..."rm -f Podfile Podfile.lockrm -rf Pods/echo "3. Setting Dropbox ignore attributes..."xattr -w com.dropbox.ignored 1 ".swiftpm" 2>/dev/null || truefind . -name "xcshareddata" -path "*swiftpm*" \ -exec xattr -w com.dropbox.ignored 1 {} \; 2>/dev/null || trueecho "4. Backing up current dSYM script path..."grep -r "PODS_ROOT.*Crashlytics" . --include="*.pbxproj" \ > dSYM_backup.txt 2>/dev/null || trueecho "Done. Open .xcodeproj in Xcode and add Firebase via Package Dependencies."
Running this script first meant the Dropbox conflict issue and the dSYM path problem were both pre-empted before I even opened Xcode. The Relaxing Healing migration took 4 hours of debugging; each of the other three took about 30 minutes.
Managing Firebase Versions After Migration
One practical benefit of SPM over CocoaPods: version updates happen entirely within Xcode's UI. No terminal commands, no Podfile edits. From the Package Dependencies tab, you can see the current version of each package and update with a click.
For major version updates, Firebase occasionally introduces breaking changes. My practice is to test a new major version on one app before rolling it out to all four. Relaxing Healing serves as the pilot — if it runs cleanly for a week in TestFlight, I apply the same version to the others.
On version strategy: "Up to Next Major Version" is the default, which means Xcode will automatically pull minor and patch updates. For apps running stably in production, I prefer "Exact Version" for major packages so updates happen deliberately rather than automatically. I've had minor Firebase updates change logging behavior unexpectedly in the past, and controlling when updates happen makes it easier to isolate the cause of any new issues.
The Firebase SDK release notes are published on GitHub and in the Firebase blog. Major releases typically include a migration guide. Reading the release notes before updating has saved me debugging time more than once.
Rork Max Specific: Podfile Restoration After Project Regeneration
If you use Rork Max to manage your project, be aware that project regeneration can restore the Podfile you deleted.
Rork Max generates iOS project structure based on your configuration, and depending on your settings, it may output a Podfile as part of that structure. After SPM migration, if you regenerate the project with Rork Max for any reason, you might find a fresh Podfile has silently appeared.
Two ways to handle this:
Option A: Check Rork Max's project settings for a way to disable CocoaPods generation (availability varies by version).
Option B: Add a post-generation validation step to your workflow:
#!/bin/bash# post-rork-generate.sh — run after any Rork Max project regenerationif [ -f "Podfile" ]; then echo "⚠️ Podfile detected — possibly restored by Rork Max regeneration" echo "🗑 Removing to preserve SPM migration..." rm -f Podfile Podfile.lock rm -rf Pods/ echo "✅ Removed. Verify Package Dependencies in Xcode."fi
This script takes a couple of seconds and prevents silent regressions that are easy to miss in the middle of an active development session.
Post-Migration Verification Checklist
Before submitting to App Store, confirm:
□ App launches cleanly on physical device
□ Firebase Analytics events appear in Firebase Console (within ~1 hour)
□ Force crash (Crashlytics.crashlytics().crash()) registers in Crashlytics dashboard
□ Crash report shows symbolicated stack trace with file names and line numbers
□ Release Archive → Distribute App completes without errors
□ TestFlight build installs and runs on device
□ No $(PODS_ROOT) references remain in Build Settings
□ No Podfile present in project root
The symbolication check is the one most commonly skipped. You need to explicitly confirm that a crash report shows file names and line numbers — not just hex addresses. The only way to know dSYM upload is working correctly is to trigger a test crash and verify what appears in the Crashlytics dashboard.
Start With One App
The migration itself is straightforward once you know where the pitfalls are. The Dropbox sync issue and the dSYM script path change are not in Firebase's official migration documentation, but both are likely if your development setup resembles mine.
If you're using Rork Max, the Podfile restoration issue is the only additional concern. Everything else maps directly to standard Xcode iOS migration.
Start with your simplest app — fewest Firebase modules, lowest traffic in case something goes wrong. Run it through TestFlight for a few days before submitting an App Store update. Then apply the same approach to each remaining app in sequence.
October 2026 will arrive whether the migration is done or not. Starting now means you control the timing.
Thank you for reading — I hope this saves you some of the debugging hours I spent getting here.
Share
Thank You for Reading
Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.