[{"data":1,"prerenderedAt":2325},["ShallowReactive",2],{"\u002Fblog\u002Fflutter-uiscene-migration-xcode-27-app-wont-launch-2026\u002F":3,"\u002Fblog\u002Fflutter-uiscene-migration-xcode-27-app-wont-launch-2026\u002F-related":690,"\u002Fblog\u002Fflutter-uiscene-migration-xcode-27-app-wont-launch-2026\u002F-resources":2309},{"id":4,"title":5,"author":6,"body":10,"category":631,"createdAt":632,"description":633,"disclosure":634,"extension":635,"faq":636,"howTo":634,"lastVerified":634,"location":652,"meta":653,"navigation":292,"ogImage":634,"path":659,"primaryKeyword":660,"readingTime":661,"related":662,"seo":666,"sources":667,"stem":680,"tags":681,"takeaways":682,"updatedAt":632,"url":688,"__hash__":689},"blog\u002Fblog\u002Fflutter-uiscene-migration-xcode-27-app-wont-launch-2026.md","Flutter UIScene Migration: Fix Launch Crashes on Xcode 27",{"name":7,"social":8},"Simon Dziak",{"twitter":9},"@SzymonDziak",{"type":11,"value":12,"toc":619},"minimark",[13,36,39,45,50,169,172,175,179,197,200,204,211,216,234,317,341,345,362,376,380,391,512,530,534,552,556,559,594,598,615],[14,15,16,20,21,25,26,28,29,31,32,35],"p",{},[17,18,19],"strong",{},"If your Flutter iOS app fails to launch after you build it with Xcode 27, the first thing to check is whether it has adopted Apple's UIScene lifecycle."," Flutter's docs say Flutter apps built with Xcode 27 (the iOS 27 SDK) that haven't adopted UIScene fail to launch on startup. From Flutter 3.41, the Flutter CLI migrates apps with an unmodified ",[22,23,24],"code",{},"AppDelegate"," automatically. Apps with a custom ",[22,27,24],{},", or on an older Flutter, need a few manual changes to ",[22,30,24],{}," and ",[22,33,34],{},"Info.plist",".",[14,37,38],{},"The facts below come from Flutter's UIScene page, Apple's technote TN3187 and Apple's release and requirements pages, as listed in the sources. I checked each one on October 18, 2026.",[14,40,41,44],{},[17,42,43],{},"Disclosure:"," App369 is my studio. I build and fix Flutter apps on iOS and Android, and the last section mentions what I sell. Google and Apple don't pay me for anything on this page.",[46,47,49],"h2",{"id":48},"what-changed-and-when","What changed, and when",[51,52,53,69],"table",{},[54,55,56],"thead",{},[57,58,59,63,66],"tr",{},[60,61,62],"th",{},"Date",[60,64,65],{},"What happened",[60,67,68],{},"Source",[70,71,72,96,116,132,147],"tbody",{},[57,73,74,78,81],{},[75,76,77],"td",{},"June 2025 (WWDC25)",[75,79,80],{},"Apple announces that in the release after iOS 26, UIKit apps built with the latest SDK must use the UIScene life cycle, or they won't launch",[75,82,83,90,91],{},[84,85,89],"a",{"href":86,"rel":87},"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fuiscenedelegate",[88],"nofollow","Flutter docs",", ",[84,92,95],{"href":93,"rel":94},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Ftechnotes\u002Ftn3187-migrating-to-the-uikit-scene-based-life-cycle",[88],"Apple TN3187",[57,97,98,101,104],{},[75,99,100],{},"November 12, 2025",[75,102,103],{},"Flutter 3.38 adds UIScene support, with an experimental automatic migration",[75,105,106,90,111],{},[84,107,110],{"href":108,"rel":109},"https:\u002F\u002Fflutter.dev\u002Fblog\u002Fwhats-new-in-flutter-3-38",[88],"Flutter 3.38 post",[84,112,115],{"href":113,"rel":114},"https:\u002F\u002Fstorage.googleapis.com\u002Fflutter_infra_release\u002Freleases\u002Freleases_macos.json",[88],"release archive",[57,117,118,121,124],{},[75,119,120],{},"February 11, 2026",[75,122,123],{},"Flutter 3.41: UIScene support is the default, and eligible apps are migrated automatically",[75,125,126,90,129],{},[84,127,89],{"href":86,"rel":128},[88],[84,130,115],{"href":113,"rel":131},[88],[57,133,134,137,140],{},[75,135,136],{},"April 28, 2026",[75,138,139],{},"App Store Connect uploads must be built with Xcode 26 or later",[75,141,142],{},[84,143,146],{"href":144,"rel":145},"https:\u002F\u002Fdeveloper.apple.com\u002Fnews\u002Fupcoming-requirements\u002F",[88],"Apple upcoming requirements",[57,148,149,154,159],{},[75,150,151],{},[17,152,153],{},"September 14, 2026",[75,155,156],{},[17,157,158],{},"Xcode 27 released. Flutter apps built with it that haven't adopted UIScene fail to launch",[75,160,161,90,166],{},[84,162,165],{"href":163,"rel":164},"https:\u002F\u002Fdeveloper.apple.com\u002Fnews\u002Freleases\u002F",[88],"Apple releases",[84,167,89],{"href":86,"rel":168},[88],[14,170,171],{},"On October 18, 2026, Apple's upcoming requirements page still listed Xcode 26 as the minimum for uploads and gave no date for Xcode 27. In my reading, you can still ship with Xcode 26 for now, but the app won't launch the first time you build it with Xcode 27 unless it has migrated.",[14,173,174],{},"Apple's technote says the requirement is to adopt the scene life cycle. Supporting multiple scenes is encouraged but not required.",[46,176,178],{"id":177},"step-1-let-flutter-migrate-it","Step 1: let Flutter migrate it",[14,180,181,182,184,185,188,189,192,193,196],{},"If the app is on Flutter 3.41 or later and its ",[22,183,24],{}," hasn't been customized, Flutter's docs say the CLI migrates it when you run ",[22,186,187],{},"flutter run"," or ",[22,190,191],{},"flutter build ios",". On success it prints ",[22,194,195],{},"Finished migration to UIScene lifecycle",". If it can't, it warns you and gives manual steps.",[14,198,199],{},"My advice: if the app is on an older Flutter, upgrade to the current stable first and see whether the automatic migration covers it, before changing native code by hand.",[46,201,203],{"id":202},"step-2-migrate-a-custom-appdelegate-by-hand","Step 2: migrate a custom AppDelegate by hand",[14,205,206,207,35],{},"These steps follow Flutter's ",[84,208,210],{"href":86,"rel":209},[88],"UIScene page",[212,213,215],"h3",{"id":214},"register-plugins-in-the-new-callback","Register plugins in the new callback",[14,217,218,219,222,223,225,226,229,230,233],{},"Plugins used to be registered in ",[22,220,221],{},"application:didFinishLaunchingWithOptions:",". Now the ",[22,224,24],{}," conforms to ",[22,227,228],{},"FlutterImplicitEngineDelegate"," and registers them in ",[22,231,232],{},"didInitializeImplicitFlutterEngine",":",[235,236,241],"pre",{"className":237,"code":238,"language":239,"meta":240,"style":240},"language-swift shiki shiki-themes github-light github-dark","@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate {\n  override func application(\n    _ application: UIApplication,\n    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n  ) -> Bool {\n    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n  }\n\n  func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) {\n    GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry)\n  }\n}\n","swift","",[22,242,243,251,257,263,269,275,281,287,294,300,306,311],{"__ignoreMap":240},[244,245,248],"span",{"class":246,"line":247},"line",1,[244,249,250],{},"@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate {\n",[244,252,254],{"class":246,"line":253},2,[244,255,256],{},"  override func application(\n",[244,258,260],{"class":246,"line":259},3,[244,261,262],{},"    _ application: UIApplication,\n",[244,264,266],{"class":246,"line":265},4,[244,267,268],{},"    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n",[244,270,272],{"class":246,"line":271},5,[244,273,274],{},"  ) -> Bool {\n",[244,276,278],{"class":246,"line":277},6,[244,279,280],{},"    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n",[244,282,284],{"class":246,"line":283},7,[244,285,286],{},"  }\n",[244,288,290],{"class":246,"line":289},8,[244,291,293],{"emptyLinePlaceholder":292},true,"\n",[244,295,297],{"class":246,"line":296},9,[244,298,299],{},"  func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) {\n",[244,301,303],{"class":246,"line":302},10,[244,304,305],{},"    GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry)\n",[244,307,309],{"class":246,"line":308},11,[244,310,286],{},[244,312,314],{"class":246,"line":313},12,[244,315,316],{},"}\n",[14,318,319,320,323,324,326,327,330,331,334,335,337,338,340],{},"If you created method channels or platform views in ",[22,321,322],{},"didFinishLaunchingWithOptions",", move them into ",[22,325,232],{}," too, using ",[22,328,329],{},"engineBridge.applicationRegistrar.messenger()"," as the messenger. Flutter's docs warn that accessing the ",[22,332,333],{},"FlutterViewController"," in ",[22,336,322],{}," might crash your app, and say to use the ",[22,339,228],{}," protocol instead.",[212,342,344],{"id":343},"move-ui-lifecycle-code-to-a-scene-delegate","Move UI lifecycle code to a scene delegate",[14,346,347,348,350,351,354,355,358,359,35],{},"After the migration, UIKit no longer calls the ",[22,349,24],{}," methods tied to UI state, such as ",[22,352,353],{},"applicationDidBecomeActive",". If you used them, create a scene delegate and move that code to scene events. Flutter's docs say your own scene delegate must subclass ",[22,356,357],{},"FlutterSceneDelegate"," or conform to ",[22,360,361],{},"FlutterSceneLifeCycleProvider",[14,363,364,365,367,368,371,372,375],{},"Flutter's page adds, in its plugin section, that after the migration the launch options passed to ",[22,366,322],{}," are ",[22,369,370],{},"nil",", and that logic relying on them moves to ",[22,373,374],{},"scene:willConnectToSession:options:",". My advice: look first at code that handles a notification or a URL the app was opened with.",[212,377,379],{"id":378},"add-the-scene-manifest-to-infoplist","Add the scene manifest to Info.plist",[14,381,382,383,386,387,390],{},"Add this inside the top-level ",[22,384,385],{},"\u003Cdict>"," of ",[22,388,389],{},"ios\u002FRunner\u002FInfo.plist",", as shown on Flutter's page:",[235,392,396],{"className":393,"code":394,"language":395,"meta":240,"style":240},"language-xml shiki shiki-themes github-light github-dark","\u003Ckey>UIApplicationSceneManifest\u003C\u002Fkey>\n\u003Cdict>\n  \u003Ckey>UIApplicationSupportsMultipleScenes\u003C\u002Fkey>\n  \u003Cfalse\u002F>\n  \u003Ckey>UISceneConfigurations\u003C\u002Fkey>\n  \u003Cdict>\n    \u003Ckey>UIWindowSceneSessionRoleApplication\u003C\u002Fkey>\n    \u003Carray>\n      \u003Cdict>\n        \u003Ckey>UISceneClassName\u003C\u002Fkey>\n        \u003Cstring>UIWindowScene\u003C\u002Fstring>\n        \u003Ckey>UISceneDelegateClassName\u003C\u002Fkey>\n        \u003Cstring>FlutterSceneDelegate\u003C\u002Fstring>\n        \u003Ckey>UISceneConfigurationName\u003C\u002Fkey>\n        \u003Cstring>flutter\u003C\u002Fstring>\n        \u003Ckey>UISceneStoryboardFile\u003C\u002Fkey>\n        \u003Cstring>Main\u003C\u002Fstring>\n      \u003C\u002Fdict>\n    \u003C\u002Farray>\n  \u003C\u002Fdict>\n\u003C\u002Fdict>\n","xml",[22,397,398,403,408,413,418,423,428,433,438,443,448,453,458,464,470,476,482,488,494,500,506],{"__ignoreMap":240},[244,399,400],{"class":246,"line":247},[244,401,402],{},"\u003Ckey>UIApplicationSceneManifest\u003C\u002Fkey>\n",[244,404,405],{"class":246,"line":253},[244,406,407],{},"\u003Cdict>\n",[244,409,410],{"class":246,"line":259},[244,411,412],{},"  \u003Ckey>UIApplicationSupportsMultipleScenes\u003C\u002Fkey>\n",[244,414,415],{"class":246,"line":265},[244,416,417],{},"  \u003Cfalse\u002F>\n",[244,419,420],{"class":246,"line":271},[244,421,422],{},"  \u003Ckey>UISceneConfigurations\u003C\u002Fkey>\n",[244,424,425],{"class":246,"line":277},[244,426,427],{},"  \u003Cdict>\n",[244,429,430],{"class":246,"line":283},[244,431,432],{},"    \u003Ckey>UIWindowSceneSessionRoleApplication\u003C\u002Fkey>\n",[244,434,435],{"class":246,"line":289},[244,436,437],{},"    \u003Carray>\n",[244,439,440],{"class":246,"line":296},[244,441,442],{},"      \u003Cdict>\n",[244,444,445],{"class":246,"line":302},[244,446,447],{},"        \u003Ckey>UISceneClassName\u003C\u002Fkey>\n",[244,449,450],{"class":246,"line":308},[244,451,452],{},"        \u003Cstring>UIWindowScene\u003C\u002Fstring>\n",[244,454,455],{"class":246,"line":313},[244,456,457],{},"        \u003Ckey>UISceneDelegateClassName\u003C\u002Fkey>\n",[244,459,461],{"class":246,"line":460},13,[244,462,463],{},"        \u003Cstring>FlutterSceneDelegate\u003C\u002Fstring>\n",[244,465,467],{"class":246,"line":466},14,[244,468,469],{},"        \u003Ckey>UISceneConfigurationName\u003C\u002Fkey>\n",[244,471,473],{"class":246,"line":472},15,[244,474,475],{},"        \u003Cstring>flutter\u003C\u002Fstring>\n",[244,477,479],{"class":246,"line":478},16,[244,480,481],{},"        \u003Ckey>UISceneStoryboardFile\u003C\u002Fkey>\n",[244,483,485],{"class":246,"line":484},17,[244,486,487],{},"        \u003Cstring>Main\u003C\u002Fstring>\n",[244,489,491],{"class":246,"line":490},18,[244,492,493],{},"      \u003C\u002Fdict>\n",[244,495,497],{"class":246,"line":496},19,[244,498,499],{},"    \u003C\u002Farray>\n",[244,501,503],{"class":246,"line":502},20,[244,504,505],{},"  \u003C\u002Fdict>\n",[244,507,509],{"class":246,"line":508},21,[244,510,511],{},"\u003C\u002Fdict>\n",[14,513,514,515,518,519,521,522,525,526,529],{},"If you made your own scene delegate subclass, Flutter's page says to put its name in ",[22,516,517],{},"UISceneDelegateClassName"," instead of ",[22,520,357],{},": ",[22,523,524],{},"$(PRODUCT_MODULE_NAME).SceneDelegate"," for Swift projects, ",[22,527,528],{},"SceneDelegate"," for Objective-C.",[46,531,533],{"id":532},"plugins-and-add-to-app","Plugins and add-to-app",[535,536,537,544],"ul",{},[538,539,540,543],"li",{},[17,541,542],{},"Plugins:"," Flutter's page has a separate guide for plugins that use iOS application lifecycle events. My advice: update every plugin to its latest version, then test anything that reacts to the app opening, resuming or receiving a link, such as push notifications, deep links, sign-in and payments.",[538,545,546,549,550,35],{},[17,547,548],{},"Add-to-app:"," if Flutter is embedded in a native iOS app, Flutter's page has its own section, including what to do if you can't subclass ",[22,551,357],{},[46,553,555],{"id":554},"what-to-test","What to test",[14,557,558],{},"This section is my advice, not Flutter's or Apple's.",[560,561,562,568,577,588],"ol",{},[538,563,564,567],{},[17,565,566],{},"Build with Xcode 27 and launch on a device."," If it launches, open each screen once.",[538,569,570,573,574,576],{},[17,571,572],{},"Cold start from a push notification and from a deep link."," Launch options are ",[22,575,370],{}," after the migration, so these are the paths most likely to break.",[538,578,579,582,583,188,585,35],{},[17,580,581],{},"Background and foreground the app."," Check anything that used to run in ",[22,584,353],{},[22,586,587],{},"applicationWillResignActive",[538,589,590,593],{},[17,591,592],{},"Ship through TestFlight first."," Check the same paths on a build installed the way users get it.",[46,595,597],{"id":596},"need-a-hand","Need a hand?",[14,599,600,601,605,606,610,611,35],{},"If a Flutter iOS app won't launch after building with Xcode 27, or broke after the UIScene migration, the ",[84,602,604],{"href":603},"\u002Ffixed-price\u002Fflutter-firebase-bug-fix\u002F","App Fix Ticket"," covers it in two fixed-price steps. A $450 Diagnosis gives you the root cause with evidence and a fixed repair quote within 3 business days, credited toward the fix. If you go ahead, the $1,200 Fix takes 5 business days and comes as a pull request. If the iOS build itself fails, see ",[84,607,609],{"href":608},"\u002Fblog\u002Fflutter-ios-build-failed-after-upgrade-2026\u002F","Flutter iOS build failed after an upgrade",", or ",[84,612,614],{"href":613},"\u002Fcontact\u002F","send me a short description",[616,617,618],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":240,"searchDepth":253,"depth":253,"links":620},[621,622,623,628,629,630],{"id":48,"depth":253,"text":49},{"id":177,"depth":253,"text":178},{"id":202,"depth":253,"text":203,"children":624},[625,626,627],{"id":214,"depth":259,"text":215},{"id":343,"depth":259,"text":344},{"id":378,"depth":259,"text":379},{"id":532,"depth":253,"text":533},{"id":554,"depth":253,"text":555},{"id":596,"depth":253,"text":597},"AI & Technology","2026-10-18T23:55:00.000Z","Xcode 27 shipped on September 14, 2026, and Flutter's docs say Flutter iOS apps built with it that haven't adopted the UIScene lifecycle fail to launch. Which Flutter versions migrate automatically, the manual AppDelegate and Info.plist changes, and what plugins need, from Flutter's and Apple's docs checked October 18, 2026.",null,"md",[637,640,643,646,649],{"question":638,"answer":639},"Why does my Flutter app crash on launch when built with Xcode 27?","Flutter's UIScene page says Flutter apps built with Xcode 27 (iOS 27 SDK) that haven't adopted the UIScene lifecycle fail to launch on startup. Apple announced at WWDC25 that UIKit apps built with the SDK after iOS 26 must use the UIScene life cycle. The fix is the UIScene migration.",{"question":641,"answer":642},"Does Flutter migrate to UIScene automatically?","From Flutter 3.41, yes, if your AppDelegate is unmodified. Run flutter run or flutter build ios, and Flutter's docs say the CLI prints \"Finished migration to UIScene lifecycle\" when it succeeds. With a custom AppDelegate, or on a Flutter version before 3.41, you migrate by hand.",{"question":644,"answer":645},"How do I migrate a Flutter app to UIScene by hand?","Per Flutter's docs: make AppDelegate conform to FlutterImplicitEngineDelegate, move GeneratedPluginRegistrant registration and any method channels into didInitializeImplicitFlutterEngine, move UI lifecycle logic to a scene delegate, and add a UIApplicationSceneManifest to Info.plist with FlutterSceneDelegate as the delegate class.",{"question":647,"answer":648},"Do I have to upload with Xcode 27 now?","Not yet, as of October 18, 2026. Apple's upcoming requirements page lists Xcode 26 with an iOS 26 SDK as the minimum for App Store Connect uploads since April 28, 2026, and doesn't name a date for Xcode 27. The crash happens as soon as you build with Xcode 27, so the migration is needed before you switch.",{"question":650,"answer":651},"Can I turn UIScene off temporarily?","Flutter's docs say you can, by putting an underscore in front of Application Scene Manifest in Info.plist, and that the pubspec setting enable-uiscene-migration: false hides the CLI warning. In my view, both only make sense while you build with Xcode 26, because an app built with Xcode 27 without UIScene won't launch.","Boynton Beach, FL",{"readingTimeStats":654},{"text":655,"minutes":656,"time":657,"words":658},"5 min read",4.405,264300,881,"\u002Fblog\u002Fflutter-uiscene-migration-xcode-27-app-wont-launch-2026","flutter uiscene migration","8 min",[663,664,665],"flutter-ios-build-failed-after-upgrade-2026","google-play-target-api-36-android-16-requirement-2026","flutter-deleted-android-v1-embedding-build-failed-2026",{"title":5,"description":633},[668,670,672,674,676,678],{"title":669,"url":86},"Flutter docs, UIScene adoption (last updated September 14, 2026)",{"title":671,"url":93},"Apple Developer, TN3187: Migrating to the UIKit scene-based life cycle",{"title":673,"url":144},"Apple Developer, Upcoming requirements",{"title":675,"url":163},"Apple Developer, Releases",{"title":677,"url":108},"Flutter blog, What's new in Flutter 3.38",{"title":679,"url":113},"Flutter release archive (macOS)","blog\u002Fflutter-uiscene-migration-xcode-27-app-wont-launch-2026","flutter uiscene migration, flutter app crashes on launch xcode 27, uiscene lifecycle required ios 27, FlutterSceneDelegate, FlutterImplicitEngineDelegate, didInitializeImplicitFlutterEngine, UIApplicationSceneManifest flutter, enable-uiscene-migration, TN3187 flutter",[683,684,685,686,687],"Apple said at WWDC25 that in the release after iOS 26, UIKit apps built with the latest SDK must use the UIScene life cycle, or they won't launch. Xcode 27, with the iOS 27 SDK, was released on September 14, 2026.","Flutter's docs say Flutter iOS apps built with Xcode 27 that haven't adopted UIScene fail to launch on startup.","Flutter 3.38 added UIScene support. From Flutter 3.41 (February 11, 2026), it is the default, and the Flutter CLI migrates apps with an unmodified AppDelegate automatically when you build or run.","A custom AppDelegate needs manual changes: register plugins in didInitializeImplicitFlutterEngine instead of didFinishLaunchingWithOptions, and add an Application Scene Manifest that uses FlutterSceneDelegate to Info.plist.","Plugins that rely on app lifecycle events such as applicationDidBecomeActive have to move to scene events, because UIKit stops calling the UI-related AppDelegate methods after the migration.","https:\u002F\u002Fapp369.com\u002Fblog\u002Fflutter-uiscene-migration-xcode-27-app-wont-launch-2026\u002F","phTA1gotzUIgpRjpnHOwLVRzoK6pYZ4Ej6vy9OhVEKM",[691,1217,1671],{"id":692,"title":693,"author":694,"body":696,"category":631,"createdAt":1202,"description":1203,"disclosure":634,"extension":635,"faq":634,"howTo":634,"lastVerified":634,"location":652,"meta":1204,"navigation":292,"ogImage":634,"path":1210,"primaryKeyword":634,"readingTime":1211,"related":634,"seo":1212,"sources":634,"stem":1213,"tags":1214,"takeaways":634,"updatedAt":1202,"url":1215,"__hash__":1216},"blog\u002Fblog\u002Fflutter-ios-build-failed-after-upgrade-2026.md","Flutter iOS Build Failed After an Upgrade? Fix CocoaPods and Xcode Errors (2026)",{"name":7,"social":695},{"twitter":9},{"type":11,"value":697,"toc":1185},[698,704,715,719,722,756,759,816,820,850,854,863,889,893,900,944,1021,1038,1042,1054,1087,1091,1100,1103,1107,1110,1114,1120,1124,1128,1142,1146,1158,1162,1165,1169,1175,1179,1182],[14,699,700,703],{},[17,701,702],{},"When a Flutter iOS build breaks right after an upgrade, the cause is almost always one of four things: a stale CocoaPods lock, a deployment target that is too low, FlutterFire plugins on mismatched versions, or an Xcode that no longer matches the SDKs you depend on."," The error Xcode shows first is rarely the real one. This guide is the order to work in, from reading the actual failure to the fixes that cover most upgrade breakages.",[14,705,706,707,710,711,35],{},"It is the same approach Simon uses on Workspace369, his production Flutter and Firebase SaaS, and it is the iOS build part of App369's ",[84,708,709],{"href":603},"fixed-price Flutter & Firebase Fix Ticket",". For the wider method, see ",[84,712,714],{"href":713},"\u002Fblog\u002Fhow-to-debug-a-flutter-firebase-bug-2026\u002F","how to debug a Flutter and Firebase bug",[46,716,718],{"id":717},"step-1-read-the-real-error","Step 1: Read the real error",[14,720,721],{},"Don't start by deleting folders. First get the full output.",[560,723,724,731,745],{},[538,725,726,727,730],{},"Run ",[22,728,729],{},"flutter doctor -v"," and fix anything it flags under Xcode or CocoaPods.",[538,732,726,733,736,737,740,741,744],{},[22,734,735],{},"flutter build ios -v"," (or ",[22,738,739],{},"flutter run -v",") and read from the first line that says ",[22,742,743],{},"error:",", not the last line. The final \"Xcode build failed\" message is a summary.",[538,746,747,748,751,752,755],{},"If the failure happens in Xcode itself, open ",[22,749,750],{},"ios\u002FRunner.xcworkspace"," (never ",[22,753,754],{},"Runner.xcodeproj",") and use the Report navigator to open the build log. Filter for errors and read the first one.",[14,757,758],{},"Where the error appears tells you which step failed:",[51,760,761,771],{},[54,762,763],{},[57,764,765,768],{},[60,766,767],{},"Where it fails",[60,769,770],{},"Likely area",[70,772,773,784,792,800,808],{},[57,774,775,781],{},[75,776,777,780],{},[22,778,779],{},"pod install"," output, before compiling",[75,782,783],{},"CocoaPods resolution, Podfile, specs",[57,785,786,789],{},[75,787,788],{},"\"Compiling for iOS X, but module requires iOS Y\"",[75,790,791],{},"Deployment target too low",[57,793,794,797],{},[75,795,796],{},"Swift or Objective-C compile errors inside a plugin",[75,798,799],{},"Plugin and Xcode or SDK version mismatch",[57,801,802,805],{},[75,803,804],{},"Linking or \"framework not found\"",[75,806,807],{},"Stale Pods or build cache",[57,809,810,813],{},[75,811,812],{},"Code signing messages",[75,814,815],{},"Signing and provisioning, covered at the end",[46,817,819],{"id":818},"step-2-check-your-xcode-and-cocoapods-versions","Step 2: Check your Xcode and CocoaPods versions",[14,821,822,823,828,829,31,832,835,836,841,842,845,846,849],{},"Upgrades often fail because the Firebase SDK moved its minimum requirements. The ",[84,824,827],{"href":825,"rel":826},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fios\u002Finstallation-methods",[88],"Firebase Apple platforms installation docs"," list the current Xcode requirement and say the CocoaPods distribution needs CocoaPods 1.12.0 or higher. Check yours with ",[22,830,831],{},"pod --version",[22,833,834],{},"xcodebuild -version",", and update if either is below what your plugins need. Flutter's own ",[84,837,840],{"href":838,"rel":839},"https:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fios\u002Fsetup",[88],"iOS setup page"," covers pointing the command-line tools at the right Xcode (",[22,843,844],{},"xcode-select",") and accepting licenses (",[22,847,848],{},"sudo xcodebuild -license","); a second Xcode installed on the machine is a common reason a build uses the wrong toolchain.",[46,851,853],{"id":852},"step-3-fix-the-ios-deployment-target","Step 3: Fix the iOS deployment target",[14,855,856,857,862],{},"A plugin upgrade can raise the minimum iOS version. The ",[84,858,861],{"href":859,"rel":860},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fflutter\u002Fsetup",[88],"Firebase Flutter setup page"," lists iOS 15 or later as the Apple requirement for the FlutterFire plugins. Check three places and make them agree:",[535,864,865,875,878],{},[538,866,867,870,871,874],{},[22,868,869],{},"ios\u002FPodfile",": the line ",[22,872,873],{},"platform :ios, '15.0'"," (use the minimum your plugins ask for; if the line is commented out, uncomment it).",[538,876,877],{},"Xcode: Runner target, General tab, \"Minimum Deployments\".",[538,879,880,881,884,885,888],{},"The ",[22,882,883],{},"post_install"," block in the Podfile, if you have one that sets ",[22,886,887],{},"IPHONEOS_DEPLOYMENT_TARGET"," on every pod. A value there that is lower than a pod's own minimum produces the \"module requires iOS Y\" error.",[46,890,892],{"id":891},"step-4-refresh-cocoapods-then-clean-it-out","Step 4: Refresh CocoaPods, then clean it out",[14,894,895,896,899],{},"Work from least to most destructive. Run these inside the ",[22,897,898],{},"ios"," folder.",[560,901,902,910,938],{},[538,903,904,909],{},[17,905,906],{},[22,907,908],{},"pod install --repo-update"," refreshes the local spec repository and then installs. It is the right first move after upgrading a plugin, because a stale local spec list can't find the new version.",[538,911,912,917,918,921,922,927,928,930,931,933,934,937],{},[17,913,914],{},[22,915,916],{},"pod update PODNAME"," if one pod needs to move to a newer version than ",[22,919,920],{},"Podfile.lock"," allows. As the ",[84,923,926],{"href":924,"rel":925},"https:\u002F\u002Fguides.cocoapods.org\u002Fusing\u002Fpod-install-vs-update.html",[88],"CocoaPods guide"," explains, ",[22,929,779],{}," respects the versions in ",[22,932,920],{},", while ",[22,935,936],{},"pod update"," ignores the lock and fetches the newest version your constraints allow.",[538,939,940,943],{},[17,941,942],{},"A clean reinstall."," If it is still broken, remove the generated pieces and rebuild them:",[235,945,949],{"className":946,"code":947,"language":948,"meta":240,"style":240},"language-bash shiki shiki-themes github-light github-dark","cd ios\nrm -rf Pods Podfile.lock\ncd ..\nflutter clean\nflutter pub get\ncd ios && pod install --repo-update\n","bash",[22,950,951,961,976,983,991,1001],{"__ignoreMap":240},[244,952,953,957],{"class":246,"line":247},[244,954,956],{"class":955},"sj4cs","cd",[244,958,960],{"class":959},"sZZnC"," ios\n",[244,962,963,967,970,973],{"class":246,"line":253},[244,964,966],{"class":965},"sScJk","rm",[244,968,969],{"class":955}," -rf",[244,971,972],{"class":959}," Pods",[244,974,975],{"class":959}," Podfile.lock\n",[244,977,978,980],{"class":246,"line":259},[244,979,956],{"class":955},[244,981,982],{"class":959}," ..\n",[244,984,985,988],{"class":246,"line":265},[244,986,987],{"class":965},"flutter",[244,989,990],{"class":959}," clean\n",[244,992,993,995,998],{"class":246,"line":271},[244,994,987],{"class":965},[244,996,997],{"class":959}," pub",[244,999,1000],{"class":959}," get\n",[244,1002,1003,1005,1008,1012,1015,1018],{"class":246,"line":277},[244,1004,956],{"class":955},[244,1006,1007],{"class":959}," ios",[244,1009,1011],{"class":1010},"sVt8B"," && ",[244,1013,1014],{"class":965},"pod",[244,1016,1017],{"class":959}," install",[244,1019,1020],{"class":955}," --repo-update\n",[14,1022,1023,1024,1027,1028,1030,1031,1033,1034,1037],{},"Deleting ",[22,1025,1026],{},"Pods"," is safe because it is generated. Deleting ",[22,1029,920],{}," is also safe for a one-off repair, but it lets every pod re-resolve, so you may get newer versions than before. The CocoaPods guide recommends committing ",[22,1032,920],{},", so review the diff after the reinstall and commit the new one once the build passes. If you only suspect Xcode's cache, you can also delete ",[22,1035,1036],{},"~\u002FLibrary\u002FDeveloper\u002FXcode\u002FDerivedData","; it only holds build products, and Xcode recreates it.",[46,1039,1041],{"id":1040},"step-5-upgrade-the-flutterfire-plugins-together","Step 5: Upgrade the FlutterFire plugins together",[14,1043,1044,90,1047,90,1050,1053],{},[22,1045,1046],{},"firebase_core",[22,1048,1049],{},"cloud_firestore",[22,1051,1052],{},"firebase_auth"," and the other FlutterFire plugins are versioned together and each one depends on a specific Firebase SDK release. Upgrading one and leaving the others behind is a common source of build errors, including duplicate or conflicting native pods.",[535,1055,1056,1066,1081],{},[538,1057,726,1058,1061,1062,1065],{},[22,1059,1060],{},"flutter pub outdated"," to see the gap, then upgrade the whole FlutterFire family in one ",[22,1063,1064],{},"pubspec.yaml"," change.",[538,1067,1068,1069,1072,1073,1077,1078,35],{},"Re-run ",[22,1070,1071],{},"flutterfire configure"," if you added a Firebase service or platform; the ",[84,1074,1076],{"href":859,"rel":1075},[88],"Firebase docs"," say re-running it keeps your configuration current. Install the tool with ",[22,1079,1080],{},"dart pub global activate flutterfire_cli",[538,1082,1083,1084,1086],{},"If you pin a Firebase SDK version in the Podfile, remove the pin and let the plugins choose it. A manual pin that disagrees with ",[22,1085,1046],{}," is a classic conflict.",[46,1088,1090],{"id":1089},"step-6-know-that-cocoapods-is-being-phased-out","Step 6: Know that CocoaPods is being phased out",[14,1092,1093,1094,1099],{},"This matters for upgrades in late 2026. Firebase's docs warn that it will stop publishing new versions to CocoaPods in October 2026 and recommend Swift Package Manager. Flutter's ",[84,1095,1098],{"href":1096,"rel":1097},"https:\u002F\u002Fdocs.flutter.dev\u002Fpackages-and-plugins\u002Fswift-package-manager\u002Ffor-app-developers",[88],"Swift Package Manager page"," says SwiftPM support is on by default as of Flutter 3.44, that Flutter falls back to CocoaPods for plugins that don't support it yet, and that the CocoaPods registry becomes read-only on December 2, 2026.",[14,1101,1102],{},"In practice: after a Flutter upgrade, the first build may modify your Xcode project to add SwiftPM integration. Commit that change rather than reverting it, and if a build error mentions a Swift package, read it the same way as a pod error: find the first real failure.",[46,1104,1106],{"id":1105},"step-7-signing-errors-briefly","Step 7: Signing errors, briefly",[14,1108,1109],{},"If it compiles but fails to archive, it is usually signing. In Xcode, open the Runner target, Signing & Capabilities, and check that a team is selected, the bundle identifier matches your App Store Connect app, and \"Automatically manage signing\" is on unless you manage profiles yourself. Flutter's iOS setup page notes a signed developer certificate is needed even for device testing.",[46,1111,1113],{"id":1112},"when-to-get-help","When to get help",[14,1115,1116,1117,1119],{},"If an iOS build has eaten more than a day and the steps above haven't moved it, App369's ",[84,1118,709],{"href":603}," covers build failures after a Flutter or FlutterFire upgrade. The $450 Diagnosis delivers the root cause with evidence and a fixed repair quote within 3 business days, and the $450 is credited toward the fix. The $1,200 Fix delivers the scoped defect as a pull request with a regression test within 5 business days. App Store approval isn't something anyone can guarantee; the ticket covers the code defect itself.",[46,1121,1123],{"id":1122},"frequently-asked-questions","Frequently Asked Questions",[212,1125,1127],{"id":1126},"why-did-my-flutter-ios-build-fail-after-upgrading-flutter","Why did my Flutter iOS build fail after upgrading Flutter?",[14,1129,1130,1131,1133,1134,1136,1137,1139,1140,35],{},"Most often the Podfile or Xcode project still has an old iOS deployment target, ",[22,1132,920],{}," pins old pod versions, or plugin versions no longer match each other. Run ",[22,1135,735],{},", find the first ",[22,1138,743],{}," line, then work through the deployment target and ",[22,1141,908],{},[212,1143,1145],{"id":1144},"is-it-safe-to-delete-podfilelock-and-the-pods-folder","Is it safe to delete Podfile.lock and the Pods folder?",[14,1147,1148,1149,1151,1152,1154,1155,1157],{},"Yes, for a repair. ",[22,1150,1026],{}," is generated and ",[22,1153,920],{}," is rebuilt by ",[22,1156,779],{},". The catch is that pods may resolve to newer versions, so check the new lock file and commit it once the build works.",[212,1159,1161],{"id":1160},"what-does-pod-install-repo-update-do","What does \"pod install --repo-update\" do?",[14,1163,1164],{},"It refreshes CocoaPods' local list of available pod versions before installing. Use it when a newly upgraded plugin needs a pod version your machine's spec list doesn't know about yet.",[212,1166,1168],{"id":1167},"should-i-upgrade-only-one-flutterfire-plugin","Should I upgrade only one FlutterFire plugin?",[14,1170,1171,1172,1174],{},"Avoid it. FlutterFire plugins depend on matching Firebase SDK releases, so upgrade ",[22,1173,1046],{}," and the other FlutterFire packages together and rebuild.",[212,1176,1178],{"id":1177},"do-i-need-to-switch-from-cocoapods-to-swift-package-manager","Do I need to switch from CocoaPods to Swift Package Manager?",[14,1180,1181],{},"Flutter handles it for you in recent versions and falls back to CocoaPods for plugins that don't support SwiftPM yet. Given Firebase's announced CocoaPods change, keep your plugins current rather than pinning old versions.",[616,1183,1184],{},"html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":240,"searchDepth":253,"depth":253,"links":1186},[1187,1188,1189,1190,1191,1192,1193,1194,1195],{"id":717,"depth":253,"text":718},{"id":818,"depth":253,"text":819},{"id":852,"depth":253,"text":853},{"id":891,"depth":253,"text":892},{"id":1040,"depth":253,"text":1041},{"id":1089,"depth":253,"text":1090},{"id":1105,"depth":253,"text":1106},{"id":1112,"depth":253,"text":1113},{"id":1122,"depth":253,"text":1123,"children":1196},[1197,1198,1199,1200,1201],{"id":1126,"depth":259,"text":1127},{"id":1144,"depth":259,"text":1145},{"id":1160,"depth":259,"text":1161},{"id":1167,"depth":259,"text":1168},{"id":1177,"depth":259,"text":1178},"2026-10-12T18:00:00.000Z","Flutter iOS build failing after upgrading Flutter, FlutterFire or Xcode? How to read the real error, then fix CocoaPods, deployment target and plugin version mismatches.",{"readingTimeStats":1205},{"text":1206,"minutes":1207,"time":1208,"words":1209},"6 min read",5.995,359700,1199,"\u002Fblog\u002Fflutter-ios-build-failed-after-upgrade-2026","7 min",{"title":693,"description":1203},"blog\u002Fflutter-ios-build-failed-after-upgrade-2026","flutter ios build failed, cocoapods error, pod install failed, flutterfire upgrade, xcode build error, flutter build ios, firebase ios","https:\u002F\u002Fapp369.com\u002Fblog\u002Fflutter-ios-build-failed-after-upgrade-2026\u002F","j_nFje3qmyZUdc4vyGtG-sRzwIjhUzh5-9fXsxoyaZA",{"id":1218,"title":1219,"author":1220,"body":1222,"category":631,"createdAt":1617,"description":1618,"disclosure":634,"extension":635,"faq":1619,"howTo":634,"lastVerified":634,"location":652,"meta":1635,"navigation":292,"ogImage":634,"path":1640,"primaryKeyword":1641,"readingTime":1211,"related":1642,"seo":1645,"sources":1646,"stem":1661,"tags":1662,"takeaways":1663,"updatedAt":1617,"url":1669,"__hash__":1670},"blog\u002Fblog\u002Fgoogle-play-target-api-36-android-16-requirement-2026.md","Google Play Requires Target API 36: The Android 16 Update",{"name":7,"social":1221},{"twitter":9},{"type":11,"value":1223,"toc":1610},[1224,1234,1237,1242,1246,1286,1295,1298,1318,1322,1331,1405,1412,1416,1434,1478,1481,1484,1545,1563,1567,1570,1600,1602],[14,1225,1226,1229,1230,1233],{},[17,1227,1228],{},"Since August 31, 2026, Google Play only accepts new apps and updates that target Android 16 (API level 36), and Google says you'll be able to request an extension to November 1, 2026."," Raising ",[22,1231,1232],{},"targetSdkVersion"," is one line, but it turns on Android 16 behavior: no edge-to-edge opt-out, predictive back by default, and no orientation lock on tablets. Test those three before you ship. In a Flutter app, the quickest path is usually Flutter 3.35 or later, which targets 36 by default.",[14,1235,1236],{},"The requirements below come from Google's target API page and its Android 16 behavior changes, and the Flutter defaults from Flutter's source code, as listed in the sources. I checked each one on October 18, 2026.",[14,1238,1239,1241],{},[17,1240,43],{}," App369 is my studio. I build and fix Android and iOS apps, mostly in Flutter, and the last section mentions what I sell. Google doesn't pay me for anything on this page.",[46,1243,1245],{"id":1244},"the-requirement","The requirement",[51,1247,1248,1258],{},[54,1249,1250],{},[57,1251,1252,1255],{},[60,1253,1254],{},"App type",[60,1256,1257],{},"Must target, for new apps and updates from August 31, 2026",[70,1259,1260,1270,1278],{},[57,1261,1262,1265],{},[75,1263,1264],{},"Phone and tablet apps",[75,1266,1267],{},[17,1268,1269],{},"Android 16 (API level 36)",[57,1271,1272,1275],{},[75,1273,1274],{},"Wear OS and Android Automotive OS",[75,1276,1277],{},"Android 15 (API level 35)",[57,1279,1280,1283],{},[75,1281,1282],{},"Android TV and Android XR",[75,1284,1285],{},"Android 14 (API level 34)",[14,1287,1288,1289,1294],{},"Source: ",[84,1290,1293],{"href":1291,"rel":1292},"https:\u002F\u002Fdeveloper.android.com\u002Fgoogle\u002Fplay\u002Frequirements\u002Ftarget-sdk",[88],"Google Play target API level requirement",", last updated October 16, 2026.",[14,1296,1297],{},"Google's page also says:",[535,1299,1300,1306,1312],{},[538,1301,1302,1305],{},[17,1303,1304],{},"Extension:"," if you need more time, you'll be able to request an extension to November 1, 2026. Google says the extension forms will be in Play Console \"later this year\", so check there for the form.",[538,1307,1308,1311],{},[17,1309,1310],{},"Existing apps:"," to stay available to new users on devices running a newer Android version than the app targets, an existing app must target API 35 or higher. An app that targets API 34 or lower is only available on devices running that Android version or lower.",[538,1313,1314,1317],{},[17,1315,1316],{},"Exception:"," permanently private apps for one organization's internal use.",[46,1319,1321],{"id":1320},"what-changes-when-you-target-api-36","What changes when you target API 36",[14,1323,1324,1325,1330],{},"Google's ",[84,1326,1329],{"href":1327,"rel":1328},"https:\u002F\u002Fdeveloper.android.com\u002Fabout\u002Fversions\u002F16\u002Fbehavior-changes-16",[88],"Android 16 behavior changes"," apply to apps that target API 36 and run on Android 16 or higher. These are the three I'd test first:",[51,1332,1333,1346],{},[54,1334,1335],{},[57,1336,1337,1340,1343],{},[60,1338,1339],{},"Change",[60,1341,1342],{},"What Google says",[60,1344,1345],{},"Temporary way out",[70,1347,1348,1365,1389],{},[57,1349,1350,1355,1362],{},[75,1351,1352],{},[17,1353,1354],{},"Edge-to-edge",[75,1356,1357,1358,1361],{},"Apps can no longer opt out of drawing behind the status and navigation bars. ",[22,1359,1360],{},"windowOptOutEdgeToEdgeEnforcement"," is deprecated and disabled",[75,1363,1364],{},"None for API 36",[57,1366,1367,1372,1383],{},[75,1368,1369],{},[17,1370,1371],{},"Predictive back",[75,1373,1374,1375,1378,1379,1382],{},"Predictive back animations are on by default. ",[22,1376,1377],{},"onBackPressed"," is not called and ",[22,1380,1381],{},"KEYCODE_BACK"," is not dispatched",[75,1384,1385,1388],{},[22,1386,1387],{},"android:enableOnBackInvokedCallback=\"false\""," in the manifest",[57,1390,1391,1396,1399],{},[75,1392,1393],{},[17,1394,1395],{},"Large screens",[75,1397,1398],{},"On displays at least 600dp wide, orientation, resizability and aspect ratio restrictions are ignored, so the app fills the window",[75,1400,1401,1404],{},[22,1402,1403],{},"PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY",". Google says it won't apply once you target API 37",[14,1406,1407,1408,1411],{},"The large-screen rule doesn't apply to games (based on ",[22,1409,1410],{},"android:appCategory","), to screens smaller than 600dp, or when users opt in to the app's default behavior in the device's aspect ratio settings.",[46,1413,1415],{"id":1414},"flutter-apps","Flutter apps",[14,1417,1418,1419,334,1422,1425,1426,1429,1430,1433],{},"Flutter's project template sets the target from the Flutter version: ",[22,1420,1421],{},"targetSdk = flutter.targetSdkVersion",[22,1423,1424],{},"android\u002Fapp\u002Fbuild.gradle.kts"," in Flutter 3.35's template, and ",[22,1427,1428],{},"targetSdkVersion flutter.targetSdkVersion"," in older Groovy templates such as Flutter 3.10's. Flutter's ",[22,1431,1432],{},"FlutterExtension"," source sets it to:",[51,1435,1436,1449],{},[54,1437,1438],{},[57,1439,1440,1443],{},[60,1441,1442],{},"Flutter version",[60,1444,1445,1446],{},"Default ",[22,1447,1448],{},"flutter.targetSdkVersion",[70,1450,1451,1459,1466],{},[57,1452,1453,1456],{},[75,1454,1455],{},"3.29 (February 12, 2025)",[75,1457,1458],{},"35",[57,1460,1461,1464],{},[75,1462,1463],{},"3.32 (May 20, 2025)",[75,1465,1458],{},[57,1467,1468,1473],{},[75,1469,1470],{},[17,1471,1472],{},"3.35 (August 14, 2025) and later",[75,1474,1475],{},[17,1476,1477],{},"36",[14,1479,1480],{},"Release dates from Flutter's release archive.",[14,1482,1483],{},"What that means for a Flutter app:",[560,1485,1486,1508,1522,1535],{},[538,1487,1488,1497,1498,1500,1501,1504,1505,1507],{},[17,1489,1490,1491,188,1494,35],{},"Check ",[22,1492,1493],{},"android\u002Fapp\u002Fbuild.gradle",[22,1495,1496],{},"build.gradle.kts"," If it uses ",[22,1499,1448],{},", Flutter 3.35 or later gives you 36. If it has a hard-coded number, change it to 36 yourself (",[22,1502,1503],{},"targetSdk = 36"," in a ",[22,1506,1496],{}," file).",[538,1509,1510,1513,1514,1517,1518,1521],{},[17,1511,1512],{},"Edge-to-edge."," My advice: Flutter draws its own UI, so the visible risk is content under the status or navigation bar. Check every screen with ",[22,1515,1516],{},"SafeArea"," or padding from ",[22,1519,1520],{},"MediaQuery",", including bottom sheets and screens with a bottom bar.",[538,1523,1524,1527,1528,1530,1531,1534],{},[17,1525,1526],{},"Back navigation."," If the app or a plugin overrides ",[22,1529,1377],{}," in Android code, that override won't be called on Android 16. My advice: use ",[22,1532,1533],{},"PopScope"," on the Flutter side for back handling, and check plugins that intercept back.",[538,1536,1537,1540,1541,1544],{},[17,1538,1539],{},"Tablets."," If the app locks orientation with ",[22,1542,1543],{},"SystemChrome.setPreferredOrientations"," or the manifest, test it on a tablet or a large emulator, because Google says that lock is ignored on screens 600dp or wider.",[14,1546,1547,1548,1552,1553,1557,1558,1562],{},"If an older app can't move to Flutter 3.35 because the Android build breaks first, the ",[84,1549,1551],{"href":1550},"\u002Fblog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026\u002F","v1 embedding fix"," and the ",[84,1554,1556],{"href":1555},"\u002Fblog\u002Fflutter-gradle-plugin-applied-imperatively-fix-2026\u002F","Gradle plugin fix"," cover the two errors Flutter 3.29 introduced. If the app sells in-app purchases, the ",[84,1559,1561],{"href":1560},"\u002Fblog\u002Fplay-billing-library-7-deprecated-update-to-8-2026\u002F","Billing Library 8 deadline"," is due at the same time.",[46,1564,1566],{"id":1565},"what-to-do-now","What to do now",[14,1568,1569],{},"This section is my advice, not Google's.",[560,1571,1572,1582,1588,1594],{},[538,1573,1574,1577,1578,1581],{},[17,1575,1576],{},"Check the target your last release used."," Look at ",[22,1579,1580],{},"targetSdk"," in the build file for that release, or the app bundle details in Play Console.",[538,1583,1584,1587],{},[17,1585,1586],{},"Request the extension if the change won't ship in time,"," once the form appears in Play Console. As of October 18, 2026, the November 1 extension date is two weeks away.",[538,1589,1590,1593],{},[17,1591,1592],{},"Raise the target, then test on an Android 16 device or emulator."," Go through every screen for edge-to-edge, try the back gesture everywhere, and rotate on a tablet-sized emulator.",[538,1595,1596,1599],{},[17,1597,1598],{},"Ship to a closed testing track first."," Catch layout and back-gesture issues before your users do.",[46,1601,597],{"id":596},[14,1603,1604,1605,1607,1608,35],{},"If an app can't ship an update because of the target API requirement, or something broke after raising it, the ",[84,1606,604],{"href":603}," covers it in two fixed-price steps. A $450 Diagnosis gives you the root cause with evidence and a fixed repair quote within 3 business days, credited toward the fix. If you go ahead, the $1,200 Fix takes 5 business days and comes as a pull request. Or ",[84,1609,614],{"href":613},{"title":240,"searchDepth":253,"depth":253,"links":1611},[1612,1613,1614,1615,1616],{"id":1244,"depth":253,"text":1245},{"id":1320,"depth":253,"text":1321},{"id":1414,"depth":253,"text":1415},{"id":1565,"depth":253,"text":1566},{"id":596,"depth":253,"text":597},"2026-10-18T23:45:00.000Z","Since August 31, 2026, Google Play requires new apps and updates to target Android 16 (API level 36), with an extension to November 1, 2026. What changes when you target API 36 (edge-to-edge, predictive back, large-screen orientation), which Flutter versions target it by default, and what to test, from Google's docs checked October 18, 2026.",[1620,1623,1626,1629,1632],{"question":1621,"answer":1622},"What is the Google Play target API level requirement for 2026?","Google says that starting August 31, 2026, new apps and app updates must target Android 16 (API level 36) or higher. Wear OS and Android Automotive OS apps must target API 35, and Android TV and Android XR apps API 34. Google says you'll be able to request an extension to November 1, 2026.",{"question":1624,"answer":1625},"What happens to my app if it targets an older API level?","Google says existing apps must target API 35 or higher to stay available to new users on devices running a newer Android version than the app targets. An app that targets API 34 or lower is only available on devices running that Android version or lower. New apps and updates must target API 36 to be submitted.",{"question":1627,"answer":1628},"How do I set targetSdkVersion 36 in a Flutter app?","If android\u002Fapp\u002Fbuild.gradle uses targetSdkVersion flutter.targetSdkVersion, upgrading to Flutter 3.35 or later sets it to 36, per Flutter's FlutterExtension source. Otherwise set targetSdkVersion 36 (or targetSdk = 36 in build.gradle.kts) yourself, and check that compileSdk is at least 36.",{"question":1630,"answer":1631},"Why did the back button stop working after targeting Android 16?","Google says that for apps targeting API 36 on Android 16 devices, onBackPressed is not called and KeyEvent.KEYCODE_BACK is not dispatched. Move to the supported back navigation APIs, or opt out temporarily with android:enableOnBackInvokedCallback=\"false\" in the manifest.",{"question":1633,"answer":1634},"Can I still lock my app to portrait on tablets?","Not by default. Google says that for apps targeting API 36, orientation, resizability and aspect ratio restrictions don't apply on displays at least 600dp wide, except for games and when users opt in. A temporary manifest opt-out exists, but Google says it won't apply once you target API 37.",{"readingTimeStats":1636},{"text":655,"minutes":1637,"time":1638,"words":1639},4.145,248700,829,"\u002Fblog\u002Fgoogle-play-target-api-36-android-16-requirement-2026","target api level 36",[1643,1644,665],"play-billing-library-7-deprecated-update-to-8-2026","flutter-gradle-plugin-applied-imperatively-fix-2026",{"title":1219,"description":1618},[1647,1649,1651,1654,1657,1660],{"title":1648,"url":1291},"Android Developers, Meet Google Play's target API level requirement (last updated October 16, 2026)",{"title":1650,"url":1327},"Android Developers, Behavior changes: apps targeting Android 16 or higher (last updated October 16, 2026)",{"title":1652,"url":1653},"Flutter on GitHub, FlutterExtension.kt at 3.35.0","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002F3.35.0\u002Fpackages\u002Fflutter_tools\u002Fgradle\u002Fsrc\u002Fmain\u002Fkotlin\u002FFlutterExtension.kt",{"title":1655,"url":1656},"Flutter on GitHub, app build.gradle.kts template at 3.35.0","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002F3.35.0\u002Fpackages\u002Fflutter_tools\u002Ftemplates\u002Fapp\u002Fandroid-kotlin.tmpl\u002Fapp\u002Fbuild.gradle.kts.tmpl",{"title":1658,"url":1659},"Flutter on GitHub, app build.gradle template at 3.10.0","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002F3.10.0\u002Fpackages\u002Fflutter_tools\u002Ftemplates\u002Fapp_shared\u002Fandroid-kotlin.tmpl\u002Fapp\u002Fbuild.gradle.tmpl",{"title":679,"url":113},"blog\u002Fgoogle-play-target-api-36-android-16-requirement-2026","target api level 36, google play target sdk 36, android 16 target api requirement, targetSdkVersion 36 flutter, play console target api level warning, edge to edge opt out android 16, predictive back android 16, onBackPressed not called android 16, flutter targetSdkVersion default",[1664,1665,1666,1667,1668],"Since August 31, 2026, Google Play requires new apps and app updates to target Android 16 (API level 36). Wear OS and Android Automotive OS apps need API 35, and Android TV and Android XR apps need API 34.","Google says you'll be able to request an extension to November 1, 2026, and that the extension forms will be in Play Console.","Existing apps must target API 35 or higher to stay available to new users on devices running a newer Android version than the app targets.","Targeting API 36 changes behavior on Android 16 devices: apps can no longer opt out of edge-to-edge, predictive back is on by default and onBackPressed is no longer called, and orientation and resizability limits are ignored on screens at least 600dp wide.","Flutter 3.35 and later set flutter.targetSdkVersion to 36. Flutter 3.29 and 3.32 set it to 35, so an app on those versions has to upgrade Flutter or set 36 itself.","https:\u002F\u002Fapp369.com\u002Fblog\u002Fgoogle-play-target-api-36-android-16-requirement-2026\u002F","IQ1ZDe02nMyEW91krtaNe5bo5GALwyHxNVZpM87q73w",{"id":1672,"title":1673,"author":1674,"body":1676,"category":631,"createdAt":2253,"description":2254,"disclosure":634,"extension":635,"faq":2255,"howTo":634,"lastVerified":634,"location":652,"meta":2271,"navigation":292,"ogImage":634,"path":2276,"primaryKeyword":2277,"readingTime":1211,"related":2278,"seo":2281,"sources":2282,"stem":2299,"tags":2300,"takeaways":2301,"updatedAt":2253,"url":2307,"__hash__":2308},"blog\u002Fblog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026.md","Flutter \"Deleted Android v1 Embedding\" Build Error: The Fix",{"name":7,"social":1675},{"twitter":9},{"type":11,"value":1677,"toc":2244},[1678,1706,1713,1718,1722,1796,1799,1803,1806,1833,1837,1848,1881,1884,1888,1899,2074,2082,2173,2187,2191,2201,2230,2232,2242],[14,1679,1680,1687,1688,1691,1692,31,1695,1698,1699,31,1702,1705],{},[17,1681,1682,1683,1686],{},"If ",[22,1684,1685],{},"flutter build"," stops with \"Build failed due to use of deleted Android v1 embedding\", your Android project still uses the wrapper Flutter removed in Flutter 3.29."," For a project that came straight from ",[22,1689,1690],{},"flutter create",", Flutter's guide changes two files: ",[22,1693,1694],{},"MainActivity",[22,1696,1697],{},"AndroidManifest.xml",". Custom channel code or a splash screen adds a little more. If the build instead fails inside a plugin with ",[22,1700,1701],{},"cannot find symbol",[22,1703,1704],{},"PluginRegistry.Registrar",", the plugin is the problem, and a newer version of it usually fixes it.",[14,1707,1708,1709,1712],{},"If you landed here from an old link to Flutter's \"Upgrading pre 1.12 Android projects\" wiki page or an old ",[22,1710,1711],{},"flutter.dev\u002Fgo"," migration link, this is what changed and where the steps live now. The facts come from Flutter's breaking-change docs, its migration guide and the Flutter tool's source code, as listed in the sources. I checked each one on October 18, 2026.",[14,1714,1715,1717],{},[17,1716,43],{}," App369 is my studio. I build and fix Flutter apps, and the last section mentions what I sell. Google doesn't pay me for anything on this page.",[46,1719,1721],{"id":1720},"what-happened-to-the-v1-embedding-and-when","What happened to the v1 embedding, and when",[51,1723,1724,1734],{},[54,1725,1726],{},[57,1727,1728,1730,1732],{},[60,1729,62],{},[60,1731,65],{},[60,1733,68],{},[70,1735,1736,1758,1774],{},[57,1737,1738,1741,1748],{},[75,1739,1740],{},"December 11, 2019",[75,1742,1743,1744,1747],{},"Flutter 1.12 reaches stable with the v2 Android embedding (",[22,1745,1746],{},"io.flutter.embedding",")",[75,1749,1750,90,1755],{},[84,1751,1754],{"href":1752,"rel":1753},"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fandroid-v1-embedding-create-deprecation",[88],"Flutter deprecation page",[84,1756,115],{"href":113,"rel":1757},[88],[57,1759,1760,1763,1769],{},[75,1761,1762],{},"October 1, 2020",[75,1764,1765,1766,1768],{},"Flutter 1.22: ",[22,1767,1690],{}," only makes v2 apps and plugins. Existing v1 apps keep working, but get a migration warning when they use plugins",[75,1770,1771],{},[84,1772,1754],{"href":1752,"rel":1773},[88],[57,1775,1776,1781,1786],{},[75,1777,1778],{},[17,1779,1780],{},"February 12, 2025",[75,1782,1783],{},[17,1784,1785],{},"Flutter 3.29 removes the v1 embedding Java classes",[75,1787,1788,90,1793],{},[84,1789,1792],{"href":1790,"rel":1791},"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fv1-android-embedding",[88],"Flutter removal page",[84,1794,115],{"href":113,"rel":1795},[88],[14,1797,1798],{},"Flutter's deprecation page says that by Q2 2020 only 26% of applications used the v1 embedding. In my view, the apps that still hit this error are usually ones created before 2020 and moved to a new Flutter version for the first time in years.",[212,1800,1802],{"id":1801},"what-the-old-addresses-do-today","What the old addresses do today",[14,1804,1805],{},"Checked on October 18, 2026:",[535,1807,1808,1817,1827],{},[538,1809,880,1810,1813,1814,899],{},[17,1811,1812],{},"\"Upgrading pre 1.12 Android projects\""," page on the Flutter GitHub wiki now only says it has moved, and links to the same page in the Flutter repository's ",[22,1815,1816],{},"docs",[538,1818,1819,1822,1823,1826],{},[17,1820,1821],{},"flutter.dev\u002Fgo\u002Fandroid-project-migration"," now redirects to Flutter's ",[17,1824,1825],{},"AndroidX migration"," page, which doesn't cover the v1 embedding. The embedding steps are in the repository doc above.",[538,1828,1829,1832],{},[17,1830,1831],{},"flutter.dev\u002Fgo\u002Fandroid-plugin-migration"," redirects to \"Supporting the new Android plugins APIs\", which is still the right page for plugin authors.",[46,1834,1836],{"id":1835},"why-flutter-says-your-app-is-v1","Why Flutter says your app is v1",[14,1838,1839,1840,1843,1844,1847],{},"The check is in the Flutter tool's ",[22,1841,1842],{},"project.dart",". It reads ",[22,1845,1846],{},"android\u002Fapp\u002Fsrc\u002Fmain\u002FAndroidManifest.xml"," and treats the app as v1 when:",[535,1849,1850,1861,1871,1878],{},[538,1851,1852,1853,1856,1857,1860],{},"the ",[22,1854,1855],{},"\u003Capplication>"," tag has ",[22,1858,1859],{},"android:name=\"io.flutter.app.FlutterApplication\"",", or",[538,1862,1863,1864,1867,1868,1860],{},"there is a ",[22,1865,1866],{},"flutterEmbedding"," meta-data tag with value ",[22,1869,1870],{},"1",[538,1872,1873,1874,1877],{},"there is no ",[22,1875,1876],{},"\u003Cmeta-data android:name=\"flutterEmbedding\" android:value=\"2\"\u002F>"," at all, or",[538,1879,1880],{},"the manifest file is missing.",[14,1882,1883],{},"Any of those ends the build with \"Build failed due to use of deleted Android v1 embedding.\" The tool skips this check for add-to-app modules and plugins.",[46,1885,1887],{"id":1886},"fixing-the-app","Fixing the app",[14,1889,1890,1891,1896,1897,35],{},"These are the steps from Flutter's ",[84,1892,1895],{"href":1893,"rel":1894},"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002Fmaster\u002Fdocs\u002Fplatforms\u002Fandroid\u002FUpgrading-pre-1.12-Android-projects.md",[88],"Upgrading pre 1.12 Android projects"," guide, for a project made with ",[22,1898,1690],{},[560,1900,1901,1964,1992,2007,2035,2056],{},[538,1902,1903,1908,1909,1912,1913,1916,1917,1920,1921,1924,1925,1928,1929,1950,1953,1954,1957,1958,31,1961,35],{},[17,1904,1905,1906,35],{},"Update ",[22,1907,1694],{}," Change ",[22,1910,1911],{},"import io.flutter.app.FlutterActivity"," to ",[22,1914,1915],{},"import io.flutter.embedding.android.FlutterActivity"," and delete the ",[22,1918,1919],{},"onCreate"," override that calls ",[22,1922,1923],{},"GeneratedPluginRegistrant.registerWith(this)",". The new ",[22,1926,1927],{},"FlutterActivity"," registers plugins itself.",[235,1930,1934],{"className":1931,"code":1932,"language":1933,"meta":240,"style":240},"language-kotlin shiki shiki-themes github-light github-dark","import io.flutter.embedding.android.FlutterActivity\n\nclass MainActivity: FlutterActivity()\n","kotlin",[22,1935,1936,1941,1945],{"__ignoreMap":240},[244,1937,1938],{"class":246,"line":247},[244,1939,1940],{},"import io.flutter.embedding.android.FlutterActivity\n",[244,1942,1943],{"class":246,"line":253},[244,1944,293],{"emptyLinePlaceholder":292},[244,1946,1947],{"class":246,"line":259},[244,1948,1949],{},"class MainActivity: FlutterActivity()\n",[1951,1952],"br",{},"If your file is ",[22,1955,1956],{},"MainActivity.java",", the guide's result is the same: ",[22,1959,1960],{},"import io.flutter.embedding.android.FlutterActivity;",[22,1962,1963],{},"public class MainActivity extends FlutterActivity {}",[538,1965,1966,1969,1970,1972,1973,1976,1977,1980,1981,518,1984,1987,1988,1991],{},[17,1967,1968],{},"Move any platform channel code."," If ",[22,1971,1919],{}," also set up a ",[22,1974,1975],{},"MethodChannel",", move it into a ",[22,1978,1979],{},"configureFlutterEngine(flutterEngine)"," override, and use ",[22,1982,1983],{},"flutterEngine.getDartExecutor().getBinaryMessenger()",[22,1985,1986],{},"getFlutterView()",". The guide's example also calls ",[22,1989,1990],{},"GeneratedPluginRegistrant.registerWith(flutterEngine)"," at the start of that override.",[538,1993,1994,1997,1998,2000,2001,2003,2004,35],{},[17,1995,1996],{},"Fix the application tag."," In ",[22,1999,1697],{},", replace ",[22,2002,1859],{}," with ",[22,2005,2006],{},"android:name=\"${applicationName}\"",[538,2008,2009,2012,2013,233,2015],{},[17,2010,2011],{},"Declare the v2 embedding."," Add this inside ",[22,2014,1855],{},[235,2016,2018],{"className":393,"code":2017,"language":395,"meta":240,"style":240},"\u003Cmeta-data\n    android:name=\"flutterEmbedding\"\n    android:value=\"2\" \u002F>\n",[22,2019,2020,2025,2030],{"__ignoreMap":240},[244,2021,2022],{"class":246,"line":247},[244,2023,2024],{},"\u003Cmeta-data\n",[244,2026,2027],{"class":246,"line":253},[244,2028,2029],{},"    android:name=\"flutterEmbedding\"\n",[244,2031,2032],{"class":246,"line":259},[244,2033,2034],{},"    android:value=\"2\" \u002F>\n",[538,2036,2037,2040,2041,2044,2045,2048,2049,334,2052,2055],{},[17,2038,2039],{},"Update the splash screen if you had one."," Remove meta-data named ",[22,2042,2043],{},"io.flutter.app.android.SplashScreenUntilFirstFrame",". The guide shows the replacement: a ",[22,2046,2047],{},"LaunchTheme"," and a ",[22,2050,2051],{},"NormalTheme",[22,2053,2054],{},"styles.xml",", set on the activity.",[538,2057,2058,2061,2062,2065,2066,2069,2070,2073],{},[17,2059,2060],{},"Rebuild."," The guide says the app should then build as normal, for example with ",[22,2063,2064],{},"flutter build apk",". My advice: run ",[22,2067,2068],{},"flutter clean"," first, and ",[22,2071,2072],{},"flutter pub upgrade"," too, because a project this old usually has plugins that are out of date as well.",[14,2075,2076,2077,2081],{},"If your own code uses other removed classes, Flutter's ",[84,2078,2080],{"href":1790,"rel":2079},[88],"removal page"," lists the replacements:",[51,2083,2084,2094],{},[54,2085,2086],{},[57,2087,2088,2091],{},[60,2089,2090],{},"Removed class",[60,2092,2093],{},"Use instead",[70,2095,2096,2108,2120,2134,2146,2158],{},[57,2097,2098,2103],{},[75,2099,2100],{},[22,2101,2102],{},"io.flutter.app.FlutterActivity",[75,2104,2105],{},[22,2106,2107],{},"io.flutter.embedding.android.FlutterActivity",[57,2109,2110,2115],{},[75,2111,2112],{},[22,2113,2114],{},"io.flutter.app.FlutterFragmentActivity",[75,2116,2117],{},[22,2118,2119],{},"io.flutter.embedding.android.FlutterFragmentActivity",[57,2121,2122,2127],{},[75,2123,2124],{},[22,2125,2126],{},"io.flutter.app.FlutterApplication",[75,2128,2129,2130,2133],{},"Removed. Extend ",[22,2131,2132],{},"android.app.Application"," if you need a custom one",[57,2135,2136,2141],{},[75,2137,2138],{},[22,2139,2140],{},"io.flutter.app.FlutterPlayStoreSplitApplication",[75,2142,2143],{},[22,2144,2145],{},"io.flutter.embedding.android.FlutterPlayStoreSplitApplication",[57,2147,2148,2153],{},[75,2149,2150],{},[22,2151,2152],{},"io.flutter.view.FlutterMain",[75,2154,2155],{},[22,2156,2157],{},"io.flutter.embedding.engine.loader.FlutterLoader",[57,2159,2160,2168],{},[75,2161,2162,31,2165],{},[22,2163,2164],{},"io.flutter.view.FlutterView",[22,2166,2167],{},"FlutterNativeView",[75,2169,2170],{},[22,2171,2172],{},"io.flutter.embedding.android.FlutterView",[14,2174,2175,2176,31,2179,2182,2183,2186],{},"For add-to-app projects, the same guide has a separate section: remove calls to ",[22,2177,2178],{},"FlutterMain.startInitialization",[22,2180,2181],{},"ensureInitializationComplete",", and replace the ",[22,2184,2185],{},"io.flutter.facade"," classes.",[46,2188,2190],{"id":2189},"fixing-a-plugin-that-still-uses-pluginregistryregistrar","Fixing a plugin that still uses PluginRegistry.Registrar",[14,2192,2193,2194,2197,2198,2200],{},"If the error points at a plugin, its Android code usually still has a ",[22,2195,2196],{},"registerWith(PluginRegistry.Registrar registrar)"," method. That API was removed with the rest of the v1 embedding. When the Flutter tool sees that line in a failed build, it prints its own advice: run ",[22,2199,2072],{}," to get newer plugin versions, and file an issue if that doesn't help.",[535,2202,2203,2216],{},[538,2204,2205,2208,2209,2211,2212,2215],{},[17,2206,2207],{},"If you use the plugin:"," upgrade it, as the tool suggests. My advice: if ",[22,2210,2072],{}," doesn't move it, check pub.dev for a newer major version and run ",[22,2213,2214],{},"flutter pub upgrade --major-versions",". If the plugin has had no release in years, replace it.",[538,2217,2218,2221,2222,2225,2226,2229],{},[17,2219,2220],{},"If you maintain the plugin:"," Flutter's removal page says to delete the ",[22,2223,2224],{},"registerWith"," method from your ",[22,2227,2228],{},"FlutterPlugin"," implementation. The Flutter team did the same for its own plugins in flutter\u002Fpackages#6494.",[46,2231,597],{"id":596},[14,2233,2234,2235,2237,2238,610,2240,35],{},"If an older Flutter app won't build after an upgrade, the ",[84,2236,604],{"href":603}," covers it in two fixed-price steps. A $450 Diagnosis gives you the root cause with evidence and a fixed repair quote within 3 business days, credited toward the fix. If you go ahead, the $1,200 Fix takes 5 business days and comes as a pull request. If the iOS side broke too, see ",[84,2239,609],{"href":608},[84,2241,614],{"href":613},[616,2243,618],{},{"title":240,"searchDepth":253,"depth":253,"links":2245},[2246,2249,2250,2251,2252],{"id":1720,"depth":253,"text":1721,"children":2247},[2248],{"id":1801,"depth":259,"text":1802},{"id":1835,"depth":253,"text":1836},{"id":1886,"depth":253,"text":1887},{"id":2189,"depth":253,"text":2190},{"id":596,"depth":253,"text":597},"2026-10-18T21:00:00.000Z","Flutter removed the Android v1 embedding in Flutter 3.29 (February 12, 2025), so older projects now stop with \"Build failed due to use of deleted Android v1 embedding\" or a plugin error about PluginRegistry.Registrar. What the error means, how Flutter decides your app is v1, and the exact AndroidManifest and MainActivity changes, from Flutter's docs and source checked October 18, 2026.",[2256,2259,2262,2265,2268],{"question":2257,"answer":2258},"What does \"Build failed due to use of deleted Android v1 embedding\" mean?","The Flutter tool decided your Android app still uses the old v1 embedding, which was removed in Flutter 3.29. In Flutter's source, that happens when AndroidManifest.xml uses io.flutter.app.FlutterApplication, or has no flutterEmbedding meta-data with value 2, or the AndroidManifest.xml file is missing.",{"question":2260,"answer":2261},"How do I fix the deleted Android v1 embedding error?","Follow Flutter's \"Upgrading pre 1.12 Android projects\" steps: import io.flutter.embedding.android.FlutterActivity in MainActivity, remove the old onCreate plugin registration, set android:name=\"${applicationName}\" on the application tag, and add \u003Cmeta-data android:name=\"flutterEmbedding\" android:value=\"2\"\u002F> inside \u003Capplication>.",{"question":2263,"answer":2264},"Which Flutter version removed the v1 embedding?","Flutter 3.29. Flutter's breaking-change page says the removal landed in 3.28.0-0.1.pre and shipped in stable 3.29, which Flutter's release archive dates February 12, 2025.",{"question":2266,"answer":2267},"Why does a plugin fail with \"cannot find symbol\" PluginRegistry.Registrar?","The plugin usually still has a registerWith method that takes a PluginRegistry.Registrar, a v1 API removed in Flutter 3.29. Flutter's build output suggests running flutter pub upgrade to get a newer plugin version. If no fixed version exists, the method has to be removed from the plugin.",{"question":2269,"answer":2270},"Can I keep using the v1 embedding on an older Flutter version?","Flutter's breaking-change page says it was removed in 3.29, so earlier versions still have it. In my view, pinning an old Flutter only delays the fix. Newer plugin versions and store requirements move on, and for a standard flutter create project the migration changes two files.",{"readingTimeStats":2272},{"text":655,"minutes":2273,"time":2274,"words":2275},4.1,246000,820,"\u002Fblog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026","build failed due to use of deleted android v1 embedding",[663,2279,2280],"jcenter-bintray-shut-down-fix-android-flutter-builds-2026","how-to-debug-a-flutter-firebase-bug-2026",{"title":1673,"description":2254},[2283,2285,2287,2289,2292,2295,2298],{"title":2284,"url":1790},"Flutter docs, Removal of v1 Android embedding Java APIs (last updated July 31, 2026)",{"title":2286,"url":1752},"Flutter docs, Android v1 embedding app and plugin creation deprecation",{"title":2288,"url":1893},"Flutter on GitHub, Upgrading pre 1.12 Android projects",{"title":2290,"url":2291},"Flutter docs, Supporting the new Android plugins APIs","https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fplugin-api-migration",{"title":2293,"url":2294},"Flutter on GitHub, flutter_tools project.dart (embedding check)","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002Fmaster\u002Fpackages\u002Fflutter_tools\u002Flib\u002Fsrc\u002Fproject.dart",{"title":2296,"url":2297},"Flutter on GitHub, flutter_tools gradle_errors.dart (v1 embedding plugin handler)","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002Fmaster\u002Fpackages\u002Fflutter_tools\u002Flib\u002Fsrc\u002Fandroid\u002Fgradle_errors.dart",{"title":679,"url":113},"blog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026","build failed due to use of deleted android v1 embedding, flutter v1 embedding, flutter v2 embedding migration, flutterEmbedding meta-data, io.flutter.app.FlutterActivity, PluginRegistry.Registrar cannot find symbol, registerWith registrar flutter plugin, flutter 3.29 android build error, upgrading pre 1.12 android projects",[2302,2303,2304,2305,2306],"Flutter removed the Android v1 embedding in Flutter 3.29, released on February 12, 2025. Classes such as io.flutter.app.FlutterActivity, io.flutter.app.FlutterApplication and io.flutter.view.FlutterView no longer exist.","The Flutter tool treats an app as v1, and stops with \"Build failed due to use of deleted Android v1 embedding\", when its AndroidManifest.xml uses io.flutter.app.FlutterApplication or lacks \u003Cmeta-data android:name=\"flutterEmbedding\" android:value=\"2\"\u002F>.","The app fix is Flutter's own migration: change the FlutterActivity import, move custom channel setup into configureFlutterEngine, set android:name=\"${applicationName}\" and add the flutterEmbedding meta-data with value 2.","A plugin that still has a registerWith(PluginRegistry.Registrar) method fails to compile instead. Flutter's build output suggests flutter pub upgrade, and plugin authors should delete registerWith.","The v2 embedding arrived in Flutter 1.12 in December 2019, and flutter create stopped making v1 projects in Flutter 1.22, so, in my view, the apps hit now are mostly ones created before 2020 and not updated since.","https:\u002F\u002Fapp369.com\u002Fblog\u002Fflutter-deleted-android-v1-embedding-build-failed-2026\u002F","XCzq_ukIlixYX4apwJmjPfdlWXhqHCbmPMl9c9Hexls",[2310,2312,2315,2318,2319,2322],{"keyword":5,"url":688,"title":5,"relevance":2311},73,{"keyword":2313,"url":2314,"title":2313,"relevance":296},"Flutter \"Applying Gradle Plugin Imperatively\" Error: The Fix","https:\u002F\u002Fapp369.com\u002Fblog\u002Fflutter-gradle-plugin-applied-imperatively-fix-2026\u002F",{"keyword":2316,"url":2317,"title":2316,"relevance":296},"ITMS-90725 SDK Version Issue: Fix in Flutter (Xcode 26)","https:\u002F\u002Fapp369.com\u002Fblog\u002Fitms-90725-sdk-version-issue-xcode-26-flutter-2026\u002F",{"keyword":693,"url":1215,"title":693,"relevance":289},{"keyword":2320,"url":2321,"title":2320,"relevance":283},"Flutter vs React Native: Which Is Best?","https:\u002F\u002Fapp369.com\u002Fblog\u002Fflutter-vs-react-native-app369-choice\u002F",{"keyword":2323,"url":2324,"title":2323,"relevance":277},"ITMS-90683: Fix Missing Purpose String in Info.plist","https:\u002F\u002Fapp369.com\u002Fblog\u002Fitms-90683-missing-purpose-string-info-plist-flutter-2026\u002F",1792358634514]