◉ANTIGRAVITY LABJP
Articles/Integrations
⬡ Integrations/2026-05-28Advanced

Recovering Missing iOS dSYMs Across Six Apps with Antigravity's Background Agent — A Four-Week Operations Log

After migrating Firebase iOS SDK from CocoaPods to SPM, six wallpaper apps saw their Crashlytics symbolication rate collapse to as low as 4.2%. This is a four-week operations log of letting Antigravity's Background Agent track, upload, and verify 1,847 missing dSYMs across six repositories — including App Store Connect dSYM polling and AdMob revenue reconciliation.

antigravity464background-agent8ios38firebase11crashlytics5dsymspmindie-developer5admob17

✦ Premium Article

In March 2026 I migrated the Firebase iOS SDK in my six wallpaper apps from CocoaPods to Swift Package Manager. Within two weeks the Crashlytics symbolication rate had slid from a steady 95%+ down to 4.2% on average. It took me longer than it should have to realize the dSYMs themselves were not making it to Crashlytics anymore.

I'm Masaki Hirokawa — an artist and indie developer at Dolice. I have been shipping iOS and Android wallpaper apps independently since 2014, and the cumulative downloads recently passed 50 million. AdMob revenue covers my monthly operating costs, so a dark Crashlytics dashboard means I can't prioritize the bug fixes that actually move that number.

This article is a four-week operations log of how I let Antigravity's Background Agent locate, upload, and verify 1,847 dSYMs across six repositories until the symbolication rate was back above 96% for every app. The SPM-migration dSYM gap is a problem several solo developers I know have hit, so I've tried to write the recovery pipeline in a way you can copy and adjust.

Why SPM Migration Drops dSYMs

In the CocoaPods era, framework dSYMs lived inside Pods.xcodeproj and ended up in the same Xcode Archive directory as the app's own dSYM. Uploading the archive to App Store Connect from Organizer dragged framework dSYMs along for the ride, and Crashlytics' upload-symbols script only needed to look at ${DWARF_DSYM_FOLDER_PATH} to find everything.

SPM changes the shape of this. Frameworks resolved through Swift Package Manager respect DEBUG_INFORMATION_FORMAT=dwarf-with-dsym, but in release builds with bitcode disabled the resulting dSYMs do not consistently land inside the archive's dSYMs/ folder. Across the six apps I inspected, FirebaseCrashlytics, FirebaseRemoteConfig, FirebaseAnalytics, GoogleUtilities, and nanopb were present, but FirebaseCore, FirebaseInstallations, and GoogleAppMeasurementIdentitySupport were missing.

The culprit is the combination of Xcode 16.1's dSYM generation timing and SPM's package cache. When the cache is fresh at archive time, Xcode skips a rebuild and therefore does not regenerate the dSYMs either. The older dSYMs sit in DerivedData/{project}/Build/Products/... but xcodebuild archive does not pull them in, so upload-symbols never sees them either.

Why I Trust the 4.2% Number

The trigger was not the Firebase console — it was a 6 AM JST report that Antigravity's Background Agent had been emitting for me for months. That agent queries Crashlytics API v1 for the past seven days of crashes and symbolication rate across the six apps and drops a summary into Slack. The 22 March report contained the following lines:

[App: Coloring Wallpapers] crashes(7d)=312 symbolicated=39 (12.5%)
[App: Zen Wallpapers]      crashes(7d)=187 symbolicated=8  (4.2%)
[App: Sumi-e Wallpapers]   crashes(7d)=98  symbolicated=2  (2.0%)

Because every app had been stable around 95%+ symbolication for as long as I can remember, the drop stood out. The Background Agent is configured with a rule: any 30% week-over-week drop should get a red flag plus a root-cause hypothesis. The 22 March report duly attached the hypothesis "drop coincides with FirebaseCrashlytics SDK migration to SPM on 14 March."

To weigh acting on the hypothesis against the risk of being wrong, I reproduced the failure on a single device first. Running xcrun dwarfdump --uuid against the TestFlight build's dSYMs and diffing against the UUIDs Crashlytics already knew about, the six apps averaged 41% missing UUIDs. The gap between 4.2% symbolication and 41% missing UUIDs comes from partially-symbolicated crashes, but either way the dSYM gap was clearly the cause.

✦

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
✦Root-cause the SPM migration's dSYM fragmentation by inspecting Build Settings across six iOS apps, then reproduce the 4.2% Crashlytics symbolication failure deterministically
✦Have Antigravity's Background Agent run xcrun dwarfdump and upload-symbols in parallel to recover 1,847 dSYMs across six repositories in four weeks
✦Design monitoring jobs that respect Apple Silicon plus Xcode 16's 8-to-36-hour TestFlight dSYM availability window, and reconcile recovery against AdMob monthly revenue
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.

or
Unlock all articles with Membership →
Share

Thank You for Reading

Antigravity 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.

  • ✦Copy-paste ready implementation code
  • ✦New advanced guides published daily
  • ✦$5/mo or $10 for lifetime access
View Membership →

Related Articles

▣ App Dev2026-05-24
Running iOS Push Notification A/B Tests Weekly With Antigravity Agent — A Self-Improving Loop For Copy, Timing, And Segments
Drawing on years of indie iOS development across wallpaper and wellness apps, this article walks through a weekly Push Notification A/B loop powered by Antigravity Agent — the FCM bridge, BigQuery measurement, segment design, a D7 retention recovery story, and a dependency-free simulation that made me cut the number of arms and add a significance rule before declaring any winner.
⬡ Integrations2026-09-05
Pointing GOOGLE_GEMINI_BASE_URL at Your Own Gateway Does Not Change Who Holds the Key
I pointed the Antigravity CLI at a gateway of my own and recorded exactly which credentials travelled with it. Authorization is dropped across a cross-origin redirect, but the API key header survives every hop. Here is the measurement, and how I moved the key off my laptop.
⬡ Integrations2026-05-24
Catching "Running but Doing Nothing" Antigravity Subagents — A 3-Layer Observability Pattern Across Six Production Apps
Running Antigravity subagents across six production apps surfaced more than ten silent failures every month — exits clean, logs green, but nothing actually happened. Here is the Heartbeat / Output Trace / Decision Log pattern I now use to catch them inside 60 seconds, with code, GCP costs, and four months of running numbers.