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.

Stack
  • .NET 10
  • .NET MAUI
  • SQLite
  • iOS & Android
  1. 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.

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

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

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

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

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