[{"data":1,"prerenderedAt":2224},["ShallowReactive",2],{"\u002Fblog\u002Fitms-90725-sdk-version-issue-xcode-26-flutter-2026\u002F":3,"\u002Fblog\u002Fitms-90725-sdk-version-issue-xcode-26-flutter-2026\u002F-related":439,"\u002Fblog\u002Fitms-90725-sdk-version-issue-xcode-26-flutter-2026\u002F-resources":2219},{"id":4,"title":5,"author":6,"body":10,"category":357,"createdAt":358,"description":359,"disclosure":360,"extension":361,"faq":362,"howTo":360,"lastVerified":360,"location":378,"meta":379,"navigation":385,"ogImage":360,"path":386,"primaryKeyword":387,"readingTime":388,"related":389,"seo":393,"sources":394,"stem":429,"tags":430,"takeaways":431,"updatedAt":358,"url":437,"__hash__":438},"blog\u002Fblog\u002Fitms-90725-sdk-version-issue-xcode-26-flutter-2026.md","ITMS-90725 SDK Version Issue: Fix in Flutter (Xcode 26)",{"name":7,"social":8},"Simon Dziak",{"twitter":9},"@SzymonDziak",{"type":11,"value":12,"toc":344},"minimark",[13,21,24,30,35,38,44,47,51,121,129,132,136,146,150,153,183,202,206,223,231,235,242,282,289,293,300,303,306,310,313,317,324,328,340],[14,15,16,20],"p",{},[17,18,19],"strong",{},"If App Store Connect shows ITMS-90725 \"SDK version issue,\" the build you uploaded was made with an older SDK than Apple now accepts, and the fix is to rebuild it with Xcode 26 or later."," Apple's upcoming requirements page says that since April 28, 2026, apps uploaded to App Store Connect must be built with Xcode 26 or later using an SDK for iOS 26, iPadOS 26, tvOS 26, visionOS 26 or watchOS 26. In a Flutter app, that often means the Mac or CI machine that builds the IPA is still running Xcode 16.",[14,22,23],{},"The facts below come from Apple's requirements and release pages, Flutter's docs and source, and GitHub's runner image lists, as shown in the sources. I checked each one on October 18, 2026.",[14,25,26,29],{},[17,27,28],{},"Disclosure:"," App369 is my studio. I build and fix Android and iOS apps, mostly in Flutter, and the last section mentions what I sell. Apple doesn't pay me for anything on this page.",[31,32,34],"h2",{"id":33},"what-the-error-says","What the error says",[14,36,37],{},"The wording below is a developer's copy of the email, posted in an Apple Developer Forums thread in January 2026. It is not Apple's own documentation:",[39,40,41],"blockquote",{},[14,42,43],{},"This app was built with the iOS 18.2 SDK. Starting April 2026, all iOS and iPadOS apps must be built with the iOS 26 SDK or later, included in Xcode 26 or later, in order to be uploaded to App Store Connect or submitted for distribution.",[14,45,46],{},"The same thread shows the message arrived months before the date it names. A GitHub issue in a project named pot-g-flutter, dated February 2026, describes the same warning on a build made with the iOS 18.5 SDK. Your email will name the SDK your build used. That number tells you how far behind your build machine is.",[31,48,50],{"id":49},"what-apple-requires-today","What Apple requires today",[52,53,54,70],"table",{},[55,56,57],"thead",{},[58,59,60,64,67],"tr",{},[61,62,63],"th",{},"Date",[61,65,66],{},"What Apple says",[61,68,69],{},"Source",[71,72,73,93,106],"tbody",{},[58,74,75,81,84],{},[76,77,78],"td",{},[17,79,80],{},"Since April 28, 2026",[76,82,83],{},"\"Apps uploaded to App Store Connect must be built with Xcode 26 or later using an SDK for iOS 26, iPadOS 26, tvOS 26, visionOS 26, or watchOS 26.\"",[76,85,86],{},[87,88,92],"a",{"href":89,"rel":90},"https:\u002F\u002Fdeveloper.apple.com\u002Fnews\u002Fupcoming-requirements\u002F",[91],"nofollow","Apple, upcoming requirements",[58,94,95,98,101],{},[76,96,97],{},"Since September 9, 2026",[76,99,100],{},"iOS and iPadOS apps uploaded to App Store Connect must target iOS 13 or later. This is a minimum deployment target, not an SDK rule",[76,102,103],{},[87,104,92],{"href":89,"rel":105},[91],[58,107,108,111,114],{},[76,109,110],{},"September 14, 2026",[76,112,113],{},"Xcode 27 released. Apple's releases page lists Xcode 27.1 as the newest release, dated October 15, 2026",[76,115,116],{},[87,117,120],{"href":118,"rel":119},"https:\u002F\u002Fdeveloper.apple.com\u002Fnews\u002Freleases\u002F",[91],"Apple, releases",[14,122,123,124,128],{},"On October 18, 2026, the upcoming requirements page had no entry for Xcode 27 or the iOS 27 SDK. So Apple hasn't published an Xcode 27 upload requirement that I can find. Xcode 26 or later is the stated minimum. My advice: build with Xcode 26.6, or Xcode 27 once the app has migrated to UIScene. Read the ",[87,125,127],{"href":126},"\u002Fblog\u002Fflutter-uiscene-migration-xcode-27-app-wont-launch-2026\u002F","UIScene guide"," before you move a Flutter app to Xcode 27.",[14,130,131],{},"Apple doesn't say whether this is a warning or a rejection. Its page says apps \"must be built\" this way, so plan on fixing it, not waiting to see.",[31,133,135],{"id":134},"step-1-install-the-required-xcode","Step 1: Install the required Xcode",[137,138,139,143],"ol",{},[140,141,142],"li",{},"Install Xcode 26 or later from the Mac App Store or Apple's developer downloads. Apple's releases page lists Xcode 26.6 (June 25, 2026) as the newest Xcode 26 release.",[140,144,145],{},"Open it once and let it install its components.",[31,147,149],{"id":148},"step-2-make-the-command-line-use-it","Step 2: Make the command line use it",[14,151,152],{},"A Flutter build runs through the command-line tools, so the selected Xcode matters, not the one you last opened. Flutter's iOS setup page gives this command for pointing the tools at an Xcode install:",[154,155,160],"pre",{"className":156,"code":157,"language":158,"meta":159,"style":159},"language-bash shiki shiki-themes github-light github-dark","sudo sh -c 'xcode-select -s \u002FApplications\u002FXcode.app\u002FContents\u002FDeveloper && xcodebuild -runFirstLaunch'\n","bash","",[161,162,163],"code",{"__ignoreMap":159},[164,165,168,172,176,180],"span",{"class":166,"line":167},"line",1,[164,169,171],{"class":170},"sScJk","sudo",[164,173,175],{"class":174},"sZZnC"," sh",[164,177,179],{"class":178},"sj4cs"," -c",[164,181,182],{"class":174}," 'xcode-select -s \u002FApplications\u002FXcode.app\u002FContents\u002FDeveloper && xcodebuild -runFirstLaunch'\n",[14,184,185,186,189,190,193,194,197,198,201],{},"Replace ",[161,187,188],{},"\u002FApplications\u002FXcode.app"," if you installed it somewhere else. Apple's TN2339 documents ",[161,191,192],{},"xcode-select --print-path"," to see the current selection, and ",[161,195,196],{},"xcode-select -switch"," to change it. Then run ",[161,199,200],{},"xcodebuild -version"," to see the version in use. My advice: do this on every Mac that builds the app, including old laptops and CI machines you forgot about.",[31,203,205],{"id":204},"step-3-dont-trust-flutter-doctor-for-this","Step 3: Don't trust flutter doctor for this",[14,207,208,211,212,215,216,219,220,222],{},[161,209,210],{},"flutter doctor"," checks Xcode, but not against Apple's upload rule. In the Flutter source on the master branch, ",[161,213,214],{},"xcodeRequiredVersion"," is 15 and ",[161,217,218],{},"xcodeRecommendedVersion"," is 16. The doctor warns below the recommended version. Xcode 16 passes that check but would still trigger ITMS-90725. So a clean doctor result doesn't mean Apple will accept the build. Check ",[161,221,200],{}," yourself.",[14,224,225,226,230],{},"If your Flutter is old and the build breaks under Xcode 26, upgrade Flutter and see ",[87,227,229],{"href":228},"\u002Fblog\u002Fflutter-ios-build-failed-after-upgrade-2026\u002F","the iOS build-failed-after-upgrade guide",".",[31,232,234],{"id":233},"step-4-rebuild-pods-and-the-archive","Step 4: Rebuild pods and the archive",[14,236,237,238,241],{},"After switching Xcode, old build output can linger. Work from least to most destructive, from the ",[161,239,240],{},"ios"," folder:",[137,243,244,249,271],{},[140,245,246,230],{},[161,247,248],{},"pod install --repo-update",[140,250,251,252,255,256,259,260,263,264,267,268,270],{},"If pods still build against the old toolchain, delete ",[161,253,254],{},"Pods"," and ",[161,257,258],{},"Podfile.lock",", run ",[161,261,262],{},"flutter clean",", ",[161,265,266],{},"flutter pub get",", then ",[161,269,248],{}," again.",[140,272,273,274,277,278,281],{},"Build the archive with ",[161,275,276],{},"flutter build ipa",", or archive in Xcode from ",[161,279,280],{},"ios\u002FRunner.xcworkspace",", and upload again.",[14,283,284,285,288],{},"The ",[87,286,287],{"href":228},"build-failed guide"," covers the deployment target, CocoaPods and plugin mismatches in more detail. Keep the two targets apart: the SDK is what you build with, and the deployment target is the oldest iOS you support. Apple's September 9, 2026 entry only requires iOS 13 or later. Your plugins may ask for more.",[31,290,292],{"id":291},"fix-it-on-ci","Fix it on CI",[14,294,295,296,299],{},"If the upload comes from a build server, the server's Xcode decides the SDK. For GitHub Actions, the macOS 26 arm64 image readme I read lists Xcode 26.6 as the default, along with 26.5, 26.4.1, 26.3, 26.2, 26.1.1 and 26.0.1. It also lists CocoaPods 1.17.0. GitHub announced a separate ",[161,297,298],{},"xcode-27"," image label in July 2026, marked preview, and its readme lists Xcode 27.0 as that image's default.",[14,301,302],{},"If your workflow pins an older image or selects an old Xcode, change it. Older images list different Xcode versions, so check the readme for the image your workflow uses.",[14,304,305],{},"On other CI services, such as Codemagic, check the provider's own page for the Xcode versions it offers.",[31,307,309],{"id":308},"other-services-that-build-for-you","Other services that build for you",[14,311,312],{},"The warning can also reach people who don't run the build themselves. If a hosted or no-code builder makes your iOS build, the Xcode it uses is the vendor's choice. Check its documentation for the Xcode version, and if it is older than 26, export the project and build it locally with Xcode 26 or later, or wait for the vendor to upgrade.",[31,314,316],{"id":315},"related-errors","Related errors",[14,318,319,320,230],{},"If the next email is about privacy manifests, see ",[87,321,323],{"href":322},"\u002Fblog\u002Fapple-privacy-manifest-itms-91053-itms-91061-flutter-fix-2026\u002F","ITMS-91053 and ITMS-91061",[31,325,327],{"id":326},"need-a-hand","Need a hand?",[14,329,330,331,335,336,230],{},"If App Store Connect keeps rejecting your build with ITMS-90725, or the app breaks after the Xcode upgrade, the ",[87,332,334],{"href":333},"\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. Or ",[87,337,339],{"href":338},"\u002Fcontact\u002F","send me a short description",[341,342,343],"style",{},"html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}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":159,"searchDepth":345,"depth":345,"links":346},2,[347,348,349,350,351,352,353,354,355,356],{"id":33,"depth":345,"text":34},{"id":49,"depth":345,"text":50},{"id":134,"depth":345,"text":135},{"id":148,"depth":345,"text":149},{"id":204,"depth":345,"text":205},{"id":233,"depth":345,"text":234},{"id":291,"depth":345,"text":292},{"id":308,"depth":345,"text":309},{"id":315,"depth":345,"text":316},{"id":326,"depth":345,"text":327},"AI & Technology","2026-10-18T20:00:00.000Z","ITMS-90725 SDK version issue means App Store Connect saw an app built with an older SDK than it now accepts. What Apple's upcoming requirements page says about Xcode 26 today, and how to fix it in a Flutter app, from Apple's, Flutter's and GitHub's sources checked October 18, 2026.",null,"md",[363,366,369,372,375],{"question":364,"answer":365},"What does ITMS-90725 SDK version issue mean?","It means App Store Connect found that the app was built with an older SDK than Apple now requires. A forum post from January 2026 quotes the message as: \"This app was built with the iOS 18.2 SDK. Starting April 2026, all iOS and iPadOS apps must be built with the iOS 26 SDK or later, included in Xcode 26 or later.\" The fix is to rebuild with Xcode 26 or later.",{"question":367,"answer":368},"What Xcode version does Apple require right now?","Apple's upcoming requirements page says that since April 28, 2026, apps uploaded to App Store Connect must be built with Xcode 26 or later using an SDK for iOS 26, iPadOS 26, tvOS 26, visionOS 26 or watchOS 26. On October 18, 2026, that page had no entry for Xcode 27.",{"question":370,"answer":371},"Do I need Xcode 27 to upload?","Not according to Apple's upcoming requirements page as of October 18, 2026. It names Xcode 26 or later and gives no Xcode 27 date. Xcode 27 does change Flutter apps in one way: see the UIScene guide before you switch.",{"question":373,"answer":374},"Does this raise my minimum iOS version?","No. The SDK you build with is separate from the iOS version you support. Apple's page has a separate entry saying that since September 9, 2026, iOS and iPadOS apps uploaded to App Store Connect must target iOS 13 or later. Your plugins may require a higher target than that.",{"question":376,"answer":377},"Does the version already in the App Store stop working?","I found no Apple statement on that. A reply in a 2024 Apple forum thread, from a user who isn't identified as Apple staff, said the version already in the store is unaffected. Treat that as a forum opinion. The rule applies to new uploads.","Boynton Beach, FL",{"readingTimeStats":380},{"text":381,"minutes":382,"time":383,"words":384},"6 min read",5.26,315600,1052,true,"\u002Fblog\u002Fitms-90725-sdk-version-issue-xcode-26-flutter-2026","itms-90725","6 min",[390,391,392],"apple-privacy-manifest-itms-91053-itms-91061-flutter-fix-2026","flutter-uiscene-migration-xcode-27-app-wont-launch-2026","flutter-ios-build-failed-after-upgrade-2026",{"title":5,"description":359},[395,397,399,402,405,408,411,414,417,420,423,426],{"title":396,"url":89},"Apple Developer, Upcoming requirements (SDK minimum requirements since April 28, 2026)",{"title":398,"url":118},"Apple Developer, Releases (Xcode 27 on September 14, 2026; Xcode 26.6)",{"title":400,"url":401},"Apple Developer Forums, 90725: SDK version issue - iOS SDK 26 support (January 2026)","https:\u002F\u002Fdeveloper.apple.com\u002Fforums\u002Fthread\u002F813123",{"title":403,"url":404},"Apple Developer Forums, ITMS-90725: SDK version issue (April 2024)","https:\u002F\u002Fdeveloper.apple.com\u002Fforums\u002Fthread\u002F750346",{"title":406,"url":407},"Apple Developer, Technical Note TN2339 (xcode-select)","https:\u002F\u002Fdeveloper.apple.com\u002Flibrary\u002Farchive\u002Ftechnotes\u002Ftn2339\u002F_index.html",{"title":409,"url":410},"Flutter docs, Set up iOS development (page last updated 2026-09-14)","https:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fios\u002Fsetup",{"title":412,"url":413},"Flutter on GitHub, xcode_validator.dart (Xcode messages for flutter doctor)","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002Fmaster\u002Fpackages\u002Fflutter_tools\u002Flib\u002Fsrc\u002Fmacos\u002Fxcode_validator.dart",{"title":415,"url":416},"Flutter on GitHub, xcode.dart (required and recommended Xcode versions)","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fblob\u002Fmaster\u002Fpackages\u002Fflutter_tools\u002Flib\u002Fsrc\u002Fmacos\u002Fxcode.dart",{"title":418,"url":419},"gsainfoteam\u002Fpot-g-flutter on GitHub, issue 437 (a Flutter team hitting ITMS-90725, February 2026)","https:\u002F\u002Fgithub.com\u002Fgsainfoteam\u002Fpot-g-flutter\u002Fissues\u002F437",{"title":421,"url":422},"GitHub Actions runner images, macOS 26 (arm64) readme","https:\u002F\u002Fgithub.com\u002Factions\u002Frunner-images\u002Fblob\u002Fmain\u002Fimages\u002Fmacos\u002Fmacos-26-arm64-Readme.md",{"title":424,"url":425},"GitHub Actions runner images, macOS 27 \u002F Xcode 27 (arm64) readme","https:\u002F\u002Fgithub.com\u002Factions\u002Frunner-images\u002Fblob\u002Fmain\u002Fimages\u002Fmacos\u002Fxcode-27-arm64-Readme.md",{"title":427,"url":428},"GitHub Actions runner images, issue 14404 (Xcode 27 preview and the xcode-27 label)","https:\u002F\u002Fgithub.com\u002Factions\u002Frunner-images\u002Fissues\u002F14404","blog\u002Fitms-90725-sdk-version-issue-xcode-26-flutter-2026","itms-90725, sdk version issue, itms-90725 sdk version issue, app store connect xcode 26 required, built with ios 18 sdk, ios 26 sdk required, flutter xcode 26, xcode-select flutter, flutter doctor xcode, github actions xcode 26",[432,433,434,435,436],"ITMS-90725 means the build you uploaded was made with an older SDK than App Store Connect accepts. Apple's upcoming requirements page says that since April 28, 2026, uploads must be built with Xcode 26 or later using an SDK for iOS 26, iPadOS 26, tvOS 26, visionOS 26 or watchOS 26.","As of October 18, 2026, that page names no Xcode 27 or iOS 27 SDK requirement. Xcode 27 was released on September 14, 2026, but Xcode 26 or later is still the stated minimum.","In a Flutter app the fix is to build the upload with Xcode 26 or later. Check which Xcode the command line uses with xcode-select -p, because Flutter builds with the selected one.","flutter doctor will not warn you. In the Flutter source I read, the required Xcode version is 15 and the recommended one is 16, far below Apple's minimum.","On CI, the build machine decides the SDK. GitHub's macOS 26 runner image lists Xcode 26.0.1 to 26.6, with 26.6 as the default, and a separate xcode-27 image exists.","https:\u002F\u002Fapp369.com\u002Fblog\u002Fitms-90725-sdk-version-issue-xcode-26-flutter-2026\u002F","2T2tQecKPXLlML5ZxZX0RL4zY7Srj2aHaOHeF5MNM48",[440,1095,1709],{"id":441,"title":442,"author":443,"body":445,"category":357,"createdAt":1022,"description":1023,"disclosure":360,"extension":361,"faq":1024,"howTo":360,"lastVerified":360,"location":378,"meta":1040,"navigation":385,"ogImage":360,"path":1046,"primaryKeyword":1047,"readingTime":1048,"related":1049,"seo":1051,"sources":1052,"stem":1085,"tags":1086,"takeaways":1087,"updatedAt":1022,"url":1093,"__hash__":1094},"blog\u002Fblog\u002Fapple-privacy-manifest-itms-91053-itms-91061-flutter-fix-2026.md","ITMS-91053 and ITMS-91061: Fix Privacy Manifest Emails",{"name":7,"social":444},{"twitter":9},{"type":11,"value":446,"toc":1012},[447,453,456,460,464,503,517,521,588,591,600,604,607,679,682,686,746,749,753,756,773,776,779,921,924,927,931,979,983,994,997,1000,1002,1009],[14,448,449,452],{},[17,450,451],{},"If App Store Connect emailed you ITMS-91053 or ITMS-91061, a PrivacyInfo.xcprivacy file is missing or incomplete, either in your own code or in a third-party SDK."," ITMS-91053 is about required reason APIs used without a declared reason. ITMS-91061 is about a commonly used SDK, such as Flutter itself, that ships without a privacy manifest. In a Flutter app the fix is usually to upgrade Flutter and your plugins first, and to add your own manifest only for native code you wrote.",[14,454,455],{},"The facts below come from Apple's developer documentation, Apple's SDK requirements page, the Flutter team's comments on GitHub and the plugin manifests listed in the sources. I checked each one on October 18, 2026.",[14,457,458,29],{},[17,459,28],{},[31,461,463],{"id":462},"what-the-two-errors-mean","What the two errors mean",[52,465,466,479],{},[55,467,468],{},[58,469,470,473,476],{},[61,471,472],{},"Code",[61,474,475],{},"What the email says",[61,477,478],{},"What it means",[71,480,481,492],{},[58,482,483,486,489],{},[76,484,485],{},"ITMS-91053",[76,487,488],{},"\"Missing API declaration\": your app's code references APIs that require reasons, and names categories such as NSPrivacyAccessedAPICategoryFileTimestamp or NSPrivacyAccessedAPICategoryUserDefaults",[76,490,491],{},"Code in your app or an SDK uses a required reason API, and no privacy manifest gives an approved reason for it",[58,493,494,497,500],{},[76,495,496],{},"ITMS-91061",[76,498,499],{},"\"Missing privacy manifest\": your app includes an SDK that was identified as a commonly used third-party SDK, for example Frameworks\u002FFlutter.framework\u002FFlutter",[76,501,502],{},"That SDK has no privacy manifest file",[14,504,505,506,255,511,516],{},"The wording comes from emails quoted in Flutter issues ",[87,507,510],{"href":508,"rel":509},"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F145269",[91],"145269",[87,512,515],{"href":513,"rel":514},"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F163455",[91],"163455",". Your email may differ a little, so read the file name it gives. That name is your first clue.",[31,518,520],{"id":519},"the-dates","The dates",[52,522,523,534],{},[55,524,525],{},[58,526,527,529,532],{},[61,528,63],{},[61,530,531],{},"What Apple or the email said",[61,533,69],{},[71,535,536,556,571],{},[58,537,538,543,546],{},[76,539,540],{},[17,541,542],{},"May 1, 2024",[76,544,545],{},"Apps that don't describe their use of required reason APIs in their privacy manifest aren't accepted by App Store Connect. Apple's upcoming requirements page says you need approved reasons, including for third-party SDK code, to upload a new or updated app",[76,547,548,263,553],{},[87,549,552],{"href":550,"rel":551},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fbundleresources\u002Fdescribing-use-of-required-reason-api",[91],"Apple, required reason API",[87,554,92],{"href":89,"rel":555},[91],[58,557,558,561,564],{},[76,559,560],{},"November 12, 2024",[76,562,563],{},"An ITMS-91061 email posted in a Flutter issue says that from this date a new privacy-impacting SDK must include a manifest",[76,565,566],{},[87,567,570],{"href":568,"rel":569},"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F156141",[91],"Flutter issue 156141",[58,572,573,578,581],{},[76,574,575],{},[17,576,577],{},"February 12, 2025",[76,579,580],{},"Apple says apps submitted for review in App Store Connect must contain a valid privacy manifest for a certain number of commonly used third-party SDKs",[76,582,583],{},[87,584,587],{"href":585,"rel":586},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fbundleresources\u002Fadding-a-privacy-manifest-to-your-app-or-third-party-sdk",[91],"Apple, adding a privacy manifest",[14,589,590],{},"Apple's SDK page says you must include the manifest for any listed SDK when you submit a new app that includes it, or an update that adds it. It also says signatures are required where the listed SDKs are used as binary dependencies, and that any version of a listed SDK is covered. That page didn't state a date when I read it, so I rely on the other Apple page for February 12, 2025.",[14,592,593,594,599],{},"The list includes Flutter, FirebaseCore, FirebaseAuth, FirebaseMessaging, path_provider, shared_preferences_ios, url_launcher, image_picker_ios, sqflite and many more. Check ",[87,595,598],{"href":596,"rel":597},"https:\u002F\u002Fdeveloper.apple.com\u002Fsupport\u002Fthird-party-SDK-requirements\u002F",[91],"Apple's list"," for the plugins in your app.",[31,601,603],{"id":602},"the-five-required-reason-api-categories","The five required reason API categories",[14,605,606],{},"Apple describes these APIs as ones that could be misused to fingerprint a device or user. Each category goes in the NSPrivacyAccessedAPITypes array with one or more reason codes. These are the categories and the codes I read in Apple's documentation:",[52,608,609,622],{},[55,610,611],{},[58,612,613,616,619],{},[61,614,615],{},"Category key",[61,617,618],{},"What it covers",[61,620,621],{},"Reason codes from Apple",[71,623,624,635,646,657,668],{},[58,625,626,629,632],{},[76,627,628],{},"NSPrivacyAccessedAPICategoryFileTimestamp",[76,630,631],{},"File timestamps and metadata (fstat, lstat, getattrlist and similar)",[76,633,634],{},"DDA9.1 display to the user, C617.1 files inside the app container, 3B52.1 files the user granted access to, 0A2A.1 third-party SDK wrapper",[58,636,637,640,643],{},[76,638,639],{},"NSPrivacyAccessedAPICategorySystemBootTime",[76,641,642],{},"System boot time, such as mach_absolute_time",[76,644,645],{},"35F9.1 measure elapsed time within the app, 8FFB.1 absolute timestamps for events in the app, 3D61.1 optional bug report",[58,647,648,651,654],{},[76,649,650],{},"NSPrivacyAccessedAPICategoryDiskSpace",[76,652,653],{},"Available disk space (statfs, volume capacity keys and similar)",[76,655,656],{},"85F4.1 display to the user, E174.1 check space before writing files, 7D9E.1 optional bug report, B728.1 health research apps",[58,658,659,662,665],{},[76,660,661],{},"NSPrivacyAccessedAPICategoryActiveKeyboards",[76,663,664],{},"List of active keyboards",[76,666,667],{},"3EC4.1 custom keyboard apps, 54BD.1 customize the UI based on the active keyboard",[58,669,670,673,676],{},[76,671,672],{},"NSPrivacyAccessedAPICategoryUserDefaults",[76,674,675],{},"UserDefaults",[76,677,678],{},"CA92.1 data only the app itself can access, 1C8F.1 data shared in the same App Group, C56D.1 third-party SDK wrapper, AC6B.1 managed app configuration set by MDM",[14,680,681],{},"Each reason comes with limits. For example, Apple says information accessed for several of these reasons may not be sent off-device. Read the full text for your code before you pick one.",[31,683,685],{"id":684},"find-which-sdk-or-plugin-triggers-it","Find which SDK or plugin triggers it",[137,687,688,694,709,723,737],{},[140,689,690,693],{},[17,691,692],{},"Read the email."," It names the file. \"Runner\" means your app target, or a plugin built statically into it. A path like Frameworks\u002FFlutter.framework\u002FFlutter means that framework.",[140,695,696,699,700,704,705,708],{},[17,697,698],{},"Upgrade first."," The Flutter team's guidance in ",[87,701,703],{"href":508,"rel":702},[91],"issue 145269"," (comment dated April 22, 2024) starts with ",[161,706,707],{},"flutter pub upgrade",", because many plugins added their manifests after the rules came out.",[140,710,711,714,715,718,719,722],{},[17,712,713],{},"Look at what your build contains."," The same guidance says to run ",[161,716,717],{},"find build\u002Fios\u002Fiphoneos -name \"*.xcprivacy\""," and look at each ",[161,720,721],{},"PrivacyInfo.xcprivacy"," inside the plugin bundles. Compare their declarations with the categories in your email. If all of them together don't cover the email, at least one dependency has no manifest.",[140,724,725,728,729,732,733,736],{},[17,726,727],{},"Try packaging plugins as frameworks."," The same guidance says adding the ",[161,730,731],{},"use_frameworks!"," line from Flutter's Podfile template can change a warning from \"Runner\" to a named framework. Then you know which plugin to contact. Plugins that set ",[161,734,735],{},"static_framework = true"," override it.",[140,738,739,742,743,745],{},[17,740,741],{},"Search your own code."," In ",[161,744,280],{},", use Find in Workspace for the APIs listed in the flagged category, and check whether the matches are in code you wrote or in a plugin.",[14,747,748],{},"The Flutter team also noted a bug in App Store Connect, at least as of April 2024, that could produce a warning for static frameworks that do declare their reasons. If your plugins all have manifests and the warning still names Runner, that comment is worth reading.",[31,750,752],{"id":751},"add-or-edit-privacyinfoxcprivacy-in-xcode","Add or edit PrivacyInfo.xcprivacy in Xcode",[14,754,755],{},"Do this only for code in your own app, or if an SDK can't be updated. Apple's steps:",[137,757,758,764,767,770],{},[140,759,760,761,763],{},"Open ",[161,762,280],{}," in Xcode.",[140,765,766],{},"Choose File > New File.",[140,768,769],{},"Scroll to the Resource section and select the App Privacy File type, then click Next.",[140,771,772],{},"Check the Runner target in the Targets list and click Create.",[14,774,775],{},"The file is named PrivacyInfo.xcprivacy by default, and that is the required name. Apple says the file must be in the target's resources for Xcode to use it, and that for an iOS app Xcode places it at the root of the app bundle.",[14,777,778],{},"A minimal manifest for an app whose own code reads and writes UserDefaults for itself looks like this. It matches the structure in Flutter's own plugin manifests:",[154,780,784],{"className":781,"code":782,"language":783,"meta":159,"style":159},"language-xml shiki shiki-themes github-light github-dark","\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n\u003Cplist version=\"1.0\">\n\u003Cdict>\n    \u003Ckey>NSPrivacyTracking\u003C\u002Fkey>\n    \u003Cfalse\u002F>\n    \u003Ckey>NSPrivacyTrackingDomains\u003C\u002Fkey>\n    \u003Carray\u002F>\n    \u003Ckey>NSPrivacyCollectedDataTypes\u003C\u002Fkey>\n    \u003Carray\u002F>\n    \u003Ckey>NSPrivacyAccessedAPITypes\u003C\u002Fkey>\n    \u003Carray>\n        \u003Cdict>\n            \u003Ckey>NSPrivacyAccessedAPIType\u003C\u002Fkey>\n            \u003Cstring>NSPrivacyAccessedAPICategoryUserDefaults\u003C\u002Fstring>\n            \u003Ckey>NSPrivacyAccessedAPITypeReasons\u003C\u002Fkey>\n            \u003Carray>\n                \u003Cstring>CA92.1\u003C\u002Fstring>\n            \u003C\u002Farray>\n        \u003C\u002Fdict>\n    \u003C\u002Farray>\n\u003C\u002Fdict>\n\u003C\u002Fplist>\n","xml",[161,785,786,791,796,802,808,814,820,826,832,838,843,849,855,861,867,873,879,885,891,897,903,909,915],{"__ignoreMap":159},[164,787,788],{"class":166,"line":167},[164,789,790],{},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",[164,792,793],{"class":166,"line":345},[164,794,795],{},"\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n",[164,797,799],{"class":166,"line":798},3,[164,800,801],{},"\u003Cplist version=\"1.0\">\n",[164,803,805],{"class":166,"line":804},4,[164,806,807],{},"\u003Cdict>\n",[164,809,811],{"class":166,"line":810},5,[164,812,813],{},"    \u003Ckey>NSPrivacyTracking\u003C\u002Fkey>\n",[164,815,817],{"class":166,"line":816},6,[164,818,819],{},"    \u003Cfalse\u002F>\n",[164,821,823],{"class":166,"line":822},7,[164,824,825],{},"    \u003Ckey>NSPrivacyTrackingDomains\u003C\u002Fkey>\n",[164,827,829],{"class":166,"line":828},8,[164,830,831],{},"    \u003Carray\u002F>\n",[164,833,835],{"class":166,"line":834},9,[164,836,837],{},"    \u003Ckey>NSPrivacyCollectedDataTypes\u003C\u002Fkey>\n",[164,839,841],{"class":166,"line":840},10,[164,842,831],{},[164,844,846],{"class":166,"line":845},11,[164,847,848],{},"    \u003Ckey>NSPrivacyAccessedAPITypes\u003C\u002Fkey>\n",[164,850,852],{"class":166,"line":851},12,[164,853,854],{},"    \u003Carray>\n",[164,856,858],{"class":166,"line":857},13,[164,859,860],{},"        \u003Cdict>\n",[164,862,864],{"class":166,"line":863},14,[164,865,866],{},"            \u003Ckey>NSPrivacyAccessedAPIType\u003C\u002Fkey>\n",[164,868,870],{"class":166,"line":869},15,[164,871,872],{},"            \u003Cstring>NSPrivacyAccessedAPICategoryUserDefaults\u003C\u002Fstring>\n",[164,874,876],{"class":166,"line":875},16,[164,877,878],{},"            \u003Ckey>NSPrivacyAccessedAPITypeReasons\u003C\u002Fkey>\n",[164,880,882],{"class":166,"line":881},17,[164,883,884],{},"            \u003Carray>\n",[164,886,888],{"class":166,"line":887},18,[164,889,890],{},"                \u003Cstring>CA92.1\u003C\u002Fstring>\n",[164,892,894],{"class":166,"line":893},19,[164,895,896],{},"            \u003C\u002Farray>\n",[164,898,900],{"class":166,"line":899},20,[164,901,902],{},"        \u003C\u002Fdict>\n",[164,904,906],{"class":166,"line":905},21,[164,907,908],{},"    \u003C\u002Farray>\n",[164,910,912],{"class":166,"line":911},22,[164,913,914],{},"\u003C\u002Fdict>\n",[164,916,918],{"class":166,"line":917},23,[164,919,920],{},"\u003C\u002Fplist>\n",[14,922,923],{},"Use this as a shape, not as an answer. The Flutter team warns that a manifest is an attestation to Apple that you use data and APIs only in the ways it describes, and that copying arbitrary text could misrepresent your app. Set NSPrivacyTracking to true and list domains only if your app tracks as Apple defines it. Fill NSPrivacyCollectedDataTypes to match what you collect.",[14,925,926],{},"Apple also says App Store Connect rejects submissions with invalid manifests, so use only the keys and values Apple documents.",[31,928,930],{"id":929},"update-flutter-plugins-and-pods","Update Flutter, plugins and pods",[932,933,934,945,954,973],"ul",{},[140,935,936,939,940,255,942,230],{},[17,937,938],{},"Flutter itself."," Flutter's engine source has a PrivacyInfo.xcprivacy for the iOS framework. A maintainer replied to someone on Flutter 2.5.3 that the version is more than three years old and predates framework privacy manifests, so it can't be published as a new app under Apple's rules. If your ITMS-91061 names Flutter, upgrade Flutter. My advice: if the upgrade breaks the iOS build, see ",[87,941,229],{"href":228},[87,943,944],{"href":126},"the UIScene migration guide",[140,946,947,950,951,953],{},[17,948,949],{},"Plugins."," Run ",[161,952,707],{},", then check the plugins on Apple's list against their changelogs. The shared_preferences iOS plugin, for example, declares UserDefaults with reason 1C8F.1 in its own manifest.",[140,955,956,959,960,963,964,967,968,255,970,972],{},[17,957,958],{},"Pods."," After a plugin update, run ",[161,961,962],{},"pod install"," from ",[161,965,966],{},"ios\u002F"," and rebuild. My advice: delete ",[161,969,254],{},[161,971,258],{}," first if CocoaPods keeps the old versions.",[140,974,975,978],{},[17,976,977],{},"A plugin with no update."," Ask its maintainer to add a manifest, replace the plugin, or as a last resort, declare its usage in your own manifest. Apple's documentation says an SDK can't rely on an app's manifest to report its own use, so this is a stopgap.",[31,980,982],{"id":981},"check-the-archive-and-re-upload","Check the archive and re-upload",[137,984,985,988,991],{},[140,986,987],{},"In Xcode, choose Product > Archive.",[140,989,990],{},"In the Organizer, Control-click the archive and choose Generate Privacy Report.",[140,992,993],{},"Choose where to save it and open the report in Preview.",[14,995,996],{},"Apple says the report aggregates the privacy manifests from your app and the third-party SDKs it links to, and that Xcode won't generate it correctly if you define your own collected data types or purposes instead of Apple's listed values. Then upload again and wait for the processing email.",[14,998,999],{},"If Apple's email points at an invalid manifest inside an SDK, Apple's documentation says to choose Window > Organizer, click Archives, Control-click your archive and choose Show in Finder, then Control-click it in the Finder and choose Show Package Contents. My advice: contact the SDK's developer first rather than editing a signed framework.",[31,1001,327],{"id":326},[14,1003,1004,1005,335,1007,230],{},"If App Store Connect keeps rejecting your upload with ITMS-91053 or ITMS-91061, the ",[87,1006,334],{"href":333},[87,1008,339],{"href":338},[341,1010,1011],{},"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":159,"searchDepth":345,"depth":345,"links":1013},[1014,1015,1016,1017,1018,1019,1020,1021],{"id":462,"depth":345,"text":463},{"id":519,"depth":345,"text":520},{"id":602,"depth":345,"text":603},{"id":684,"depth":345,"text":685},{"id":751,"depth":345,"text":752},{"id":929,"depth":345,"text":930},{"id":981,"depth":345,"text":982},{"id":326,"depth":345,"text":327},"2026-10-18T19:30:00.000Z","App Store Connect emails ITMS-91053 (missing API declaration) and ITMS-91061 (missing privacy manifest) mean your app or an SDK in it lacks a PrivacyInfo.xcprivacy. The dates, the five required reason API categories, how to find the culprit and how to fix a Flutter or native iOS app, from Apple's and Flutter's sources checked October 18, 2026.",[1025,1028,1031,1034,1037],{"question":1026,"answer":1027},"What does ITMS-91053 Missing API declaration mean?","It means your app's code, or code in an SDK, references an API that Apple calls a required reason API, such as file timestamps or user defaults, and the privacy manifest doesn't give an approved reason for it. Apple says that starting May 1, 2024, apps that don't describe that use aren't accepted by App Store Connect.",{"question":1029,"answer":1030},"What does ITMS-91061 Missing privacy manifest mean?","It means your app includes a third-party SDK from Apple's list of commonly used SDKs, and that SDK has no privacy manifest. For Flutter apps, the email I found in Flutter's issue tracker names Frameworks\u002FFlutter.framework\u002FFlutter. Upgrading to a Flutter version that ships a manifest is the usual fix.",{"question":1032,"answer":1033},"Do I need my own PrivacyInfo.xcprivacy in a Flutter app?","Only if your own native code in ios\u002FRunner uses required reason APIs, or an SDK without its own manifest forces you to. The Flutter team's guidance is that if every SDK in your dependency tree has its own manifest, your app's manifest should only need to describe usage directly in your app's code.",{"question":1035,"answer":1036},"Which reason code do I use for UserDefaults?","Apple lists CA92.1 for reading and writing information that is only accessible to the app itself, and 1C8F.1 for apps, extensions and App Clips in the same App Group. Pick the one that matches what your code does. Don't copy a code just because another project used it.",{"question":1038,"answer":1039},"How do I check what my archive declares?","In Xcode, choose Product > Archive, then Control-click the archive in the Organizer and choose Generate Privacy Report. Apple says it aggregates the privacy manifests from your app and the third-party SDKs it links to. For the file-level check, Flutter's guidance is to search the built app for .xcprivacy files.",{"readingTimeStats":1041},{"text":1042,"minutes":1043,"time":1044,"words":1045},"8 min read",7.36,441600,1472,"\u002Fblog\u002Fapple-privacy-manifest-itms-91053-itms-91061-flutter-fix-2026","itms-91053","7 min",[391,392,1050],"google-play-16kb-page-size-flutter-android-2026",{"title":442,"description":1023},[1053,1055,1058,1061,1063,1066,1068,1070,1072,1075,1077,1079,1082],{"title":1054,"url":550},"Apple Developer, Describing use of required reason API",{"title":1056,"url":1057},"Apple Developer, NSPrivacyAccessedAPIType (categories and reason codes)","https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fbundleresources\u002Fapp-privacy-configuration\u002Fnsprivacyaccessedapitypes\u002Fnsprivacyaccessedapitype",{"title":1059,"url":1060},"Apple Developer, Privacy manifest files","https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fbundleresources\u002Fprivacy-manifest-files",{"title":1062,"url":585},"Apple Developer, Adding a privacy manifest to your app or third-party SDK",{"title":1064,"url":1065},"Apple Developer, Describing data use in privacy manifests (privacy report)","https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fbundleresources\u002Fdescribing-data-use-in-privacy-manifests",{"title":1067,"url":596},"Apple Developer, Third-party SDK requirements",{"title":1069,"url":89},"Apple Developer, Upcoming requirements (Approved reasons for APIs, since May 1, 2024)",{"title":1071,"url":508},"Flutter on GitHub, issue 145269 (ITMS-91053 email text and the Flutter team's guidance)",{"title":1073,"url":1074},"Flutter on GitHub, issue 131940 (privacy manifests in packages, and the warning about copying manifests)","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F131940",{"title":1076,"url":568},"Flutter on GitHub, issue 156141 (ITMS-91061 email text, November 12, 2024)",{"title":1078,"url":513},"Flutter on GitHub, issue 163455 (ITMS-91061 email text, February 12, 2025)",{"title":1080,"url":1081},"Flutter on GitHub, engine PrivacyInfo.xcprivacy for the iOS framework","https:\u002F\u002Fraw.githubusercontent.com\u002Fflutter\u002Fflutter\u002Fmaster\u002Fengine\u002Fsrc\u002Fflutter\u002Fshell\u002Fplatform\u002Fdarwin\u002Fios\u002Fframework\u002FPrivacyInfo.xcprivacy",{"title":1083,"url":1084},"flutter\u002Fpackages on GitHub, shared_preferences_foundation PrivacyInfo.xcprivacy","https:\u002F\u002Fraw.githubusercontent.com\u002Fflutter\u002Fpackages\u002Fmain\u002Fpackages\u002Fshared_preferences\u002Fshared_preferences_foundation\u002Fdarwin\u002Fshared_preferences_foundation\u002FSources\u002Fshared_preferences_foundation\u002FResources\u002FPrivacyInfo.xcprivacy","blog\u002Fapple-privacy-manifest-itms-91053-itms-91061-flutter-fix-2026","itms-91053, itms-91061, itms-91053 missing api declaration, itms-91061 missing privacy manifest, privacyinfo.xcprivacy flutter, privacy manifest flutter, required reason api, nsprivacyaccessedapitypes, ca92.1 user defaults, app store connect privacy manifest email",[1088,1089,1090,1091,1092],"ITMS-91053 means code in your app or an SDK uses a required reason API without a reason in its privacy manifest. Apple says that since May 1, 2024, apps that don't describe that use aren't accepted by App Store Connect.","ITMS-91061 means a commonly used third-party SDK in your app, such as Flutter, shipped without a privacy manifest. Apple says that starting February 12, 2025, apps submitted for review must contain a valid manifest for a certain number of those SDKs.","Apple's required reason APIs fall into five categories: file timestamp, system boot time, disk space, active keyboards and user defaults. Each needs one or more approved reason codes.","Most Flutter fixes start with upgrading Flutter and running flutter pub upgrade, because many plugins added their manifests after the rules were announced. You only add your own PrivacyInfo.xcprivacy for code you wrote.","Never paste a privacy manifest from the internet. The Flutter team says a manifest is an attestation to Apple that you use data and APIs only in the ways it describes.","https:\u002F\u002Fapp369.com\u002Fblog\u002Fapple-privacy-manifest-itms-91053-itms-91061-flutter-fix-2026\u002F","k5SC1R0BWFgag3CQKKDpo2CjfNhlGmmpR7NilLiCJLc",{"id":1096,"title":1097,"author":1098,"body":1100,"category":357,"createdAt":1655,"description":1656,"disclosure":360,"extension":361,"faq":1657,"howTo":360,"lastVerified":360,"location":378,"meta":1673,"navigation":385,"ogImage":360,"path":1679,"primaryKeyword":1680,"readingTime":1681,"related":1682,"seo":1685,"sources":1686,"stem":1699,"tags":1700,"takeaways":1701,"updatedAt":1655,"url":1707,"__hash__":1708},"blog\u002Fblog\u002Fflutter-uiscene-migration-xcode-27-app-wont-launch-2026.md","Flutter UIScene Migration: Fix Launch Crashes on Xcode 27",{"name":7,"social":1099},{"twitter":9},{"type":11,"value":1101,"toc":1643},[1102,1120,1123,1128,1132,1237,1240,1243,1247,1265,1268,1272,1279,1284,1302,1368,1392,1396,1413,1427,1431,1442,1548,1566,1570,1586,1590,1593,1627,1629,1641],[14,1103,1104,1107,1108,1111,1112,1114,1115,255,1117,230],{},[17,1105,1106],{},"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 ",[161,1109,1110],{},"AppDelegate"," automatically. Apps with a custom ",[161,1113,1110],{},", or on an older Flutter, need a few manual changes to ",[161,1116,1110],{},[161,1118,1119],{},"Info.plist",[14,1121,1122],{},"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,1124,1125,1127],{},[17,1126,28],{}," 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.",[31,1129,1131],{"id":1130},"what-changed-and-when","What changed, and when",[52,1133,1134,1145],{},[55,1135,1136],{},[58,1137,1138,1140,1143],{},[61,1139,63],{},[61,1141,1142],{},"What happened",[61,1144,69],{},[71,1146,1147,1167,1187,1203,1217],{},[58,1148,1149,1152,1155],{},[76,1150,1151],{},"June 2025 (WWDC25)",[76,1153,1154],{},"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",[76,1156,1157,263,1162],{},[87,1158,1161],{"href":1159,"rel":1160},"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fuiscenedelegate",[91],"Flutter docs",[87,1163,1166],{"href":1164,"rel":1165},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Ftechnotes\u002Ftn3187-migrating-to-the-uikit-scene-based-life-cycle",[91],"Apple TN3187",[58,1168,1169,1172,1175],{},[76,1170,1171],{},"November 12, 2025",[76,1173,1174],{},"Flutter 3.38 adds UIScene support, with an experimental automatic migration",[76,1176,1177,263,1182],{},[87,1178,1181],{"href":1179,"rel":1180},"https:\u002F\u002Fflutter.dev\u002Fblog\u002Fwhats-new-in-flutter-3-38",[91],"Flutter 3.38 post",[87,1183,1186],{"href":1184,"rel":1185},"https:\u002F\u002Fstorage.googleapis.com\u002Fflutter_infra_release\u002Freleases\u002Freleases_macos.json",[91],"release archive",[58,1188,1189,1192,1195],{},[76,1190,1191],{},"February 11, 2026",[76,1193,1194],{},"Flutter 3.41: UIScene support is the default, and eligible apps are migrated automatically",[76,1196,1197,263,1200],{},[87,1198,1161],{"href":1159,"rel":1199},[91],[87,1201,1186],{"href":1184,"rel":1202},[91],[58,1204,1205,1208,1211],{},[76,1206,1207],{},"April 28, 2026",[76,1209,1210],{},"App Store Connect uploads must be built with Xcode 26 or later",[76,1212,1213],{},[87,1214,1216],{"href":89,"rel":1215},[91],"Apple upcoming requirements",[58,1218,1219,1223,1228],{},[76,1220,1221],{},[17,1222,110],{},[76,1224,1225],{},[17,1226,1227],{},"Xcode 27 released. Flutter apps built with it that haven't adopted UIScene fail to launch",[76,1229,1230,263,1234],{},[87,1231,1233],{"href":118,"rel":1232},[91],"Apple releases",[87,1235,1161],{"href":1159,"rel":1236},[91],[14,1238,1239],{},"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,1241,1242],{},"Apple's technote says the requirement is to adopt the scene life cycle. Supporting multiple scenes is encouraged but not required.",[31,1244,1246],{"id":1245},"step-1-let-flutter-migrate-it","Step 1: let Flutter migrate it",[14,1248,1249,1250,1252,1253,1256,1257,1260,1261,1264],{},"If the app is on Flutter 3.41 or later and its ",[161,1251,1110],{}," hasn't been customized, Flutter's docs say the CLI migrates it when you run ",[161,1254,1255],{},"flutter run"," or ",[161,1258,1259],{},"flutter build ios",". On success it prints ",[161,1262,1263],{},"Finished migration to UIScene lifecycle",". If it can't, it warns you and gives manual steps.",[14,1266,1267],{},"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.",[31,1269,1271],{"id":1270},"step-2-migrate-a-custom-appdelegate-by-hand","Step 2: migrate a custom AppDelegate by hand",[14,1273,1274,1275,230],{},"These steps follow Flutter's ",[87,1276,1278],{"href":1159,"rel":1277},[91],"UIScene page",[1280,1281,1283],"h3",{"id":1282},"register-plugins-in-the-new-callback","Register plugins in the new callback",[14,1285,1286,1287,1290,1291,1293,1294,1297,1298,1301],{},"Plugins used to be registered in ",[161,1288,1289],{},"application:didFinishLaunchingWithOptions:",". Now the ",[161,1292,1110],{}," conforms to ",[161,1295,1296],{},"FlutterImplicitEngineDelegate"," and registers them in ",[161,1299,1300],{},"didInitializeImplicitFlutterEngine",":",[154,1303,1307],{"className":1304,"code":1305,"language":1306,"meta":159,"style":159},"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",[161,1308,1309,1314,1319,1324,1329,1334,1339,1344,1349,1354,1359,1363],{"__ignoreMap":159},[164,1310,1311],{"class":166,"line":167},[164,1312,1313],{},"@objc class AppDelegate: FlutterAppDelegate, FlutterImplicitEngineDelegate {\n",[164,1315,1316],{"class":166,"line":345},[164,1317,1318],{},"  override func application(\n",[164,1320,1321],{"class":166,"line":798},[164,1322,1323],{},"    _ application: UIApplication,\n",[164,1325,1326],{"class":166,"line":804},[164,1327,1328],{},"    didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?\n",[164,1330,1331],{"class":166,"line":810},[164,1332,1333],{},"  ) -> Bool {\n",[164,1335,1336],{"class":166,"line":816},[164,1337,1338],{},"    return super.application(application, didFinishLaunchingWithOptions: launchOptions)\n",[164,1340,1341],{"class":166,"line":822},[164,1342,1343],{},"  }\n",[164,1345,1346],{"class":166,"line":828},[164,1347,1348],{"emptyLinePlaceholder":385},"\n",[164,1350,1351],{"class":166,"line":834},[164,1352,1353],{},"  func didInitializeImplicitFlutterEngine(_ engineBridge: FlutterImplicitEngineBridge) {\n",[164,1355,1356],{"class":166,"line":840},[164,1357,1358],{},"    GeneratedPluginRegistrant.register(with: engineBridge.pluginRegistry)\n",[164,1360,1361],{"class":166,"line":845},[164,1362,1343],{},[164,1364,1365],{"class":166,"line":851},[164,1366,1367],{},"}\n",[14,1369,1370,1371,1374,1375,1377,1378,1381,1382,1385,1386,1388,1389,1391],{},"If you created method channels or platform views in ",[161,1372,1373],{},"didFinishLaunchingWithOptions",", move them into ",[161,1376,1300],{}," too, using ",[161,1379,1380],{},"engineBridge.applicationRegistrar.messenger()"," as the messenger. Flutter's docs warn that accessing the ",[161,1383,1384],{},"FlutterViewController"," in ",[161,1387,1373],{}," might crash your app, and say to use the ",[161,1390,1296],{}," protocol instead.",[1280,1393,1395],{"id":1394},"move-ui-lifecycle-code-to-a-scene-delegate","Move UI lifecycle code to a scene delegate",[14,1397,1398,1399,1401,1402,1405,1406,1409,1410,230],{},"After the migration, UIKit no longer calls the ",[161,1400,1110],{}," methods tied to UI state, such as ",[161,1403,1404],{},"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 ",[161,1407,1408],{},"FlutterSceneDelegate"," or conform to ",[161,1411,1412],{},"FlutterSceneLifeCycleProvider",[14,1414,1415,1416,1418,1419,1422,1423,1426],{},"Flutter's page adds, in its plugin section, that after the migration the launch options passed to ",[161,1417,1373],{}," are ",[161,1420,1421],{},"nil",", and that logic relying on them moves to ",[161,1424,1425],{},"scene:willConnectToSession:options:",". My advice: look first at code that handles a notification or a URL the app was opened with.",[1280,1428,1430],{"id":1429},"add-the-scene-manifest-to-infoplist","Add the scene manifest to Info.plist",[14,1432,1433,1434,1437,1438,1441],{},"Add this inside the top-level ",[161,1435,1436],{},"\u003Cdict>"," of ",[161,1439,1440],{},"ios\u002FRunner\u002FInfo.plist",", as shown on Flutter's page:",[154,1443,1445],{"className":781,"code":1444,"language":783,"meta":159,"style":159},"\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",[161,1446,1447,1452,1456,1461,1466,1471,1476,1481,1485,1490,1495,1500,1505,1510,1515,1520,1525,1530,1535,1539,1544],{"__ignoreMap":159},[164,1448,1449],{"class":166,"line":167},[164,1450,1451],{},"\u003Ckey>UIApplicationSceneManifest\u003C\u002Fkey>\n",[164,1453,1454],{"class":166,"line":345},[164,1455,807],{},[164,1457,1458],{"class":166,"line":798},[164,1459,1460],{},"  \u003Ckey>UIApplicationSupportsMultipleScenes\u003C\u002Fkey>\n",[164,1462,1463],{"class":166,"line":804},[164,1464,1465],{},"  \u003Cfalse\u002F>\n",[164,1467,1468],{"class":166,"line":810},[164,1469,1470],{},"  \u003Ckey>UISceneConfigurations\u003C\u002Fkey>\n",[164,1472,1473],{"class":166,"line":816},[164,1474,1475],{},"  \u003Cdict>\n",[164,1477,1478],{"class":166,"line":822},[164,1479,1480],{},"    \u003Ckey>UIWindowSceneSessionRoleApplication\u003C\u002Fkey>\n",[164,1482,1483],{"class":166,"line":828},[164,1484,854],{},[164,1486,1487],{"class":166,"line":834},[164,1488,1489],{},"      \u003Cdict>\n",[164,1491,1492],{"class":166,"line":840},[164,1493,1494],{},"        \u003Ckey>UISceneClassName\u003C\u002Fkey>\n",[164,1496,1497],{"class":166,"line":845},[164,1498,1499],{},"        \u003Cstring>UIWindowScene\u003C\u002Fstring>\n",[164,1501,1502],{"class":166,"line":851},[164,1503,1504],{},"        \u003Ckey>UISceneDelegateClassName\u003C\u002Fkey>\n",[164,1506,1507],{"class":166,"line":857},[164,1508,1509],{},"        \u003Cstring>FlutterSceneDelegate\u003C\u002Fstring>\n",[164,1511,1512],{"class":166,"line":863},[164,1513,1514],{},"        \u003Ckey>UISceneConfigurationName\u003C\u002Fkey>\n",[164,1516,1517],{"class":166,"line":869},[164,1518,1519],{},"        \u003Cstring>flutter\u003C\u002Fstring>\n",[164,1521,1522],{"class":166,"line":875},[164,1523,1524],{},"        \u003Ckey>UISceneStoryboardFile\u003C\u002Fkey>\n",[164,1526,1527],{"class":166,"line":881},[164,1528,1529],{},"        \u003Cstring>Main\u003C\u002Fstring>\n",[164,1531,1532],{"class":166,"line":887},[164,1533,1534],{},"      \u003C\u002Fdict>\n",[164,1536,1537],{"class":166,"line":893},[164,1538,908],{},[164,1540,1541],{"class":166,"line":899},[164,1542,1543],{},"  \u003C\u002Fdict>\n",[164,1545,1546],{"class":166,"line":905},[164,1547,914],{},[14,1549,1550,1551,1554,1555,1557,1558,1561,1562,1565],{},"If you made your own scene delegate subclass, Flutter's page says to put its name in ",[161,1552,1553],{},"UISceneDelegateClassName"," instead of ",[161,1556,1408],{},": ",[161,1559,1560],{},"$(PRODUCT_MODULE_NAME).SceneDelegate"," for Swift projects, ",[161,1563,1564],{},"SceneDelegate"," for Objective-C.",[31,1567,1569],{"id":1568},"plugins-and-add-to-app","Plugins and add-to-app",[932,1571,1572,1578],{},[140,1573,1574,1577],{},[17,1575,1576],{},"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.",[140,1579,1580,1583,1584,230],{},[17,1581,1582],{},"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 ",[161,1585,1408],{},[31,1587,1589],{"id":1588},"what-to-test","What to test",[14,1591,1592],{},"This section is my advice, not Flutter's or Apple's.",[137,1594,1595,1601,1610,1621],{},[140,1596,1597,1600],{},[17,1598,1599],{},"Build with Xcode 27 and launch on a device."," If it launches, open each screen once.",[140,1602,1603,1606,1607,1609],{},[17,1604,1605],{},"Cold start from a push notification and from a deep link."," Launch options are ",[161,1608,1421],{}," after the migration, so these are the paths most likely to break.",[140,1611,1612,1615,1616,1256,1618,230],{},[17,1613,1614],{},"Background and foreground the app."," Check anything that used to run in ",[161,1617,1404],{},[161,1619,1620],{},"applicationWillResignActive",[140,1622,1623,1626],{},[17,1624,1625],{},"Ship through TestFlight first."," Check the same paths on a build installed the way users get it.",[31,1628,327],{"id":326},[14,1630,1631,1632,1634,1635,1638,1639,230],{},"If a Flutter iOS app won't launch after building with Xcode 27, or broke after the UIScene migration, the ",[87,1633,334],{"href":333}," 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 ",[87,1636,1637],{"href":228},"Flutter iOS build failed after an upgrade",", or ",[87,1640,339],{"href":338},[341,1642,1011],{},{"title":159,"searchDepth":345,"depth":345,"links":1644},[1645,1646,1647,1652,1653,1654],{"id":1130,"depth":345,"text":1131},{"id":1245,"depth":345,"text":1246},{"id":1270,"depth":345,"text":1271,"children":1648},[1649,1650,1651],{"id":1282,"depth":798,"text":1283},{"id":1394,"depth":798,"text":1395},{"id":1429,"depth":798,"text":1430},{"id":1568,"depth":345,"text":1569},{"id":1588,"depth":345,"text":1589},{"id":326,"depth":345,"text":327},"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.",[1658,1661,1664,1667,1670],{"question":1659,"answer":1660},"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":1662,"answer":1663},"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":1665,"answer":1666},"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":1668,"answer":1669},"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":1671,"answer":1672},"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.",{"readingTimeStats":1674},{"text":1675,"minutes":1676,"time":1677,"words":1678},"5 min read",4.405,264300,881,"\u002Fblog\u002Fflutter-uiscene-migration-xcode-27-app-wont-launch-2026","flutter uiscene migration","8 min",[392,1683,1684],"google-play-target-api-36-android-16-requirement-2026","flutter-deleted-android-v1-embedding-build-failed-2026",{"title":1097,"description":1656},[1687,1689,1691,1693,1695,1697],{"title":1688,"url":1159},"Flutter docs, UIScene adoption (last updated September 14, 2026)",{"title":1690,"url":1164},"Apple Developer, TN3187: Migrating to the UIKit scene-based life cycle",{"title":1692,"url":89},"Apple Developer, Upcoming requirements",{"title":1694,"url":118},"Apple Developer, Releases",{"title":1696,"url":1179},"Flutter blog, What's new in Flutter 3.38",{"title":1698,"url":1184},"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",[1702,1703,1704,1705,1706],"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",{"id":1710,"title":1711,"author":1712,"body":1714,"category":357,"createdAt":2206,"description":2207,"disclosure":360,"extension":361,"faq":360,"howTo":360,"lastVerified":360,"location":378,"meta":2208,"navigation":385,"ogImage":360,"path":2213,"primaryKeyword":360,"readingTime":1048,"related":360,"seo":2214,"sources":360,"stem":2215,"tags":2216,"takeaways":360,"updatedAt":2206,"url":2217,"__hash__":2218},"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":1713},{"twitter":9},{"type":11,"value":1715,"toc":2189},[1716,1722,1733,1737,1740,1773,1776,1832,1836,1864,1868,1877,1902,1906,1912,1954,2026,2042,2046,2058,2091,2095,2104,2107,2111,2114,2118,2124,2128,2132,2146,2150,2162,2166,2169,2173,2179,2183,2186],[14,1717,1718,1721],{},[17,1719,1720],{},"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,1723,1724,1725,1728,1729,230],{},"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 ",[87,1726,1727],{"href":333},"fixed-price Flutter & Firebase Fix Ticket",". For the wider method, see ",[87,1730,1732],{"href":1731},"\u002Fblog\u002Fhow-to-debug-a-flutter-firebase-bug-2026\u002F","how to debug a Flutter and Firebase bug",[31,1734,1736],{"id":1735},"step-1-read-the-real-error","Step 1: Read the real error",[14,1738,1739],{},"Don't start by deleting folders. First get the full output.",[137,1741,1742,1749,1763],{},[140,1743,1744,1745,1748],{},"Run ",[161,1746,1747],{},"flutter doctor -v"," and fix anything it flags under Xcode or CocoaPods.",[140,1750,1744,1751,1754,1755,1758,1759,1762],{},[161,1752,1753],{},"flutter build ios -v"," (or ",[161,1756,1757],{},"flutter run -v",") and read from the first line that says ",[161,1760,1761],{},"error:",", not the last line. The final \"Xcode build failed\" message is a summary.",[140,1764,1765,1766,1768,1769,1772],{},"If the failure happens in Xcode itself, open ",[161,1767,280],{}," (never ",[161,1770,1771],{},"Runner.xcodeproj",") and use the Report navigator to open the build log. Filter for errors and read the first one.",[14,1774,1775],{},"Where the error appears tells you which step failed:",[52,1777,1778,1788],{},[55,1779,1780],{},[58,1781,1782,1785],{},[61,1783,1784],{},"Where it fails",[61,1786,1787],{},"Likely area",[71,1789,1790,1800,1808,1816,1824],{},[58,1791,1792,1797],{},[76,1793,1794,1796],{},[161,1795,962],{}," output, before compiling",[76,1798,1799],{},"CocoaPods resolution, Podfile, specs",[58,1801,1802,1805],{},[76,1803,1804],{},"\"Compiling for iOS X, but module requires iOS Y\"",[76,1806,1807],{},"Deployment target too low",[58,1809,1810,1813],{},[76,1811,1812],{},"Swift or Objective-C compile errors inside a plugin",[76,1814,1815],{},"Plugin and Xcode or SDK version mismatch",[58,1817,1818,1821],{},[76,1819,1820],{},"Linking or \"framework not found\"",[76,1822,1823],{},"Stale Pods or build cache",[58,1825,1826,1829],{},[76,1827,1828],{},"Code signing messages",[76,1830,1831],{},"Signing and provisioning, covered at the end",[31,1833,1835],{"id":1834},"step-2-check-your-xcode-and-cocoapods-versions","Step 2: Check your Xcode and CocoaPods versions",[14,1837,1838,1839,1844,1845,255,1848,1850,1851,1855,1856,1859,1860,1863],{},"Upgrades often fail because the Firebase SDK moved its minimum requirements. The ",[87,1840,1843],{"href":1841,"rel":1842},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fios\u002Finstallation-methods",[91],"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 ",[161,1846,1847],{},"pod --version",[161,1849,200],{},", and update if either is below what your plugins need. Flutter's own ",[87,1852,1854],{"href":410,"rel":1853},[91],"iOS setup page"," covers pointing the command-line tools at the right Xcode (",[161,1857,1858],{},"xcode-select",") and accepting licenses (",[161,1861,1862],{},"sudo xcodebuild -license","); a second Xcode installed on the machine is a common reason a build uses the wrong toolchain.",[31,1865,1867],{"id":1866},"step-3-fix-the-ios-deployment-target","Step 3: Fix the iOS deployment target",[14,1869,1870,1871,1876],{},"A plugin upgrade can raise the minimum iOS version. The ",[87,1872,1875],{"href":1873,"rel":1874},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fflutter\u002Fsetup",[91],"Firebase Flutter setup page"," lists iOS 15 or later as the Apple requirement for the FlutterFire plugins. Check three places and make them agree:",[932,1878,1879,1889,1892],{},[140,1880,1881,1884,1885,1888],{},[161,1882,1883],{},"ios\u002FPodfile",": the line ",[161,1886,1887],{},"platform :ios, '15.0'"," (use the minimum your plugins ask for; if the line is commented out, uncomment it).",[140,1890,1891],{},"Xcode: Runner target, General tab, \"Minimum Deployments\".",[140,1893,284,1894,1897,1898,1901],{},[161,1895,1896],{},"post_install"," block in the Podfile, if you have one that sets ",[161,1899,1900],{},"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.",[31,1903,1905],{"id":1904},"step-4-refresh-cocoapods-then-clean-it-out","Step 4: Refresh CocoaPods, then clean it out",[14,1907,1908,1909,1911],{},"Work from least to most destructive. Run these inside the ",[161,1910,240],{}," folder.",[137,1913,1914,1921,1948],{},[140,1915,1916,1920],{},[17,1917,1918],{},[161,1919,248],{}," 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.",[140,1922,1923,1928,1929,1931,1932,1937,1938,1940,1941,1943,1944,1947],{},[17,1924,1925],{},[161,1926,1927],{},"pod update PODNAME"," if one pod needs to move to a newer version than ",[161,1930,258],{}," allows. As the ",[87,1933,1936],{"href":1934,"rel":1935},"https:\u002F\u002Fguides.cocoapods.org\u002Fusing\u002Fpod-install-vs-update.html",[91],"CocoaPods guide"," explains, ",[161,1939,962],{}," respects the versions in ",[161,1942,258],{},", while ",[161,1945,1946],{},"pod update"," ignores the lock and fetches the newest version your constraints allow.",[140,1949,1950,1953],{},[17,1951,1952],{},"A clean reinstall."," If it is still broken, remove the generated pieces and rebuild them:",[154,1955,1957],{"className":156,"code":1956,"language":158,"meta":159,"style":159},"cd ios\nrm -rf Pods Podfile.lock\ncd ..\nflutter clean\nflutter pub get\ncd ios && pod install --repo-update\n",[161,1958,1959,1967,1981,1988,1996,2006],{"__ignoreMap":159},[164,1960,1961,1964],{"class":166,"line":167},[164,1962,1963],{"class":178},"cd",[164,1965,1966],{"class":174}," ios\n",[164,1968,1969,1972,1975,1978],{"class":166,"line":345},[164,1970,1971],{"class":170},"rm",[164,1973,1974],{"class":178}," -rf",[164,1976,1977],{"class":174}," Pods",[164,1979,1980],{"class":174}," Podfile.lock\n",[164,1982,1983,1985],{"class":166,"line":798},[164,1984,1963],{"class":178},[164,1986,1987],{"class":174}," ..\n",[164,1989,1990,1993],{"class":166,"line":804},[164,1991,1992],{"class":170},"flutter",[164,1994,1995],{"class":174}," clean\n",[164,1997,1998,2000,2003],{"class":166,"line":810},[164,1999,1992],{"class":170},[164,2001,2002],{"class":174}," pub",[164,2004,2005],{"class":174}," get\n",[164,2007,2008,2010,2013,2017,2020,2023],{"class":166,"line":816},[164,2009,1963],{"class":178},[164,2011,2012],{"class":174}," ios",[164,2014,2016],{"class":2015},"sVt8B"," && ",[164,2018,2019],{"class":170},"pod",[164,2021,2022],{"class":174}," install",[164,2024,2025],{"class":178}," --repo-update\n",[14,2027,2028,2029,2031,2032,2034,2035,2037,2038,2041],{},"Deleting ",[161,2030,254],{}," is safe because it is generated. Deleting ",[161,2033,258],{}," 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 ",[161,2036,258],{},", 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 ",[161,2039,2040],{},"~\u002FLibrary\u002FDeveloper\u002FXcode\u002FDerivedData","; it only holds build products, and Xcode recreates it.",[31,2043,2045],{"id":2044},"step-5-upgrade-the-flutterfire-plugins-together","Step 5: Upgrade the FlutterFire plugins together",[14,2047,2048,263,2051,263,2054,2057],{},[161,2049,2050],{},"firebase_core",[161,2052,2053],{},"cloud_firestore",[161,2055,2056],{},"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.",[932,2059,2060,2070,2085],{},[140,2061,1744,2062,2065,2066,2069],{},[161,2063,2064],{},"flutter pub outdated"," to see the gap, then upgrade the whole FlutterFire family in one ",[161,2067,2068],{},"pubspec.yaml"," change.",[140,2071,2072,2073,2076,2077,2081,2082,230],{},"Re-run ",[161,2074,2075],{},"flutterfire configure"," if you added a Firebase service or platform; the ",[87,2078,2080],{"href":1873,"rel":2079},[91],"Firebase docs"," say re-running it keeps your configuration current. Install the tool with ",[161,2083,2084],{},"dart pub global activate flutterfire_cli",[140,2086,2087,2088,2090],{},"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 ",[161,2089,2050],{}," is a classic conflict.",[31,2092,2094],{"id":2093},"step-6-know-that-cocoapods-is-being-phased-out","Step 6: Know that CocoaPods is being phased out",[14,2096,2097,2098,2103],{},"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 ",[87,2099,2102],{"href":2100,"rel":2101},"https:\u002F\u002Fdocs.flutter.dev\u002Fpackages-and-plugins\u002Fswift-package-manager\u002Ffor-app-developers",[91],"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,2105,2106],{},"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.",[31,2108,2110],{"id":2109},"step-7-signing-errors-briefly","Step 7: Signing errors, briefly",[14,2112,2113],{},"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.",[31,2115,2117],{"id":2116},"when-to-get-help","When to get help",[14,2119,2120,2121,2123],{},"If an iOS build has eaten more than a day and the steps above haven't moved it, App369's ",[87,2122,1727],{"href":333}," 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.",[31,2125,2127],{"id":2126},"frequently-asked-questions","Frequently Asked Questions",[1280,2129,2131],{"id":2130},"why-did-my-flutter-ios-build-fail-after-upgrading-flutter","Why did my Flutter iOS build fail after upgrading Flutter?",[14,2133,2134,2135,2137,2138,2140,2141,2143,2144,230],{},"Most often the Podfile or Xcode project still has an old iOS deployment target, ",[161,2136,258],{}," pins old pod versions, or plugin versions no longer match each other. Run ",[161,2139,1753],{},", find the first ",[161,2142,1761],{}," line, then work through the deployment target and ",[161,2145,248],{},[1280,2147,2149],{"id":2148},"is-it-safe-to-delete-podfilelock-and-the-pods-folder","Is it safe to delete Podfile.lock and the Pods folder?",[14,2151,2152,2153,2155,2156,2158,2159,2161],{},"Yes, for a repair. ",[161,2154,254],{}," is generated and ",[161,2157,258],{}," is rebuilt by ",[161,2160,962],{},". The catch is that pods may resolve to newer versions, so check the new lock file and commit it once the build works.",[1280,2163,2165],{"id":2164},"what-does-pod-install-repo-update-do","What does \"pod install --repo-update\" do?",[14,2167,2168],{},"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.",[1280,2170,2172],{"id":2171},"should-i-upgrade-only-one-flutterfire-plugin","Should I upgrade only one FlutterFire plugin?",[14,2174,2175,2176,2178],{},"Avoid it. FlutterFire plugins depend on matching Firebase SDK releases, so upgrade ",[161,2177,2050],{}," and the other FlutterFire packages together and rebuild.",[1280,2180,2182],{"id":2181},"do-i-need-to-switch-from-cocoapods-to-swift-package-manager","Do I need to switch from CocoaPods to Swift Package Manager?",[14,2184,2185],{},"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.",[341,2187,2188],{},"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":159,"searchDepth":345,"depth":345,"links":2190},[2191,2192,2193,2194,2195,2196,2197,2198,2199],{"id":1735,"depth":345,"text":1736},{"id":1834,"depth":345,"text":1835},{"id":1866,"depth":345,"text":1867},{"id":1904,"depth":345,"text":1905},{"id":2044,"depth":345,"text":2045},{"id":2093,"depth":345,"text":2094},{"id":2109,"depth":345,"text":2110},{"id":2116,"depth":345,"text":2117},{"id":2126,"depth":345,"text":2127,"children":2200},[2201,2202,2203,2204,2205],{"id":2130,"depth":798,"text":2131},{"id":2148,"depth":798,"text":2149},{"id":2164,"depth":798,"text":2165},{"id":2171,"depth":798,"text":2172},{"id":2181,"depth":798,"text":2182},"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":2209},{"text":381,"minutes":2210,"time":2211,"words":2212},5.995,359700,1199,"\u002Fblog\u002Fflutter-ios-build-failed-after-upgrade-2026",{"title":1711,"description":2207},"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",[2220,2222,2223],{"keyword":5,"url":437,"title":5,"relevance":2221},75,{"keyword":1097,"url":1707,"title":1097,"relevance":834},{"keyword":1711,"url":2217,"title":1711,"relevance":828},1792361352573]