Case study
Modernizing a live cross-platform app without breaking its identity
Rebuilt Adventure Cache from Xamarin.Forms into a .NET 10 MAUI single project for iOS and Android while preserving its store identity and offline-first field workflows.
-
Situation
What was true before anything changed.
The repository contained a Xamarin.Forms 5 application with separate Android and iOS projects. Adventure Cache already had production listings, package identity, local data, and API behavior, so the migration could not be treated as a clean rewrite.
-
Constraints
What could not be moved.
The package and bundle identifier, signing continuity, store update paths, offline field records, synchronization queue, and map-first product behavior all had to survive while Android and iOS retained independent release risks.
-
Decision
What was chosen, and over what.
Make the MAUI single-project application the active target, retain the legacy projects as parity references, centralize local state around SQLite and queued synchronization, and validate signed and store-delivered artifacts separately on physical Android and iOS devices.
-
Tradeoff
What it cost, knowingly.
The migration was not a transparent framework swap. Production rounds exposed Android startup/AOT and first-install database issues, followed by an iOS first-launch failure in App Store version 20.1.
-
Outcome
What changed, in reach rather than volume.
Android corrections were promoted through Google Play, and App Store version 20.2 corrected the iOS first-launch crash with linker and startup hardening. Adventure Cache remains live on both stores with its original production identity.
-
Retrospective
What would be done differently.
Debug builds and existing-database checks were not enough. The release process now treats fresh installation, first launch, signed-artifact inspection, and store-delivered physical-device validation as explicit gates.
Detail
The difficult part was preserving continuity, not simply reaching a successful local build. A production mobile identity includes package identifiers, signing, local data, upgrade behavior, store metadata, and the first-launch path that routine developer-device testing may not reproduce.
The migration evidence therefore includes the failures. Version 20.1 exposed a first-launch issue after delivery; version 20.2 fixed it. The lasting outcome is the release discipline that came out of that round: fresh installs and the store-delivered artifact are now test targets in their own right.