Part 7 · 1 chapters · ~8 min

Store Releases and Staged Rollouts

Signing and build flavours, TestFlight and Play testing tracks, store review and policies, staged rollouts and halting them, crash-free rate and ANR monitoring (Crashlytics, Sentry), remote config and feature flags as kill switches, minimum supported versions and forced updates, over-the-air updates (Shorebird, EAS Update) and their store rules, and CI/CD with Fastlane or Codemagic.

9

Shipping safely to devices you do not control

code
# build and upload (CI)
flutter build ipa --release --obfuscate --split-debug-info=build/symbols     # keep symbols to de-obfuscate crashes
flutter build appbundle --release --obfuscate --split-debug-info=build/symbols
fastlane ios beta          # upload to TestFlight
fastlane android deploy track:production rollout:0.01     # 1% staged rollout on Google Play

// app start: refuse versions below the minimum the server supports
final cfg = await remoteConfig.fetch();
if (Version.parse(appVersion) < Version.parse(cfg.minSupportedVersion)) showForceUpdate();
if (!cfg.flags['new_transfer_flow']!) useLegacyFlow();     // kill switch without a release

Release gates: advance the rollout only if crash-free users stay above the threshold, ANR rate stays low (Google Play flags rates above 0.47% of daily users as bad behaviour), and payment success rate holds. Upload debug symbols for every build, or crash reports from obfuscated builds are unreadable.

A STAGED MOBILE RELEASE
you cannot roll back an installed app: stage everything
internalteam builds viaTestFlight / internaltrackbetaopt-in testers
swipe the figure sideways, or tap expand for full screen
1/4
pre-release
Internal and beta tracks (TestFlight, Play internal and closed testing) catch device-specific crashes before strangers see them.
internal, then betareal devices early