Flutter 3.41 → 3.47. Zero regressions.
A production enterprise app with live users needed a two-step SDK jump, Apple's UIScene lifecycle and a move from CocoaPods to Swift Package Manager — without pausing releases.
Upgrade without stopping the train.
Several plugins had dropped support for the old toolchain, the iOS build relied on CocoaPods specs being retired, and the scene-based lifecycle had an App Store deadline.
The constraint: releases could not stop. Every step had to land on main behind a green build.
Four steps, all reversible.
Audit the tree
Every package mapped against the target SDK; blockers flagged first.
Upgrade in steps
SDK bump, then plugins, each behind a green CI build.
Move iOS to SPM
Pods replaced with Swift packages; UIScene adopted.
Release and watch
Staged rollout with crash monitoring before full release.
# checks on every pull requestflutter --version # 3.47.xflutter analyze --fatal-infosflutter test --coveragexcodebuild -resolvePackageDependencies
Shipped on schedule. No rollback.
The app moved to the current toolchain and stayed releasable at every step. It's the same playbook a Rescue Sprint runs on your app.
Flutter · Dart · Swift Package Manager · GitHub Actions