[{"data":1,"prerenderedAt":3096},["ShallowReactive",2],{"\u002Fblog\u002Fapp-store-age-rating-questions-update-2026\u002F":3,"\u002Fblog\u002Fapp-store-age-rating-questions-update-2026\u002F-related":618,"\u002Fblog\u002Fapp-store-age-rating-questions-update-2026\u002F-resources":3084},{"id":4,"title":5,"author":6,"body":10,"category":543,"createdAt":544,"description":545,"disclosure":546,"extension":547,"faq":548,"howTo":546,"lastVerified":546,"location":564,"meta":565,"navigation":571,"ogImage":546,"path":572,"primaryKeyword":573,"readingTime":574,"related":575,"seo":580,"sources":581,"stem":608,"tags":609,"takeaways":610,"updatedAt":544,"url":616,"__hash__":617},"blog\u002Fblog\u002Fapp-store-age-rating-questions-update-2026.md","Apple Age Rating Questions Update: What to Answer",{"name":7,"social":8},"Simon Dziak",{"twitter":9},"@SzymonDziak",{"type":11,"value":12,"toc":530},"minimark",[13,21,24,30,35,148,151,155,158,198,201,204,208,211,216,230,235,267,272,286,291,315,318,322,325,346,349,352,355,359,362,385,388,391,395,398,445,448,451,455,458,461,464,468,506,514,518],[14,15,16,20],"p",{},[17,18,19],"strong",{},"Apple's updated age rating system adds 13+, 16+ and 18+ to the existing 4+ and 9+ ratings, and Apple asked developers to answer the new questions for every app by January 31, 2026."," Apple's own pages warn of \"an interruption when submitting your app updates\", and Apple's reminder email, as a developer posted it on the Apple Developer Forums, said you wouldn't be able to submit app updates in App Store Connect. If you haven't answered yet, do it before your next build goes up.",[14,22,23],{},"The facts below come from Apple Developer News, App Store Connect Help and the App Review Guidelines, as shown in the sources. I checked each one on October 18, 2026. Apple can change a rule, so open the linked page before you plan around it.",[14,25,26,29],{},[17,27,28],{},"Disclosure:"," App369 is my studio. I build and fix Flutter and Firebase apps, and the last section mentions what I sell. Apple doesn't pay me for anything on this page.",[31,32,34],"h2",{"id":33},"the-dated-timeline","The dated timeline",[36,37,38,54],"table",{},[39,40,41],"thead",{},[42,43,44,48,51],"tr",{},[45,46,47],"th",{},"Date",[45,49,50],{},"What happened",[45,52,53],{},"Source",[55,56,57,75,90,105,119,133],"tbody",{},[42,58,59,63,66],{},[60,61,62],"td",{},"July 24, 2025",[60,64,65],{},"Apple announced the updated ratings and the new required questions, with a January 31, 2026 response date",[60,67,68],{},[69,70,74],"a",{"href":71,"rel":72},"https:\u002F\u002Fdeveloper.apple.com\u002Fnews\u002F?id=ks775ehf",[73],"nofollow","Apple News",[42,76,77,80,83],{},[60,78,79],{},"January 1, 2026",[60,81,82],{},"Texas SB2420 takes effect. Apple's reminder says an age rating change for apps distributed in Texas would be a significant change",[60,84,85],{},[69,86,89],{"href":87,"rel":88},"https:\u002F\u002Fdeveloper.apple.com\u002Fforums\u002Fthread\u002F810295",[73],"Forums, reminder email",[42,91,92,97,100],{},[60,93,94],{},[17,95,96],{},"January 31, 2026",[60,98,99],{},"Response date for the updated questions. Without answers you can't submit app updates",[60,101,102],{},[69,103,89],{"href":87,"rel":104},[73],[42,106,107,110,113],{},[60,108,109],{},"June 8, 2026",[60,111,112],{},"Apple announced Time Allowances and said the questionnaire would add social media questions",[60,114,115],{},[69,116,74],{"href":117,"rel":118},"https:\u002F\u002Fdeveloper.apple.com\u002Fnews\u002F?id=0d2gpmml",[73],[42,120,121,124,127],{},[60,122,123],{},"July 9, 2026",[60,125,126],{},"Social media capability questions added to the questionnaire",[60,128,129],{},[69,130,74],{"href":131,"rel":132},"https:\u002F\u002Fdeveloper.apple.com\u002Fnews\u002F?id=tlur8uvi",[73],[42,134,135,140,143],{},[60,136,137],{},[17,138,139],{},"September 2026",[60,141,142],{},"Responses to the social media question required to submit new apps or updates",[60,144,145],{},[69,146,74],{"href":131,"rel":147},[73],[14,149,150],{},"Apple's Upcoming Requirements page also says ratings for all apps and games on the App Store were automatically updated to the new system. They show on devices running iOS 26, iPadOS 26, macOS Tahoe 26, tvOS 26, visionOS 26 and watchOS 26 or later.",[31,152,154],{"id":153},"the-new-tiers","The new tiers",[14,156,157],{},"The default tiers on Apple's definitions page are 4+, 9+, 13+, 16+ and 18+, plus Unrated. A few examples of what sits at each level, taken from that page:",[159,160,161,168,174,180,186,192],"ul",{},[162,163,164,167],"li",{},[17,165,166],{},"4+:"," for example parental controls, age assurance, user-generated content, messaging and chat, advertising and infrequent contests.",[162,169,170,173],{},[17,171,172],{},"9+:"," for example infrequent horror themes, health and wellness topics, infrequent cartoon or fantasy violence and loot boxes.",[162,175,176,179],{},[17,177,178],{},"13+:"," for example social media, frequent profanity, infrequent medical or treatment information and infrequent realistic violence.",[162,181,182,185],{},[17,183,184],{},"16+:"," unrestricted web access, frequent medical or treatment information and frequent mature or suggestive themes.",[162,187,188,191],{},[17,189,190],{},"18+:"," for example gambling, frequent realistic violence and frequent sexual content or nudity.",[162,193,194,197],{},[17,195,196],{},"Unrated:"," graphic sexual content or prolonged graphic or sadistic realistic violence. Apple's help page says an Unrated app can't be published on the App Store.",[14,199,200],{},"Ratings are assigned per country or region. Apple has since made region-specific changes. From June 18, 2026 the 15+ rating is no longer available in Australia, and Vietnam apps get a region-specific rating of 00+, 12+, 16+ or 18+. Apple's definitions page also says that in Australia, apps with social media capabilities or loot boxes display 16+. I'm not covering Brazil or Korea in detail, so read Apple's posts if you sell there. For Korea, Apple's August 12, 2026 post says two descriptors move from All to 12+ starting October 2026.",[14,202,203],{},"My advice: don't guess a tier from the old system. Answer the questions and let Apple's calculation show you the result.",[31,205,207],{"id":206},"what-the-new-questions-cover","What the new questions cover",[14,209,210],{},"Apple's July 2025 post says the new required questions cover in-app controls, capabilities, medical or wellness topics and violent themes. Apple's definitions page lists these categories, with the definitions I quote or paraphrase below.",[14,212,213],{},[17,214,215],{},"In-app controls",[159,217,218,224],{},[162,219,220,223],{},[17,221,222],{},"Parental controls:"," settings or tools that let parents monitor, manage or restrict a child's access, such as content filtering, usage limits or purchase restrictions.",[162,225,226,229],{},[17,227,228],{},"Age assurance:"," a mechanism to confirm someone's age meets the requirement for content or services. Apple's examples include the Declared Age Range API, age estimation and age verification by government-issued ID.",[14,231,232],{},[17,233,234],{},"Capabilities",[159,236,237,243,249,255,261],{},[162,238,239,242],{},[17,240,241],{},"Unrestricted web access:"," users can navigate to any webpage in the app or freely browse. Apple says this may include embedded browser functionality.",[162,244,245,248],{},[17,246,247],{},"User-generated content:"," broad distribution of content users create, such as videos, photos, text or audio.",[162,250,251,254],{},[17,252,253],{},"Messaging and chat:"," users can directly communicate through features in the app, including text, voice or video chat, direct or group messaging, or public posting.",[162,256,257,260],{},[17,258,259],{},"Advertising:"," paid promotion of products or services in the app, including banner, video, playable, rich media and native ads.",[162,262,263,266],{},[17,264,265],{},"Social media:"," added July 9, 2026. Apple defines it as the ability to redistribute, amplify or interact with user-generated content through a social feed or similar discovery method.",[14,268,269],{},[17,270,271],{},"Medical or wellness",[159,273,274,280],{},[162,275,276,279],{},[17,277,278],{},"Medical or treatment information:"," diagnoses or guidance on managing medical conditions, such as medication guidance or emergency care.",[162,281,282,285],{},[17,283,284],{},"Health or wellness topics:"," self-care or lifestyle recommendations, such as calorie tracking, dieting advice or exercise recommendations.",[14,287,288],{},[17,289,290],{},"Violence",[159,292,293,299,305],{},[162,294,295,298],{},[17,296,297],{},"Cartoon or fantasy violence"," is exaggerated or fantastical and easily distinguished from real life.",[162,300,301,304],{},[17,302,303],{},"Realistic violence"," is aggressive physical conflict or harm involving humans in lifelike situations.",[162,306,307,310,311,314],{},[17,308,309],{},"Guns or other weapons"," and ",[17,312,313],{},"prolonged graphic or sadistic realistic violence"," are listed as separate items.",[14,316,317],{},"The same page also covers mature themes, sexuality or nudity, and chance-based activities such as gambling, simulated gambling, contests and loot boxes. For these, you choose a frequency, either Infrequent or Frequent. I didn't find a definition of those two words on Apple's page, so pick the answer that honestly matches how often the content appears in the shipped app.",[31,319,321],{"id":320},"what-happens-if-you-didnt-answer","What happens if you didn't answer",[14,323,324],{},"The sources word this in three ways, and I'll keep them separate.",[326,327,328,334,340],"ol",{},[162,329,330,333],{},[17,331,332],{},"Apple's Upcoming Requirements page:"," provide responses by January 31, 2026 \"to avoid an interruption when submitting your app updates in App Store Connect.\" It doesn't describe the interruption.",[162,335,336,339],{},[17,337,338],{},"Apple's reminder email,"," as a developer reproduced it on the Apple Developer Forums in December 2025: \"If you don't answer these questions by January 31, 2026, you won't be able to submit app updates in App Store Connect.\"",[162,341,342,345],{},[17,343,344],{},"Apple's July 9, 2026 post:"," from September 2026, responses to the social media questions are required when submitting new apps or updates, or when submitting apps for notarization for alternative distribution.",[14,347,348],{},"So the stated consequence is a blocked submission of updates. The pages I read don't say a live app is removed, and I found no Apple statement on what happens to an app that stays unanswered and never submits again. I would not assume either way.",[14,350,351],{},"I also can't give you a verified account of how App Store Connect behaves today, because I didn't test it on a live account. Open each app's App Information page to see its status.",[14,353,354],{},"My advice: don't discover this on release day. A blocked update during a bug fix is the worst time.",[31,356,358],{"id":357},"how-to-answer-step-by-step","How to answer, step by step",[14,360,361],{},"Apple's help page gives the path:",[326,363,364,367,370,373,376,379,382],{},[162,365,366],{},"In App Store Connect, open the app.",[162,368,369],{},"Under General, click App Information.",[162,371,372],{},"Below Age Ratings, click Set Up Age Ratings.",[162,374,375],{},"Review the list of in-app controls and capabilities, select the ones your app includes, then click Next.",[162,377,378],{},"Work through each section, answering the questions and choosing a frequency for each content description.",[162,380,381],{},"Under Age Categories and Override, choose Not Applicable unless you need Made for Kids or a higher rating.",[162,383,384],{},"Click Save. You return to App Information, where you can see global and region-specific ratings.",[14,386,387],{},"To change it later, click Edit at the top of App Information. The required role is Account Holder, Admin, App Manager or Marketing.",[14,389,390],{},"Two limits are worth knowing. Apple's help page says you can't change the Made for Kids selection once App Review approves the app. And an override can only raise a rating, since the page describes it as increasing the rating above the one Apple assigned.",[31,392,394],{"id":393},"how-to-answer-honestly-for-a-flutter-app","How to answer honestly for a Flutter app",[14,396,397],{},"Guideline 2.3.6 says to \"answer the age rating questions in App Store Connect honestly so that your app aligns properly with parental controls.\" It adds that a mis-rated app could surprise customers or trigger an inquiry from government regulators. In practice, I'd check these before I answer:",[159,399,400,411,417,423,429,435],{},[162,401,402,405,406,410],{},[17,403,404],{},"Web views."," A ",[407,408,409],"code",{},"webview_flutter"," screen that loads only your own pages is different from a browser that can open any URL. Apple's definition of unrestricted web access is users navigating to any page or freely browsing.",[162,412,413,416],{},[17,414,415],{},"Ads."," If you use an ad SDK, the app has advertising. Check the SDK, not just your own screens.",[162,418,419,422],{},[17,420,421],{},"Chat and comments."," A support chat with your team is not the same as users messaging each other. Apple's definition is users communicating with one another.",[162,424,425,428],{},[17,426,427],{},"Uploads."," If users post photos or text that other users can see, that is user-generated content.",[162,430,431,434],{},[17,432,433],{},"Health content."," A water tracker and a medication guide are different answers. Calorie tracking and exercise recommendations are wellness examples on Apple's page. Medication guidance is a medical example.",[162,436,437,440,441,444],{},[17,438,439],{},"Third-party packages."," A Flutter plugin can add a capability you never wrote. Skim your ",[407,442,443],{},"pubspec.yaml"," before you answer.",[14,446,447],{},"If you have a minimum age in your EULA, Apple's help page says you must override to a rating that meets it.",[14,449,450],{},"My advice: print the list above, check your app against it once, and save your answers in your release notes so the next developer doesn't have to guess.",[31,452,454],{"id":453},"social-media-and-the-texas-note","Social media and the Texas note",[14,456,457],{},"Apple says an app with social media capabilities gets a Social Media content descriptor and, per the June 8 post, a minimum age rating of 13+. If those capabilities are disabled for anyone under 13, the app isn't in the Social Media Time Allowance category for those users. That option requires the Declared Age Range API at a minimum to check users' age ranges, and your overall answers may then produce a rating lower than 13+.",[14,459,460],{},"Most small business apps have no feed, so this question will usually be a plain no. If you have a community feed with likes, comments and shares, read Apple's definition carefully.",[14,462,463],{},"The reminder email also said Texas SB2420 took effect January 1, 2026, and that changing an age rating for apps distributed in Texas would be a significant change that may trigger a consent process. If you serve Texas, treat a rating change as more than a form edit. I'm not a lawyer, and I haven't tested the consent flow.",[31,465,467],{"id":466},"a-short-checklist","A short checklist",[326,469,470,476,482,488,494,500],{},[162,471,472,475],{},[17,473,474],{},"List every app"," under your account, including the old ones you rarely touch.",[162,477,478,481],{},[17,479,480],{},"Open App Information"," for each and check whether the age rating setup is complete.",[162,483,484,487],{},[17,485,486],{},"Answer from the shipped build,"," including SDKs, web views and ads.",[162,489,490,493],{},[17,491,492],{},"Check the calculated rating"," for each region you sell in.",[162,495,496,499],{},[17,497,498],{},"Override upward"," if your EULA requires a higher minimum age.",[162,501,502,505],{},[17,503,504],{},"Re-answer after big features."," Adding chat, a feed or a browser changes your answers.",[14,507,508,509,513],{},"For every other dated Apple, Google Play and Firebase requirement in 2026 and 2027, see ",[69,510,512],{"href":511},"\u002Fblog\u002Fapp-store-google-play-deadlines-2026-2027\u002F","App Store and Google Play deadlines for 2026 and 2027",".",[31,515,517],{"id":516},"need-a-hand","Need a hand?",[14,519,520,521,525,526,513],{},"If an update is stuck on age rating questions, or an iOS build won't go through App Store Connect, the ",[69,522,524],{"href":523},"\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 ",[69,527,529],{"href":528},"\u002Fcontact\u002F","send me a short description",{"title":531,"searchDepth":532,"depth":532,"links":533},"",2,[534,535,536,537,538,539,540,541,542],{"id":33,"depth":532,"text":34},{"id":153,"depth":532,"text":154},{"id":206,"depth":532,"text":207},{"id":320,"depth":532,"text":321},{"id":357,"depth":532,"text":358},{"id":393,"depth":532,"text":394},{"id":453,"depth":532,"text":454},{"id":466,"depth":532,"text":467},{"id":516,"depth":532,"text":517},"AI & Technology","2026-10-19T03:10:00.000Z","Apple's updated App Store age ratings add 13+, 16+ and 18+ and new questions on in-app controls, capabilities, medical or wellness topics and violent themes. The dated timeline, what happens if you didn't answer, and how to answer, checked October 18, 2026.",null,"md",[549,552,555,558,561],{"question":550,"answer":551},"What are the new App Store age ratings?","The updated system adds 13+, 16+ and 18+ to the existing 4+ and 9+ ratings. Apple's values and definitions page also lists an Unrated value, which can't be published on the App Store. Ratings are assigned per country or region and can vary with local standards.",{"question":553,"answer":554},"What happens if I did not answer the updated age rating questions by January 31, 2026?","Apple's reminder email, as a developer posted it on the Apple Developer Forums, said that if you don't answer the questions by January 31, 2026, you won't be able to submit app updates in App Store Connect. Apple's Upcoming Requirements page words it as an interruption when submitting your app updates. The pages I read do not say live apps are removed.",{"question":556,"answer":557},"Where do I answer the age rating questions?","In App Store Connect, open the app, go to General, then App Information, and click Set Up Age Ratings under Age Ratings. To change answers later, click Edit at the top of App Information. The roles that can do this are Account Holder, Admin, App Manager and Marketing.",{"question":559,"answer":560},"Which new questions did Apple add?","Apple's July 2025 post lists four areas, in-app controls, capabilities, medical or wellness topics and violent themes. Apple's definitions page groups them as in-app controls (parental controls, age assurance), capabilities (unrestricted web access, user-generated content, social media, messaging and chat, advertising) and medical or wellness. Social media was added on July 9, 2026.",{"question":562,"answer":563},"Can I set a higher age rating than Apple calculates?","Yes. Under Age Categories and Override, choose Override to Higher Age Rating. Apple's help page says the App Store will display your specified rating while the content descriptions still reflect your answers. If your EULA has a minimum age above the calculated rating, you must override to a rating that meets it.","Boynton Beach, FL",{"readingTimeStats":566},{"text":567,"minutes":568,"time":569,"words":570},"10 min read",9.01,540600,1802,true,"\u002Fblog\u002Fapp-store-age-rating-questions-update-2026","app store age rating questions","8 min",[576,577,578,579],"app-store-google-play-deadlines-2026-2027","apple-privacy-manifest-itms-91053-itms-91061-flutter-fix-2026","itms-90683-missing-purpose-string-info-plist-flutter-2026","flutter-ios-build-failed-after-upgrade-2026",{"title":5,"description":545},[582,584,587,589,592,595,597,599,602,605],{"title":583,"url":71},"Apple Developer News, Updated age ratings in App Store Connect (July 24, 2025)",{"title":585,"url":586},"Apple Developer, Upcoming Requirements, Age Rating Updates","https:\u002F\u002Fdeveloper.apple.com\u002Fnews\u002Fupcoming-requirements\u002F?id=07242025a",{"title":588,"url":87},"Apple Developer Forums, Final reminder: Answer the updated age ratings questions (reminder email text)",{"title":590,"url":591},"App Store Connect Help, Set an app age rating","https:\u002F\u002Fdeveloper.apple.com\u002Fhelp\u002Fapp-store-connect\u002Fmanage-app-information\u002Fset-an-app-age-rating\u002F",{"title":593,"url":594},"App Store Connect Help, Age ratings values and definitions","https:\u002F\u002Fdeveloper.apple.com\u002Fhelp\u002Fapp-store-connect\u002Freference\u002Fapp-information\u002Fage-ratings-values-and-definitions",{"title":596,"url":131},"Apple Developer News, Age rating questionnaire now includes social media questions (July 9, 2026)",{"title":598,"url":117},"Apple Developer News, Introducing Time Allowances (June 8, 2026)",{"title":600,"url":601},"Apple Developer News, Upcoming changes to age ratings in Australia and Vietnam (May 21, 2026)","https:\u002F\u002Fdeveloper.apple.com\u002Fnews\u002F?id=yrrb45pw",{"title":603,"url":604},"Apple Developer News, Updates to age ratings for the Republic of Korea (August 12, 2026)","https:\u002F\u002Fdeveloper.apple.com\u002Fnews\u002F?id=oj3r9pvw",{"title":606,"url":607},"Apple Developer, App Review Guidelines","https:\u002F\u002Fdeveloper.apple.com\u002Fapp-store\u002Freview\u002Fguidelines\u002F","blog\u002Fapp-store-age-rating-questions-update-2026","app store age rating questions, app store connect age ratings, apple age rating 13+ 16+ 18+, age rating questionnaire, app store connect cannot submit update age rating, flutter app store age rating, declared age range api, social media age rating questions, apple age assurance, app store age rating 2026",[611,612,613,614,615],"Apple's updated age rating system adds 13+, 16+ and 18+ to the existing 4+ and 9+ ratings. Apple announced it on July 24, 2025.","Apple asked developers to answer the new questions for each app by January 31, 2026. Apple's pages warn of an interruption when submitting updates. A reminder email, as posted on the Apple Developer Forums, said you won't be able to submit app updates without answers.","The new questions cover in-app controls, capabilities, medical or wellness topics, and violent themes. Apple added social media capability questions on July 9, 2026, and said responses would be required from September 2026.","Answer from what the shipped app actually does, including SDKs, web views and ads. App Review Guideline 2.3.6 says to answer honestly, and a mis-rated app can trigger an inquiry from government regulators.","You can set a higher rating than Apple calculates with Override to Higher Age Rating, and you must if your EULA has a higher minimum age. You can't set a lower one.","https:\u002F\u002Fapp369.com\u002Fblog\u002Fapp-store-age-rating-questions-update-2026\u002F","O_j_pqgfCnTRwJo_4ks7HJzx50ZdBRCIEQTIcXHFeHM",[619,1422,2093,2565],{"id":620,"title":621,"author":622,"body":624,"category":543,"createdAt":1348,"description":1349,"disclosure":546,"extension":547,"faq":1350,"howTo":546,"lastVerified":546,"location":564,"meta":1366,"navigation":571,"ogImage":546,"path":1372,"primaryKeyword":1373,"readingTime":1374,"related":1375,"seo":1379,"sources":1380,"stem":1411,"tags":1412,"takeaways":1413,"updatedAt":1419,"url":1420,"__hash__":1421},"blog\u002Fblog\u002Fapp-store-google-play-deadlines-2026-2027.md","App Store and Google Play Deadlines for 2026 and 2027",{"name":7,"social":623},{"twitter":9},{"type":11,"value":625,"toc":1340},[626,632,635,640,644,1246,1258,1261,1271,1274,1278,1295,1298,1302,1318,1321,1325,1331,1333],[14,627,628,631],{},[17,629,630],{},"The App Store and Google Play requirements that affect mobile app owners in 2026 and 2027 fit in one table: Xcode 26 uploads since April 28, 2026, target API 36 and Play Billing Library 8 since August 31, 2026, 16 KB page size support from February 1, 2027, and five Firebase shutdowns between March 22 and September 30, 2027."," The table below is sorted by date, and every row links to the page where the platform states it.",[14,633,634],{},"I checked each one on October 18, 2026. Rows whose date has passed are marked \"In effect\".",[14,636,637,639],{},[17,638,28],{}," App369 is my studio. I build and fix Android and iOS apps, mostly in Flutter, and the last section mentions what I sell. Apple and Google don't pay me for anything on this page.",[31,641,643],{"id":642},"all-dates-in-order","All dates, in order",[36,645,646,663],{},[39,647,648],{},[42,649,650,652,655,658,660],{},[45,651,47],{},[45,653,654],{},"What changes",[45,656,657],{},"Status",[45,659,53],{},[45,661,662],{},"My guide",[55,664,665,691,714,740,764,784,807,837,862,889,914,940,962,988,1012,1033,1057,1081,1106,1133,1154,1178,1201,1222],{},[42,666,667,669,675,678,685],{},[60,668,96],{},[60,670,671,674],{},[17,672,673],{},"Apple."," Apple asked developers to answer the updated age rating questions in App Store Connect by this date, to avoid an interruption when submitting app updates. Affects: every app on the App Store.",[60,676,677],{},"In effect",[60,679,680],{},[69,681,684],{"href":682,"rel":683},"https:\u002F\u002Fdeveloper.apple.com\u002Fnews\u002Fupcoming-requirements\u002F",[73],"Apple",[60,686,687],{},[69,688,690],{"href":689},"\u002Fblog\u002Fapp-store-age-rating-questions-update-2026\u002F","Age rating questions",[42,692,693,696,701,703,708],{},[60,694,695],{},"April 28, 2026",[60,697,698,700],{},[17,699,673],{}," Uploads 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. Affects: anyone uploading a build, including Flutter apps.",[60,702,677],{},[60,704,705],{},[69,706,684],{"href":682,"rel":707},[73],[60,709,710],{},[69,711,713],{"href":712},"\u002Fblog\u002Fitms-90725-sdk-version-issue-xcode-26-flutter-2026\u002F","ITMS-90725 and Xcode 26",[42,715,716,719,725,727,734],{},[60,717,718],{},"August 31, 2026",[60,720,721,724],{},[17,722,723],{},"Google Play."," New apps and app updates must target Android 16 (API level 36) or higher. Wear OS and Android Automotive OS apps need API 35, and Android XR apps need API 34. Affects: anyone publishing a new app or an update.",[60,726,677],{},[60,728,729],{},[69,730,733],{"href":731,"rel":732},"https:\u002F\u002Fsupport.google.com\u002Fgoogleplay\u002Fandroid-developer\u002Fanswer\u002F11926878",[73],"Play Console Help",[60,735,736],{},[69,737,739],{"href":738},"\u002Fblog\u002Fgoogle-play-target-api-36-android-16-requirement-2026\u002F","Target API 36",[42,741,742,744,749,751,758],{},[60,743,718],{},[60,745,746,748],{},[17,747,723],{}," New apps and updates must use Play Billing Library 8 or later. Version 7 is no longer accepted by default. Affects: apps with in-app purchases or subscriptions.",[60,750,677],{},[60,752,753],{},[69,754,757],{"href":755,"rel":756},"https:\u002F\u002Fdeveloper.android.com\u002Fgoogle\u002Fplay\u002Fbilling\u002Fdeprecation-faq",[73],"Android Developers",[60,759,760],{},[69,761,763],{"href":762},"\u002Fblog\u002Fplay-billing-library-7-deprecated-update-to-8-2026\u002F","Billing Library 8",[42,765,766,768,773,775,780],{},[60,767,139],{},[60,769,770,772],{},[17,771,673],{}," Answers to the new social media questions in the age rating questionnaire are required when submitting new apps or updates, or apps for notarization for alternative distribution. Apple gives the month, not a day. Affects: every app on the App Store.",[60,774,677],{},[60,776,777],{},[69,778,684],{"href":131,"rel":779},[73],[60,781,782],{},[69,783,690],{"href":689},[42,785,786,789,794,796,801],{},[60,787,788],{},"September 9, 2026",[60,790,791,793],{},[17,792,673],{}," iOS and iPadOS apps uploaded to App Store Connect must target iOS 13 or later. Affects: anyone uploading an iOS or iPadOS build.",[60,795,677],{},[60,797,798],{},[69,799,684],{"href":682,"rel":800},[73],[60,802,803],{},[69,804,806],{"href":805},"\u002Fblog\u002Fios-27-sdk-requirement-april-2027-xcode-27-flutter\u002F","iOS 27 SDK checklist",[42,808,809,812,817,819,831],{},[60,810,811],{},"September 14, 2026",[60,813,814,816],{},[17,815,673],{}," Xcode 27 was released. Flutter's docs say Apple mandates the UIScene life cycle for UIKit apps built with the iOS 27 SDK, and that Flutter apps built with Xcode 27 without it fail to launch. Affects: anyone building with Xcode 27, including Flutter apps with a custom AppDelegate.",[60,818,677],{},[60,820,821,826,827],{},[69,822,825],{"href":823,"rel":824},"https:\u002F\u002Fdocs.flutter.dev\u002Frelease\u002Fbreaking-changes\u002Fuiscenedelegate",[73],"Flutter docs",", ",[69,828,684],{"href":829,"rel":830},"https:\u002F\u002Fdeveloper.apple.com\u002Fnews\u002Freleases\u002F",[73],[60,832,833],{},[69,834,836],{"href":835},"\u002Fblog\u002Fflutter-uiscene-migration-xcode-27-app-wont-launch-2026\u002F","UIScene migration",[42,838,839,842,848,850,856],{},[60,840,841],{},"September 30, 2026",[60,843,844,847],{},[17,845,846],{},"Google Play \u002F Android."," Developer verification protections begin for apps installed from participating stores in Brazil, Indonesia, Singapore and Thailand on certified devices running Android 7 or higher. Affects: anyone distributing Android apps.",[60,849,677],{},[60,851,852],{},[69,853,757],{"href":854,"rel":855},"https:\u002F\u002Fdeveloper.android.com\u002Fdeveloper-verification",[73],[60,857,858],{},[69,859,861],{"href":860},"\u002Fblog\u002Fandroid-developer-verification-requirement-2026\u002F","Developer verification",[42,863,864,867,873,876,883],{},[60,865,866],{},"October 30, 2026",[60,868,869,872],{},[17,870,871],{},"Google APIs."," Google says the legacy Fitbit Web API will be turned off and will no longer function or sync data. Support already ended on September 30, 2026. Affects: apps that read Fitbit data through the Fitbit Web API.",[60,874,875],{},"Upcoming",[60,877,878],{},[69,879,882],{"href":880,"rel":881},"https:\u002F\u002Fdevelopers.google.com\u002Fhealth",[73],"Google Health API",[60,884,885],{},[69,886,888],{"href":887},"\u002Fblog\u002Fgoogle-fit-api-deprecated-health-connect-2026\u002F","Google Fit to Health Connect",[42,890,891,893,899,901,908],{},[60,892,866],{},[60,894,895,898],{},[17,896,897],{},"Supabase."," New tables in the public schema stop getting automatic Data API access in existing projects, so they need an explicit grant. Affects: apps with a Supabase backend.",[60,900,875],{},[60,902,903],{},[69,904,907],{"href":905,"rel":906},"https:\u002F\u002Fsupabase.com\u002Fchangelog\u002F45329-breaking-change-tables-not-exposed-to-data-and-graphql-api-automatically",[73],"Supabase",[60,909,910],{},[69,911,913],{"href":912},"\u002Fblog\u002Fsupabase-permission-denied-new-tables-october-30-2026\u002F","Supabase permission denied",[42,915,916,919,924,926,934],{},[60,917,918],{},"November 1, 2026",[60,920,921,923],{},[17,922,723],{}," End of the extension Google offers for the target API 36 and Billing Library 7 deadlines. Affects: anyone who requested an extension.",[60,925,875],{},[60,927,928,826,931],{},[69,929,733],{"href":731,"rel":930},[73],[69,932,757],{"href":755,"rel":933},[73],[60,935,936,826,938],{},[69,937,739],{"href":738},[69,939,763],{"href":762},[42,941,942,945,950,952,958],{},[60,943,944],{},"End of 2026",[60,946,947,949],{},[17,948,871],{}," The Google Fit APIs, including the REST API, are supported only until the end of 2026. Affects: apps that read fitness data through Google Fit.",[60,951,875],{},[60,953,954],{},[69,955,757],{"href":956,"rel":957},"https:\u002F\u002Fdeveloper.android.com\u002Fhealth-and-fitness\u002Fhealth-connect\u002Fmigration\u002Ffit",[73],[60,959,960],{},[69,961,888],{"href":887},[42,963,964,967,973,975,982],{},[60,965,966],{},"January 1, 2027",[60,968,969,972],{},[17,970,971],{},"Firebase."," New users can no longer start using the FCM InstanceId server APIs and device groups. Firebase says new users can onboard before this date. Affects: new integrations that use those APIs.",[60,974,875],{},[60,976,977],{},[69,978,981],{"href":979,"rel":980},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fcloud-messaging\u002Ftroubleshooting",[73],"Firebase",[60,983,984],{},[69,985,987],{"href":986},"\u002Fblog\u002Ffcm-legacy-api-shutdown-http-v1-migration-2026\u002F","FCM migration",[42,989,990,993,998,1000,1006],{},[60,991,992],{},"February 1, 2027",[60,994,995,997],{},[17,996,723],{}," Updates that don't support 16 KB memory page sizes can't be released, for apps targeting Android 15 (API level 35) and higher. Affects: apps with native code, which includes Flutter apps.",[60,999,875],{},[60,1001,1002],{},[69,1003,757],{"href":1004,"rel":1005},"https:\u002F\u002Fdeveloper.android.com\u002Fguide\u002Fpractices\u002Fpage-sizes",[73],[60,1007,1008],{},[69,1009,1011],{"href":1010},"\u002Fblog\u002Fgoogle-play-16kb-page-size-flutter-android-2026\u002F","16 KB page size",[42,1013,1014,1017,1022,1024,1029],{},[60,1015,1016],{},"2027 (no month stated)",[60,1018,1019,1021],{},[17,1020,846],{}," Developer verification capability expands globally for all apps on certified Android devices. Affects: anyone distributing Android apps.",[60,1023,875],{},[60,1025,1026],{},[69,1027,757],{"href":854,"rel":1028},[73],[60,1030,1031],{},[69,1032,861],{"href":860},[42,1034,1035,1038,1043,1045,1051],{},[60,1036,1037],{},"March 22, 2027",[60,1039,1040,1042],{},[17,1041,971],{}," Firebase Studio shuts down and remaining data is permanently deleted. Affects: anyone with a Firebase Studio workspace.",[60,1044,875],{},[60,1046,1047],{},[69,1048,981],{"href":1049,"rel":1050},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fstudio\u002Fmigrating-project",[73],[60,1052,1053],{},[69,1054,1056],{"href":1055},"\u002Fblog\u002Ffirebase-studio-shutting-down-migrate-project-2027\u002F","Firebase Studio shutdown",[42,1058,1059,1062,1067,1069,1075],{},[60,1060,1061],{},"March 31, 2027",[60,1063,1064,1066],{},[17,1065,971],{}," Firebase Extensions service shuts down. Installed extensions keep running, but you lose the ability to update, reconfigure or uninstall them through the console or CLI. Affects: apps with installed extensions.",[60,1068,875],{},[60,1070,1071],{},[69,1072,981],{"href":1073,"rel":1074},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fextensions\u002Ffaq-and-troubleshooting",[73],[60,1076,1077],{},[69,1078,1080],{"href":1079},"\u002Fblog\u002Ffirebase-extensions-shutting-down-replace-2027\u002F","Firebase Extensions shutdown",[42,1082,1083,1086,1091,1093,1099],{},[60,1084,1085],{},"April 2027",[60,1087,1088,1090],{},[17,1089,673],{}," Apps uploaded to App Store Connect must be built with the iOS 27 and iPadOS 27 SDK or later (tvOS, visionOS and watchOS 27 SDKs for those platforms). Apple gives the month, not a day. Affects: every iOS and Flutter app that ships an update.",[60,1092,875],{},[60,1094,1095],{},[69,1096,684],{"href":1097,"rel":1098},"https:\u002F\u002Fdeveloper.apple.com\u002Fnews\u002F?id=k1mtkt1k",[73],[60,1100,1101,826,1103],{},[69,1102,806],{"href":805},[69,1104,1105],{"href":835},"UIScene and Xcode 27",[42,1107,1108,1110,1115,1117,1129],{},[60,1109,1085],{},[60,1111,1112,1114],{},[17,1113,673],{}," Apple's news post says any app or game submitted must include screenshots for iPhone Duo. Its screenshot specifications page says they will be required for any app using the iOS 27.1 SDK or later. Apple gives the month, not a day. Affects: App Store submissions.",[60,1116,875],{},[60,1118,1119,826,1124],{},[69,1120,1123],{"href":1121,"rel":1122},"https:\u002F\u002Fdeveloper.apple.com\u002Fnews\u002F?id=kkphp5qo",[73],"Apple news",[69,1125,1128],{"href":1126,"rel":1127},"https:\u002F\u002Fdeveloper.apple.com\u002Fhelp\u002Fapp-store-connect\u002Freference\u002Fapp-information\u002Fscreenshot-specifications",[73],"Apple specs",[60,1130,1131],{},[69,1132,806],{"href":805},[42,1134,1135,1137,1142,1144,1150],{},[60,1136,1085],{},[60,1138,1139,1141],{},[17,1140,673],{}," Apple's submitting page says iOS and iPadOS apps uploaded to App Store Connect must target iOS 15 or later. The upcoming requirements page still lists iOS 13 as the minimum since September 9, 2026. Apple gives the month, not a day. Affects: apps whose deployment target is iOS 13 or 14.",[60,1143,875],{},[60,1145,1146],{},[69,1147,684],{"href":1148,"rel":1149},"https:\u002F\u002Fdeveloper.apple.com\u002Fapp-store\u002Fsubmitting\u002F",[73],[60,1151,1152],{},[69,1153,806],{"href":805},[42,1155,1156,1159,1164,1166,1172],{},[60,1157,1158],{},"June 15, 2027",[60,1160,1161,1163],{},[17,1162,971],{}," Firebase ML custom model hosting shuts down. Affects: apps that host custom models in Firebase ML.",[60,1165,875],{},[60,1167,1168],{},[69,1169,981],{"href":1170,"rel":1171},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fml\u002Fmigrate-to-cloud-storage",[73],[60,1173,1174],{},[69,1175,1177],{"href":1176},"\u002Fblog\u002Ffirebase-ml-model-hosting-shutting-down-migrate-2027\u002F","Firebase ML model hosting shutdown",[42,1179,1180,1183,1188,1190,1195],{},[60,1181,1182],{},"August 31, 2027",[60,1184,1185,1187],{},[17,1186,723],{}," Billing Library 8 reaches its own deadline. New apps and updates must use Billing Library 9 or later. Extension available until November 1, 2027. Affects: apps with in-app purchases or subscriptions.",[60,1189,875],{},[60,1191,1192],{},[69,1193,757],{"href":755,"rel":1194},[73],[60,1196,1197],{},[69,1198,1200],{"href":1199},"\u002Fblog\u002Fplay-billing-library-9-migration-deadline-2027\u002F","Billing Library 9",[42,1202,1203,1206,1211,1213,1218],{},[60,1204,1205],{},"September 29, 2027",[60,1207,1208,1210],{},[17,1209,971],{}," The FCM InstanceId server APIs and device groups are decommissioned. Affects: servers that manage topics or tokens through the old APIs.",[60,1212,875],{},[60,1214,1215],{},[69,1216,981],{"href":979,"rel":1217},[73],[60,1219,1220],{},[69,1221,987],{"href":986},[42,1223,1224,1227,1232,1234,1240],{},[60,1225,1226],{},"September 30, 2027",[60,1228,1229,1231],{},[17,1230,971],{}," Firebase Test Lab is fully shut down. Affects: CI pipelines that run tests on Test Lab.",[60,1233,875],{},[60,1235,1236],{},[69,1237,981],{"href":1238,"rel":1239},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Ftest-lab",[73],[60,1241,1242],{},[69,1243,1245],{"href":1244},"\u002Fblog\u002Ffirebase-test-lab-shutting-down-alternatives-2027\u002F","Firebase Test Lab shutdown",[14,1247,1248,1249,1253,1254,1257],{},"Two more notes. Apple's privacy manifest rules (May 1, 2024 for required reason APIs and February 12, 2025 for common SDKs, see the ",[69,1250,1252],{"href":1251},"\u002Fblog\u002Fapple-privacy-manifest-itms-91053-itms-91061-flutter-fix-2026\u002F","privacy manifest guide",") and the FCM legacy send shutdown (July 22, 2024, see the ",[69,1255,1256],{"href":986},"FCM migration guide",") already passed before 2026. I keep them in their own guides because they still cause upload and delivery errors.",[31,1259,684],{"id":1260},"apple",[14,1262,1263,1264,826,1266,310,1268,513],{},"Apple's page names one build rule that matters most: Xcode 26 or later since April 28, 2026. Apple's September 9, 2026 news post adds the next one: starting April 2027, uploads must be built with the iOS 27 and iPadOS 27 SDK or later, which means Xcode 27. Apple's October 5, 2026 post also says that from April 2027 every submission needs iPhone Duo screenshots. The bigger change with Xcode 27 is the UIScene life cycle, which a Flutter app on 3.41 or later with an unmodified AppDelegate gets automatically. A custom AppDelegate needs manual changes. The guides are ",[69,1265,713],{"href":712},[69,1267,1105],{"href":835},[69,1269,1270],{"href":1251},"privacy manifest errors",[14,1272,1273],{},"My advice: check which Xcode your build machine uses before your next upload, and test a build with Xcode 27 before you need one.",[31,1275,1277],{"id":1276},"google-play-and-android","Google Play and Android",[14,1279,1280,1281,1284,1285,826,1288,826,1290,310,1292,513],{},"The Play rules come in pairs. Target API 36 and Billing Library 8 both took effect on August 31, 2026 with an extension to November 1, 2026. After that, February 1, 2027 brings the 16 KB page size rule, and on August 31, 2027 Google requires Billing Library 9 or later for new apps and updates. The ",[69,1282,1283],{"href":1199},"Billing Library 9 guide"," covers that move. Separately, Android developer verification started on September 30, 2026 in four countries, with a global expansion in 2027. The guides are ",[69,1286,1287],{"href":738},"target API 36",[69,1289,1011],{"href":1010},[69,1291,763],{"href":762},[69,1293,1294],{"href":860},"developer verification",[14,1296,1297],{},"My advice: if you are still behind on API 36 or Billing 8, ship that update before November 1, 2026. Then do the 16 KB check before February 1, 2027, since it is the next date that can block a release.",[31,1299,1301],{"id":1300},"firebase-and-google-apis","Firebase and Google APIs",[14,1303,1304,1305,826,1309,826,1312,1314,1315,513],{},"Firebase has five shutdown dates in 2027, plus the January 1 cutoff for new users of the InstanceId APIs. Firestore, Authentication, Cloud Functions and Hosting are not on the list. Google Fit APIs are supported only until the end of 2026, and Google points to Health Connect and the Google Health API. The legacy Fitbit Web API goes first: Google says it will be turned off on October 30, 2026. The guides are ",[69,1306,1308],{"href":1307},"\u002Fblog\u002Ffirebase-deprecations-shutdown-dates-2026\u002F","Firebase shutdown dates",[69,1310,1311],{"href":986},"FCM HTTP v1 migration",[69,1313,888],{"href":887}," and, if you use it, ",[69,1316,1317],{"href":912},"Supabase new table permissions",[14,1319,1320],{},"My advice: open the Firebase console for every project you own and look at Extensions, Machine Learning, Test Lab and Studio. Those are the products with a date attached.",[31,1322,1324],{"id":1323},"how-i-keep-this-page-current","How I keep this page current",[14,1326,1327,1328,513],{},"Every row links to the page where the platform states the date. If a source says only a month or \"later this year\", I write exactly that. When a platform moves a date, I change the row and the updated date at the top of this page. If you spot a date that looks wrong, ",[69,1329,1330],{"href":528},"tell me",[31,1332,517],{"id":516},[14,1334,1335,1336,525,1338,513],{},"If one of these deadlines lands on an app you can't update yourself, the ",[69,1337,524],{"href":523},[69,1339,529],{"href":528},{"title":531,"searchDepth":532,"depth":532,"links":1341},[1342,1343,1344,1345,1346,1347],{"id":642,"depth":532,"text":643},{"id":1260,"depth":532,"text":684},{"id":1276,"depth":532,"text":1277},{"id":1300,"depth":532,"text":1301},{"id":1323,"depth":532,"text":1324},{"id":516,"depth":532,"text":517},"2026-10-18T22:00:00.000Z","One dated table of the App Store, Google Play, Firebase and Google API requirements that affect mobile app owners in 2026 and 2027, with the primary source for each date, checked October 18, 2026.",[1351,1354,1357,1360,1363],{"question":1352,"answer":1353},"What is the next Google Play deadline?","The deadline of November 1, 2026 is the end of the extension window for the target API 36 and Billing Library 7 deadlines. After that, the next one is February 1, 2027, when Google says app updates that don't support 16 KB memory page sizes can't be released.",{"question":1355,"answer":1356},"What Xcode version does the App Store require?","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. Apple's September 9, 2026 news post adds the next one: starting April 2027, iOS and iPadOS apps must be built with the iOS 27 and iPadOS 27 SDK or later. Apple gives the month, not a day.",{"question":1358,"answer":1359},"Do these deadlines apply to apps already published?","It depends on the rule. Google says existing apps must target API 35 or higher to stay available to new users on newer Android versions, and existing apps keep working on version 7 of Play Billing until you ship an update. Most upload-side rules, such as the Xcode SDK minimum, apply when you submit a new build.",{"question":1361,"answer":1362},"Which deadlines affect a Flutter app?","Nearly all of the Apple and Google Play rows do, because a Flutter app is a normal iOS and Android app underneath. The Firebase rows apply only if you use that Firebase product. The Supabase row applies only if you use Supabase.",{"question":1364,"answer":1365},"How will I know if a date changes?","Each row links to the page where the platform states the date, and I list the date I checked it. Dates can move, so check the linked page before you plan around one. I update this page when a platform changes a date.",{"readingTimeStats":1367},{"text":1368,"minutes":1369,"time":1370,"words":1371},"9 min read",8.025,481500,1605,"\u002Fblog\u002Fapp-store-google-play-deadlines-2026-2027","app store deadlines 2026","6 min",[1376,1377,1378],"google-play-target-api-36-android-16-requirement-2026","itms-90725-sdk-version-issue-xcode-26-flutter-2026","firebase-deprecations-shutdown-dates-2026",{"title":621,"description":1349},[1381,1383,1385,1387,1389,1391,1393,1395,1397,1399,1401,1403,1405,1407,1409],{"title":1382,"url":880},"Google for Developers, Google Health API (Fitbit Web API dates)",{"title":1384,"url":682},"Apple Developer, Upcoming requirements",{"title":1386,"url":829},"Apple Developer, Releases",{"title":1388,"url":823},"Flutter docs, Migrate to UIScene life cycle",{"title":1390,"url":731},"Play Console Help, Target API level requirements for Google Play apps",{"title":1392,"url":755},"Android Developers, Play Billing Library deprecation FAQ",{"title":1394,"url":1004},"Android Developers, Support 16 KB page sizes",{"title":1396,"url":854},"Android Developers, Android developer verification",{"title":1398,"url":956},"Android Developers, Migrate from the Google Fit APIs",{"title":1400,"url":979},"Firebase, FCM troubleshooting (InstanceId and device groups deprecation)",{"title":1402,"url":1049},"Firebase, Migrate from Firebase Studio",{"title":1404,"url":1073},"Firebase, Extensions FAQ and troubleshooting",{"title":1406,"url":1170},"Firebase, Migrate Firebase ML model hosting to Cloud Storage",{"title":1408,"url":1238},"Firebase, Test Lab",{"title":1410,"url":905},"Supabase changelog, Tables not exposed to the Data API automatically","blog\u002Fapp-store-google-play-deadlines-2026-2027","app store deadlines 2026, google play deadlines 2026, app store requirements 2027, google play requirements 2027, target api 36 deadline, play billing library 8 deadline, 16 kb page size deadline, xcode 26 requirement, firebase shutdown dates, mobile app compliance calendar",[1414,1415,1416,1417,1418],"Most 2026 deadlines have already hit. Since April 28, 2026 iOS uploads need Xcode 26 or later, and since August 31, 2026 Google Play needs new apps and updates to target API 36 and use Play Billing Library 8.","Google lets you request an extension for both Play deadlines until November 1, 2026. That is the last date to ship an update if you are still behind.","The next hard date for Android is February 1, 2027. Google says updates that don't support 16 KB memory page sizes can't be released after that.","On iOS, apps built with Xcode 27 must use the UIScene life cycle or they fail to launch. Xcode 27 was released on September 14, 2026.","Firebase has five shutdowns between March 22 and September 30, 2027. Core services such as Firestore and Authentication are not on the list.","2026-10-19T09:00:00.000Z","https:\u002F\u002Fapp369.com\u002Fblog\u002Fapp-store-google-play-deadlines-2026-2027\u002F","Hn0eYRMW2JxnIU-wNifpk3mYCbsFDUhq-SdpwzImwYM",{"id":1423,"title":1424,"author":1425,"body":1427,"category":543,"createdAt":2019,"description":2020,"disclosure":546,"extension":547,"faq":2021,"howTo":546,"lastVerified":546,"location":564,"meta":2037,"navigation":571,"ogImage":546,"path":2043,"primaryKeyword":2044,"readingTime":2045,"related":2046,"seo":2049,"sources":2050,"stem":2083,"tags":2084,"takeaways":2085,"updatedAt":2019,"url":2091,"__hash__":2092},"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":1426},{"twitter":9},{"type":11,"value":1428,"toc":2009},[1429,1435,1438,1443,1447,1486,1500,1504,1572,1575,1584,1588,1591,1663,1666,1670,1731,1734,1738,1741,1758,1761,1764,1910,1913,1916,1920,1971,1975,1986,1989,1992,1996,1998,2005],[14,1430,1431,1434],{},[17,1432,1433],{},"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,1436,1437],{},"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,1439,1440,1442],{},[17,1441,28],{}," 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,1444,1446],{"id":1445},"what-the-two-errors-mean","What the two errors mean",[36,1448,1449,1462],{},[39,1450,1451],{},[42,1452,1453,1456,1459],{},[45,1454,1455],{},"Code",[45,1457,1458],{},"What the email says",[45,1460,1461],{},"What it means",[55,1463,1464,1475],{},[42,1465,1466,1469,1472],{},[60,1467,1468],{},"ITMS-91053",[60,1470,1471],{},"\"Missing API declaration\": your app's code references APIs that require reasons, and names categories such as NSPrivacyAccessedAPICategoryFileTimestamp or NSPrivacyAccessedAPICategoryUserDefaults",[60,1473,1474],{},"Code in your app or an SDK uses a required reason API, and no privacy manifest gives an approved reason for it",[42,1476,1477,1480,1483],{},[60,1478,1479],{},"ITMS-91061",[60,1481,1482],{},"\"Missing privacy manifest\": your app includes an SDK that was identified as a commonly used third-party SDK, for example Frameworks\u002FFlutter.framework\u002FFlutter",[60,1484,1485],{},"That SDK has no privacy manifest file",[14,1487,1488,1489,310,1494,1499],{},"The wording comes from emails quoted in Flutter issues ",[69,1490,1493],{"href":1491,"rel":1492},"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F145269",[73],"145269",[69,1495,1498],{"href":1496,"rel":1497},"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F163455",[73],"163455",". Your email may differ a little, so read the file name it gives. That name is your first clue.",[31,1501,1503],{"id":1502},"the-dates","The dates",[36,1505,1506,1517],{},[39,1507,1508],{},[42,1509,1510,1512,1515],{},[45,1511,47],{},[45,1513,1514],{},"What Apple or the email said",[45,1516,53],{},[55,1518,1519,1540,1555],{},[42,1520,1521,1526,1529],{},[60,1522,1523],{},[17,1524,1525],{},"May 1, 2024",[60,1527,1528],{},"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",[60,1530,1531,826,1536],{},[69,1532,1535],{"href":1533,"rel":1534},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fbundleresources\u002Fdescribing-use-of-required-reason-api",[73],"Apple, required reason API",[69,1537,1539],{"href":682,"rel":1538},[73],"Apple, upcoming requirements",[42,1541,1542,1545,1548],{},[60,1543,1544],{},"November 12, 2024",[60,1546,1547],{},"An ITMS-91061 email posted in a Flutter issue says that from this date a new privacy-impacting SDK must include a manifest",[60,1549,1550],{},[69,1551,1554],{"href":1552,"rel":1553},"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F156141",[73],"Flutter issue 156141",[42,1556,1557,1562,1565],{},[60,1558,1559],{},[17,1560,1561],{},"February 12, 2025",[60,1563,1564],{},"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",[60,1566,1567],{},[69,1568,1571],{"href":1569,"rel":1570},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fbundleresources\u002Fadding-a-privacy-manifest-to-your-app-or-third-party-sdk",[73],"Apple, adding a privacy manifest",[14,1573,1574],{},"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,1576,1577,1578,1583],{},"The list includes Flutter, FirebaseCore, FirebaseAuth, FirebaseMessaging, path_provider, shared_preferences_ios, url_launcher, image_picker_ios, sqflite and many more. Check ",[69,1579,1582],{"href":1580,"rel":1581},"https:\u002F\u002Fdeveloper.apple.com\u002Fsupport\u002Fthird-party-SDK-requirements\u002F",[73],"Apple's list"," for the plugins in your app.",[31,1585,1587],{"id":1586},"the-five-required-reason-api-categories","The five required reason API categories",[14,1589,1590],{},"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:",[36,1592,1593,1606],{},[39,1594,1595],{},[42,1596,1597,1600,1603],{},[45,1598,1599],{},"Category key",[45,1601,1602],{},"What it covers",[45,1604,1605],{},"Reason codes from Apple",[55,1607,1608,1619,1630,1641,1652],{},[42,1609,1610,1613,1616],{},[60,1611,1612],{},"NSPrivacyAccessedAPICategoryFileTimestamp",[60,1614,1615],{},"File timestamps and metadata (fstat, lstat, getattrlist and similar)",[60,1617,1618],{},"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",[42,1620,1621,1624,1627],{},[60,1622,1623],{},"NSPrivacyAccessedAPICategorySystemBootTime",[60,1625,1626],{},"System boot time, such as mach_absolute_time",[60,1628,1629],{},"35F9.1 measure elapsed time within the app, 8FFB.1 absolute timestamps for events in the app, 3D61.1 optional bug report",[42,1631,1632,1635,1638],{},[60,1633,1634],{},"NSPrivacyAccessedAPICategoryDiskSpace",[60,1636,1637],{},"Available disk space (statfs, volume capacity keys and similar)",[60,1639,1640],{},"85F4.1 display to the user, E174.1 check space before writing files, 7D9E.1 optional bug report, B728.1 health research apps",[42,1642,1643,1646,1649],{},[60,1644,1645],{},"NSPrivacyAccessedAPICategoryActiveKeyboards",[60,1647,1648],{},"List of active keyboards",[60,1650,1651],{},"3EC4.1 custom keyboard apps, 54BD.1 customize the UI based on the active keyboard",[42,1653,1654,1657,1660],{},[60,1655,1656],{},"NSPrivacyAccessedAPICategoryUserDefaults",[60,1658,1659],{},"UserDefaults",[60,1661,1662],{},"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,1664,1665],{},"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,1667,1669],{"id":1668},"find-which-sdk-or-plugin-triggers-it","Find which SDK or plugin triggers it",[326,1671,1672,1678,1693,1707,1721],{},[162,1673,1674,1677],{},[17,1675,1676],{},"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.",[162,1679,1680,1683,1684,1688,1689,1692],{},[17,1681,1682],{},"Upgrade first."," The Flutter team's guidance in ",[69,1685,1687],{"href":1491,"rel":1686},[73],"issue 145269"," (comment dated April 22, 2024) starts with ",[407,1690,1691],{},"flutter pub upgrade",", because many plugins added their manifests after the rules came out.",[162,1694,1695,1698,1699,1702,1703,1706],{},[17,1696,1697],{},"Look at what your build contains."," The same guidance says to run ",[407,1700,1701],{},"find build\u002Fios\u002Fiphoneos -name \"*.xcprivacy\""," and look at each ",[407,1704,1705],{},"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.",[162,1708,1709,1712,1713,1716,1717,1720],{},[17,1710,1711],{},"Try packaging plugins as frameworks."," The same guidance says adding the ",[407,1714,1715],{},"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 ",[407,1718,1719],{},"static_framework = true"," override it.",[162,1722,1723,1726,1727,1730],{},[17,1724,1725],{},"Search your own code."," In ",[407,1728,1729],{},"ios\u002FRunner.xcworkspace",", 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,1732,1733],{},"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,1735,1737],{"id":1736},"add-or-edit-privacyinfoxcprivacy-in-xcode","Add or edit PrivacyInfo.xcprivacy in Xcode",[14,1739,1740],{},"Do this only for code in your own app, or if an SDK can't be updated. Apple's steps:",[326,1742,1743,1749,1752,1755],{},[162,1744,1745,1746,1748],{},"Open ",[407,1747,1729],{}," in Xcode.",[162,1750,1751],{},"Choose File > New File.",[162,1753,1754],{},"Scroll to the Resource section and select the App Privacy File type, then click Next.",[162,1756,1757],{},"Check the Runner target in the Targets list and click Create.",[14,1759,1760],{},"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,1762,1763],{},"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:",[1765,1766,1770],"pre",{"className":1767,"code":1768,"language":1769,"meta":531,"style":531},"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",[407,1771,1772,1780,1785,1791,1797,1803,1809,1815,1821,1827,1832,1838,1844,1850,1856,1862,1868,1874,1880,1886,1892,1898,1904],{"__ignoreMap":531},[1773,1774,1777],"span",{"class":1775,"line":1776},"line",1,[1773,1778,1779],{},"\u003C?xml version=\"1.0\" encoding=\"UTF-8\"?>\n",[1773,1781,1782],{"class":1775,"line":532},[1773,1783,1784],{},"\u003C!DOCTYPE plist PUBLIC \"-\u002F\u002FApple\u002F\u002FDTD PLIST 1.0\u002F\u002FEN\" \"http:\u002F\u002Fwww.apple.com\u002FDTDs\u002FPropertyList-1.0.dtd\">\n",[1773,1786,1788],{"class":1775,"line":1787},3,[1773,1789,1790],{},"\u003Cplist version=\"1.0\">\n",[1773,1792,1794],{"class":1775,"line":1793},4,[1773,1795,1796],{},"\u003Cdict>\n",[1773,1798,1800],{"class":1775,"line":1799},5,[1773,1801,1802],{},"    \u003Ckey>NSPrivacyTracking\u003C\u002Fkey>\n",[1773,1804,1806],{"class":1775,"line":1805},6,[1773,1807,1808],{},"    \u003Cfalse\u002F>\n",[1773,1810,1812],{"class":1775,"line":1811},7,[1773,1813,1814],{},"    \u003Ckey>NSPrivacyTrackingDomains\u003C\u002Fkey>\n",[1773,1816,1818],{"class":1775,"line":1817},8,[1773,1819,1820],{},"    \u003Carray\u002F>\n",[1773,1822,1824],{"class":1775,"line":1823},9,[1773,1825,1826],{},"    \u003Ckey>NSPrivacyCollectedDataTypes\u003C\u002Fkey>\n",[1773,1828,1830],{"class":1775,"line":1829},10,[1773,1831,1820],{},[1773,1833,1835],{"class":1775,"line":1834},11,[1773,1836,1837],{},"    \u003Ckey>NSPrivacyAccessedAPITypes\u003C\u002Fkey>\n",[1773,1839,1841],{"class":1775,"line":1840},12,[1773,1842,1843],{},"    \u003Carray>\n",[1773,1845,1847],{"class":1775,"line":1846},13,[1773,1848,1849],{},"        \u003Cdict>\n",[1773,1851,1853],{"class":1775,"line":1852},14,[1773,1854,1855],{},"            \u003Ckey>NSPrivacyAccessedAPIType\u003C\u002Fkey>\n",[1773,1857,1859],{"class":1775,"line":1858},15,[1773,1860,1861],{},"            \u003Cstring>NSPrivacyAccessedAPICategoryUserDefaults\u003C\u002Fstring>\n",[1773,1863,1865],{"class":1775,"line":1864},16,[1773,1866,1867],{},"            \u003Ckey>NSPrivacyAccessedAPITypeReasons\u003C\u002Fkey>\n",[1773,1869,1871],{"class":1775,"line":1870},17,[1773,1872,1873],{},"            \u003Carray>\n",[1773,1875,1877],{"class":1775,"line":1876},18,[1773,1878,1879],{},"                \u003Cstring>CA92.1\u003C\u002Fstring>\n",[1773,1881,1883],{"class":1775,"line":1882},19,[1773,1884,1885],{},"            \u003C\u002Farray>\n",[1773,1887,1889],{"class":1775,"line":1888},20,[1773,1890,1891],{},"        \u003C\u002Fdict>\n",[1773,1893,1895],{"class":1775,"line":1894},21,[1773,1896,1897],{},"    \u003C\u002Farray>\n",[1773,1899,1901],{"class":1775,"line":1900},22,[1773,1902,1903],{},"\u003C\u002Fdict>\n",[1773,1905,1907],{"class":1775,"line":1906},23,[1773,1908,1909],{},"\u003C\u002Fplist>\n",[14,1911,1912],{},"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,1914,1915],{},"Apple also says App Store Connect rejects submissions with invalid manifests, so use only the keys and values Apple documents.",[31,1917,1919],{"id":1918},"update-flutter-plugins-and-pods","Update Flutter, plugins and pods",[159,1921,1922,1935,1944,1965],{},[162,1923,1924,1927,1928,310,1932,513],{},[17,1925,1926],{},"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 ",[69,1929,1931],{"href":1930},"\u002Fblog\u002Fflutter-ios-build-failed-after-upgrade-2026\u002F","the iOS build-failed-after-upgrade guide",[69,1933,1934],{"href":835},"the UIScene migration guide",[162,1936,1937,1940,1941,1943],{},[17,1938,1939],{},"Plugins."," Run ",[407,1942,1691],{},", 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.",[162,1945,1946,1949,1950,1953,1954,1957,1958,310,1961,1964],{},[17,1947,1948],{},"Pods."," After a plugin update, run ",[407,1951,1952],{},"pod install"," from ",[407,1955,1956],{},"ios\u002F"," and rebuild. My advice: delete ",[407,1959,1960],{},"Pods",[407,1962,1963],{},"Podfile.lock"," first if CocoaPods keeps the old versions.",[162,1966,1967,1970],{},[17,1968,1969],{},"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,1972,1974],{"id":1973},"check-the-archive-and-re-upload","Check the archive and re-upload",[326,1976,1977,1980,1983],{},[162,1978,1979],{},"In Xcode, choose Product > Archive.",[162,1981,1982],{},"In the Organizer, Control-click the archive and choose Generate Privacy Report.",[162,1984,1985],{},"Choose where to save it and open the report in Preview.",[14,1987,1988],{},"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,1990,1991],{},"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.",[14,1993,508,1994,513],{},[69,1995,512],{"href":511},[31,1997,517],{"id":516},[14,1999,2000,2001,525,2003,513],{},"If App Store Connect keeps rejecting your upload with ITMS-91053 or ITMS-91061, the ",[69,2002,524],{"href":523},[69,2004,529],{"href":528},[2006,2007,2008],"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":531,"searchDepth":532,"depth":532,"links":2010},[2011,2012,2013,2014,2015,2016,2017,2018],{"id":1445,"depth":532,"text":1446},{"id":1502,"depth":532,"text":1503},{"id":1586,"depth":532,"text":1587},{"id":1668,"depth":532,"text":1669},{"id":1736,"depth":532,"text":1737},{"id":1918,"depth":532,"text":1919},{"id":1973,"depth":532,"text":1974},{"id":516,"depth":532,"text":517},"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.",[2022,2025,2028,2031,2034],{"question":2023,"answer":2024},"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":2026,"answer":2027},"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":2029,"answer":2030},"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":2032,"answer":2033},"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":2035,"answer":2036},"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":2038},{"text":2039,"minutes":2040,"time":2041,"words":2042},"8 min read",7.48,448800,1496,"\u002Fblog\u002Fapple-privacy-manifest-itms-91053-itms-91061-flutter-fix-2026","itms-91053","7 min",[2047,579,2048],"flutter-uiscene-migration-xcode-27-app-wont-launch-2026","google-play-16kb-page-size-flutter-android-2026",{"title":1424,"description":2020},[2051,2053,2056,2059,2061,2064,2066,2068,2070,2073,2075,2077,2080],{"title":2052,"url":1533},"Apple Developer, Describing use of required reason API",{"title":2054,"url":2055},"Apple Developer, NSPrivacyAccessedAPIType (categories and reason codes)","https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fbundleresources\u002Fapp-privacy-configuration\u002Fnsprivacyaccessedapitypes\u002Fnsprivacyaccessedapitype",{"title":2057,"url":2058},"Apple Developer, Privacy manifest files","https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fbundleresources\u002Fprivacy-manifest-files",{"title":2060,"url":1569},"Apple Developer, Adding a privacy manifest to your app or third-party SDK",{"title":2062,"url":2063},"Apple Developer, Describing data use in privacy manifests (privacy report)","https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fbundleresources\u002Fdescribing-data-use-in-privacy-manifests",{"title":2065,"url":1580},"Apple Developer, Third-party SDK requirements",{"title":2067,"url":682},"Apple Developer, Upcoming requirements (Approved reasons for APIs, since May 1, 2024)",{"title":2069,"url":1491},"Flutter on GitHub, issue 145269 (ITMS-91053 email text and the Flutter team's guidance)",{"title":2071,"url":2072},"Flutter on GitHub, issue 131940 (privacy manifests in packages, and the warning about copying manifests)","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F131940",{"title":2074,"url":1552},"Flutter on GitHub, issue 156141 (ITMS-91061 email text, November 12, 2024)",{"title":2076,"url":1496},"Flutter on GitHub, issue 163455 (ITMS-91061 email text, February 12, 2025)",{"title":2078,"url":2079},"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":2081,"url":2082},"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",[2086,2087,2088,2089,2090],"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","h7adom0QeA0We-wvgR4Nxy3zAKynORl2rBt9zt1r4rQ",{"id":2094,"title":2095,"author":2096,"body":2098,"category":543,"createdAt":2505,"description":2506,"disclosure":546,"extension":547,"faq":2507,"howTo":546,"lastVerified":546,"location":564,"meta":2523,"navigation":571,"ogImage":546,"path":2529,"primaryKeyword":2530,"readingTime":2045,"related":2531,"seo":2532,"sources":2533,"stem":2555,"tags":2556,"takeaways":2557,"updatedAt":2505,"url":2563,"__hash__":2564},"blog\u002Fblog\u002Fitms-90683-missing-purpose-string-info-plist-flutter-2026.md","ITMS-90683: Fix Missing Purpose String in Info.plist",{"name":7,"social":2097},{"twitter":9},{"type":11,"value":2099,"toc":2496},[2100,2106,2109,2113,2116,2131,2134,2196,2200,2208,2211,2225,2234,2238,2241,2255,2262,2287,2290,2293,2297,2300,2315,2407,2414,2421,2424,2437,2441,2465,2478,2482,2485,2487,2494],[14,2101,2102,2105],{},[17,2103,2104],{},"If App Store Connect emailed you ITMS-90683, your app's code references an API that accesses sensitive user data, and Info.plist has no purpose string for it."," The email names the missing key, for example NSCameraUsageDescription or NSPhotoLibraryUsageDescription. In a Flutter app the trigger is often a plugin, not your own code. The fix is to add an accurate purpose string for features you really ship, or to remove the access so the key is no longer needed.",[14,2107,2108],{},"The facts below come from Apple's developer documentation, the App Review Guidelines, the plugin READMEs and the GitHub issues listed in the sources. I checked each one on October 18, 2026.",[14,2110,2111,1442],{},[17,2112,28],{},[31,2114,1458],{"id":2115},"what-the-email-says",[14,2117,2118,2119,2124,2125,2130],{},"The email heading is \"ITMS-90683: Missing Purpose String in Info.plist\". A Flutter issue (",[69,2120,2123],{"href":2121,"rel":2122},"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F113603",[73],"113603",") quotes one such email, posted by an image_picker user. It includes this sentence: \"While your app might not use these APIs, a purpose string is still required.\" Your wording may differ. Another issue (",[69,2126,2129],{"href":2127,"rel":2128},"https:\u002F\u002Fgithub.com\u002FBaseflow\u002Fflutter-permission-handler\u002Fissues\u002F1543",[73],"permission_handler 1543",") quotes a version that also mentions entitlements, so read your own email for the key name.",[14,2132,2133],{},"That key name is the part you need. These are the keys I have seen in the sources for this page:",[36,2135,2136,2149],{},[39,2137,2138],{},[42,2139,2140,2143,2146],{},[45,2141,2142],{},"Key in the email",[45,2144,2145],{},"What it is for",[45,2147,2148],{},"Where I saw it",[55,2150,2151,2165,2179],{},[42,2152,2153,2156,2159],{},[60,2154,2155],{},"NSCameraUsageDescription",[60,2157,2158],{},"Required if your app uses APIs that access the device's camera",[60,2160,2161],{},[69,2162,684],{"href":2163,"rel":2164},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fbundleresources\u002Finformation-property-list\u002Fnscamerausagedescription",[73],[42,2166,2167,2170,2173],{},[60,2168,2169],{},"NSPhotoLibraryUsageDescription",[60,2171,2172],{},"Required if your app uses APIs with read or write access to the photo library. If your app only adds assets and doesn't read them, Apple points to a different key",[60,2174,2175],{},[69,2176,684],{"href":2177,"rel":2178},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fbundleresources\u002Finformation-property-list\u002Fnsphotolibraryusagedescription",[73],[42,2180,2181,2184,2187],{},[60,2182,2183],{},"NSMicrophoneUsageDescription, NSContactsUsageDescription, NSLocationWhenInUseUsageDescription, NSBluetoothAlwaysUsageDescription",[60,2185,2186],{},"Microphone, contacts, location while in use, Bluetooth",[60,2188,2189,2190,2195],{},"Listed in the permission_handler ",[69,2191,2194],{"href":2192,"rel":2193},"https:\u002F\u002Fgithub.com\u002FBaseflow\u002Fflutter-permission-handler\u002Fblob\u002Fmain\u002Fpermission_handler\u002FREADME.md",[73],"README"," table of permissions and Info.plist keys",[31,2197,2199],{"id":2198},"why-a-flutter-app-gets-it-for-features-it-doesnt-use","Why a Flutter app gets it for features it doesn't use",[14,2201,2202,2203,513],{},"Apple's documentation says it plainly. App Review checks for the use of protected resources and rejects apps that contain code accessing them without a purpose string. It also says that external libraries or SDKs may reference APIs that require a purpose string, that a purpose string is still necessary even if your app doesn't use those APIs, and that you are responsible for all access of protected resources, including external SDK and library access. Source: ",[69,2204,2207],{"href":2205,"rel":2206},"https:\u002F\u002Fdeveloper.apple.com\u002Fdocumentation\u002Fuikit\u002Frequesting-access-to-protected-resources",[73],"Apple, Requesting access to protected resources",[14,2209,2210],{},"Two common Flutter cases:",[159,2212,2213,2219],{},[162,2214,2215,2218],{},[17,2216,2217],{},"image_picker."," Its README says to add NSPhotoLibraryUsageDescription, NSCameraUsageDescription and, if you intend to record videos, NSMicrophoneUsageDescription. It adds that the photo library permission won't be requested if you always pass false for requestFullMetadata, but that \"App Store policy requires including the plist entry.\" That matches the email quoted in issue 113603.",[162,2220,2221,2224],{},[17,2222,2223],{},"permission_handler."," The README says the plugin uses macros to control whether a permission is enabled. If a permission's code is compiled in, the app references that API, and Apple's page says App Review rejects code that accesses a protected resource without a purpose string.",[14,2226,2227,2228,2233],{},"Flutter's older issue ",[69,2229,2232],{"href":2230,"rel":2231},"https:\u002F\u002Fgithub.com\u002Fflutter\u002Fflutter\u002Fissues\u002F21941",[73],"21941"," shows this isn't new. In 2018 a developer got the same kind of email for contacts, calendars, Apple Music, motion and speech recognition keys that their app didn't use.",[31,2235,2237],{"id":2236},"fix-1-add-accurate-purpose-strings","Fix 1: add accurate purpose strings",[14,2239,2240],{},"Do this for features your app really ships. Apple's rules for a purpose string:",[159,2242,2243,2246,2249,2252],{},[162,2244,2245],{},"It isn't blank and isn't only whitespace.",[162,2247,2248],{},"It is shorter than 4,000 bytes. Typical strings are one complete sentence.",[162,2250,2251],{},"It is accurate, meaningful and specific about why the app needs the resource.",[162,2253,2254],{},"The same rules apply to localized strings.",[14,2256,2257,2258,2261],{},"Add the key to ",[407,2259,2260],{},"ios\u002FRunner\u002FInfo.plist",". Here is the shape. These strings are examples only. Rewrite each one to say what your own app does with the data:",[1765,2263,2265],{"className":1767,"code":2264,"language":1769,"meta":531,"style":531},"\u003Ckey>NSCameraUsageDescription\u003C\u002Fkey>\n\u003Cstring>EXAMPLE: Rewrite this. The camera lets you take a photo to attach to a job report.\u003C\u002Fstring>\n\u003Ckey>NSPhotoLibraryUsageDescription\u003C\u002Fkey>\n\u003Cstring>EXAMPLE: Rewrite this. Your photo library lets you choose an existing photo to attach to a job report.\u003C\u002Fstring>\n",[407,2266,2267,2272,2277,2282],{"__ignoreMap":531},[1773,2268,2269],{"class":1775,"line":1776},[1773,2270,2271],{},"\u003Ckey>NSCameraUsageDescription\u003C\u002Fkey>\n",[1773,2273,2274],{"class":1775,"line":532},[1773,2275,2276],{},"\u003Cstring>EXAMPLE: Rewrite this. The camera lets you take a photo to attach to a job report.\u003C\u002Fstring>\n",[1773,2278,2279],{"class":1775,"line":1787},[1773,2280,2281],{},"\u003Ckey>NSPhotoLibraryUsageDescription\u003C\u002Fkey>\n",[1773,2283,2284],{"class":1775,"line":1793},[1773,2285,2286],{},"\u003Cstring>EXAMPLE: Rewrite this. Your photo library lets you choose an existing photo to attach to a job report.\u003C\u002Fstring>\n",[14,2288,2289],{},"Apple's page says purpose strings help people make an informed decision, and that explaining accurately and concisely, typically in one complete sentence, improves the chances they grant access.",[14,2291,2292],{},"My advice: don't paste a generic sentence into every key just to clear the email. App Review guideline 5.1.1(ii) says \"Ensure your purpose strings clearly and completely describe your use of the data.\" A string that describes a feature your app doesn't have is a new problem.",[31,2294,2296],{"id":2295},"fix-2-remove-the-access-you-dont-use","Fix 2: remove the access you don't use",[14,2298,2299],{},"Guideline 5.1.1(iii) says apps should only request access to data relevant to the core functionality of the app. Apple's page, in its example of an App Review message, says to either provide a purpose string or remove the code that's accessing the resource.",[14,2301,2302,2303,2306,2307,2310,2311,2314],{},"With permission_handler on CocoaPods, the README gives this procedure. In your Podfile's ",[407,2304,2305],{},"post_install"," block, set the macro of each permission you don't need to 0, and delete that same permission's usage description from Info.plist. The README says to use ",[407,2308,2309],{},"PERMISSION_CAMERA=0"," instead of ",[407,2312,2313],{},"PERMISSION_CAMERA=1",", for example. Trimmed shape:",[1765,2316,2320],{"className":2317,"code":2318,"language":2319,"meta":531,"style":531},"language-ruby shiki shiki-themes github-light github-dark","post_install do |installer|\n  installer.pods_project.targets.each do |target|\n    flutter_additional_ios_build_settings(target)\n\n    target.build_configurations.each do |config|\n      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [\n        '$(inherited)',\n        # permissions you use: keep the macro, set to 1, for example:\n        'PERMISSION_PHOTOS=1',\n        # permissions you don't use: set to 0, or leave the macro out\n        'PERMISSION_CAMERA=0',\n        'PERMISSION_CONTACTS=0',\n        'PERMISSION_MICROPHONE=0',\n      ]\n    end\n  end\nend\n","ruby",[407,2321,2322,2327,2332,2337,2342,2347,2352,2357,2362,2367,2372,2377,2382,2387,2392,2397,2402],{"__ignoreMap":531},[1773,2323,2324],{"class":1775,"line":1776},[1773,2325,2326],{},"post_install do |installer|\n",[1773,2328,2329],{"class":1775,"line":532},[1773,2330,2331],{},"  installer.pods_project.targets.each do |target|\n",[1773,2333,2334],{"class":1775,"line":1787},[1773,2335,2336],{},"    flutter_additional_ios_build_settings(target)\n",[1773,2338,2339],{"class":1775,"line":1793},[1773,2340,2341],{"emptyLinePlaceholder":571},"\n",[1773,2343,2344],{"class":1775,"line":1799},[1773,2345,2346],{},"    target.build_configurations.each do |config|\n",[1773,2348,2349],{"class":1775,"line":1805},[1773,2350,2351],{},"      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [\n",[1773,2353,2354],{"class":1775,"line":1811},[1773,2355,2356],{},"        '$(inherited)',\n",[1773,2358,2359],{"class":1775,"line":1817},[1773,2360,2361],{},"        # permissions you use: keep the macro, set to 1, for example:\n",[1773,2363,2364],{"class":1775,"line":1823},[1773,2365,2366],{},"        'PERMISSION_PHOTOS=1',\n",[1773,2368,2369],{"class":1775,"line":1829},[1773,2370,2371],{},"        # permissions you don't use: set to 0, or leave the macro out\n",[1773,2373,2374],{"class":1775,"line":1834},[1773,2375,2376],{},"        'PERMISSION_CAMERA=0',\n",[1773,2378,2379],{"class":1775,"line":1840},[1773,2380,2381],{},"        'PERMISSION_CONTACTS=0',\n",[1773,2383,2384],{"class":1775,"line":1846},[1773,2385,2386],{},"        'PERMISSION_MICROPHONE=0',\n",[1773,2388,2389],{"class":1775,"line":1852},[1773,2390,2391],{},"      ]\n",[1773,2393,2394],{"class":1775,"line":1858},[1773,2395,2396],{},"    end\n",[1773,2398,2399],{"class":1775,"line":1864},[1773,2400,2401],{},"  end\n",[1773,2403,2404],{"class":1775,"line":1870},[1773,2405,2406],{},"end\n",[14,2408,2409,2410,2413],{},"A macro set to 1 compiles that permission in. A macro set to 0, or left out, leaves it out. Keep 1 only for permissions your app really uses. The ",[407,2411,2412],{},"||="," line is copied from the README.",[14,2415,2416,2417,2420],{},"Use the full list from the ",[69,2418,2194],{"href":2192,"rel":2419},[73],". Its table maps each Permission to its Info.plist key and macro. Location has two macros: PERMISSION_LOCATION covers when-in-use and always, and the README says an app that only needs when-in-use should specify only PERMISSION_LOCATION_WHENINUSE.",[14,2422,2423],{},"The README also says that permission_handler by default excludes all permissions since version 8.0.0, and developers only enable those the app needs. If your Podfile came from an old template with every macro set to 1, that is a place to look.",[14,2425,2426,2427,2430,2431,2436],{},"If you build with Swift Package Manager, the README describes a different mechanism. It finds your Info.plist through the INFOPLIST_FILE setting and compiles in the permissions whose keys it finds there, so a single-flavor app needs no extra configuration. It also says that for apps with flavors, a permission declared in one plist can be compiled into every build, which it calls grounds for App Store rejection (ITMS-90683). It documents a ",[407,2428,2429],{},"permission_handler.yaml"," file to give each flavor its own plist. Issue ",[69,2432,2435],{"href":2433,"rel":2434},"https:\u002F\u002Fgithub.com\u002FBaseflow\u002Fflutter-permission-handler\u002Fissues\u002F1558",[73],"1558"," shows a related report about location. Check the current README for your plugin version.",[31,2438,2440],{"id":2439},"rebuild-and-re-upload","Rebuild and re-upload",[326,2442,2443,2449,2459,2462],{},[162,2444,2445,2446,2448],{},"Edit ",[407,2447,2260],{}," and, for CocoaPods, the Podfile.",[162,2450,2451,2452,2455,2456,2458],{},"From the ",[407,2453,2454],{},"ios"," folder, run ",[407,2457,1952],{},". The README's last step for the Podfile route is \"Clean & Rebuild\".",[162,2460,2461],{},"Build a new archive. The upload needs a new build number.",[162,2463,2464],{},"Upload again and wait for the processing email.",[14,2466,2467,2468,2471,2472,2475,2476,513],{},"My advice: if your upload also fails with a different code, read it separately. For SDK version errors see ",[69,2469,2470],{"href":712},"the ITMS-90725 guide",". For privacy manifest errors see ",[69,2473,2474],{"href":1251},"the ITMS-91053 and ITMS-91061 guide",". If a Flutter upgrade broke the iOS build itself, see ",[69,2477,1931],{"href":1930},[31,2479,2481],{"id":2480},"what-happens-if-the-string-is-missing-at-runtime","What happens if the string is missing at runtime",[14,2483,2484],{},"Apple's page says to always provide a valid purpose string in the Signing and Capabilities editor if your app uses a protected resource. It continues: \"If you don't, attempts to access the resource fail, and might cause your app to crash.\" So a missing string can hurt users as well as your upload. Add the string for any feature you ship.",[31,2486,517],{"id":516},[14,2488,2489,2490,525,2492,513],{},"If App Store Connect keeps flagging missing purpose strings, or App Review rejects the wording, the ",[69,2491,524],{"href":523},[69,2493,529],{"href":528},[2006,2495,2008],{},{"title":531,"searchDepth":532,"depth":532,"links":2497},[2498,2499,2500,2501,2502,2503,2504],{"id":2115,"depth":532,"text":1458},{"id":2198,"depth":532,"text":2199},{"id":2236,"depth":532,"text":2237},{"id":2295,"depth":532,"text":2296},{"id":2439,"depth":532,"text":2440},{"id":2480,"depth":532,"text":2481},{"id":516,"depth":532,"text":517},"2026-10-18T21:30:00.000Z","App Store Connect emails ITMS-90683 when your app, or a plugin inside it, references an API that needs a purpose string and Info.plist has none. Why Flutter apps get it for features they never use, and how to fix it with accurate strings or permission_handler Podfile macros, from Apple's and the plugins' sources checked October 18, 2026.",[2508,2511,2514,2517,2520],{"question":2509,"answer":2510},"What does ITMS-90683 Missing purpose string mean?","It means the app's code references an API that accesses sensitive user data, and the Info.plist has no purpose string for it. Apple's documentation says App Review rejects apps that contain code accessing protected resources without a purpose string. The email names the key it expects.",{"question":2512,"answer":2513},"Why do I get it for a camera or contacts feature I do not use?","Apple says external libraries and SDKs may reference APIs that require a purpose string, and that a purpose string is still necessary even if your app does not use those APIs. In Flutter, a plugin such as permission_handler or image_picker can link those APIs.",{"question":2515,"answer":2516},"Can I just write any text in the purpose string?","No. Apple says a purpose string must not be blank and must be accurate, meaningful and specific about why the app needs the resource. Write what your app really does with the data, and only add keys for features you ship.",{"question":2518,"answer":2519},"How do I turn off unused permissions in permission_handler?","For CocoaPods, the plugin README says to set the macro to 0 in the GCC_PREPROCESSOR_DEFINITIONS list in your Podfile, for example PERMISSION_CAMERA=0, and delete that permission's usage description from Info.plist. Then clean and rebuild.",{"question":2521,"answer":2522},"What happens if the purpose string is missing at runtime?","Apple says that if you do not provide a valid purpose string for a protected resource your app uses, attempts to access the resource fail and might cause your app to crash.",{"readingTimeStats":2524},{"text":2525,"minutes":2526,"time":2527,"words":2528},"7 min read",6.365,381900,1273,"\u002Fblog\u002Fitms-90683-missing-purpose-string-info-plist-flutter-2026","itms-90683",[577,1377,579],{"title":2095,"description":2506},[2534,2536,2538,2540,2542,2544,2547,2549,2551,2553],{"title":2535,"url":2205},"Apple Developer, Requesting access to protected resources",{"title":2537,"url":2163},"Apple Developer, NSCameraUsageDescription",{"title":2539,"url":2177},"Apple Developer, NSPhotoLibraryUsageDescription",{"title":2541,"url":607},"Apple Developer, App Review Guidelines (5.1.1 Data Collection and Storage)",{"title":2543,"url":2192},"Baseflow on GitHub, permission_handler README (iOS setup, Podfile macros, Swift Package Manager)",{"title":2545,"url":2546},"flutter\u002Fpackages on GitHub, image_picker README (iOS setup)","https:\u002F\u002Fgithub.com\u002Fflutter\u002Fpackages\u002Fblob\u002Fmain\u002Fpackages\u002Fimage_picker\u002Fimage_picker\u002FREADME.md",{"title":2548,"url":2121},"Flutter on GitHub, issue 113603 (ITMS-90683 email text for NSPhotoLibraryUsageDescription with image_picker)",{"title":2550,"url":2230},"Flutter on GitHub, issue 21941 (earlier Apple email text, keys for features the app did not use)",{"title":2552,"url":2127},"permission_handler on GitHub, issue 1543 (ITMS-90683 email for a location key)",{"title":2554,"url":2433},"permission_handler on GitHub, issue 1558 (location permission and ITMS-90683 with Swift Package Manager)","blog\u002Fitms-90683-missing-purpose-string-info-plist-flutter-2026","itms-90683, itms-90683 missing purpose string, missing purpose string info.plist flutter, nscamerausagedescription flutter, nsphotolibraryusagedescription flutter, permission_handler podfile, permission_camera=0, image_picker info.plist, app store connect email flutter",[2558,2559,2560,2561,2562],"ITMS-90683 means your app, or a library inside it, references an API that accesses sensitive user data and Info.plist has no matching purpose string. The email names the key it wants, such as NSCameraUsageDescription.","Apple says you are responsible for all access of protected resources, including access by external SDKs and libraries. A plugin can trigger the email even if your app never uses that feature.","You have two fixes. Add an accurate purpose string for the key, or remove the access: with permission_handler, set the unused PERMISSION_ macros to 0 in the Podfile and delete that permission's key from Info.plist.","Apple says each purpose string must be accurate, meaningful and specific, and App Review guideline 5.1.1 asks that purpose strings clearly and completely describe your use of the data. A vague placeholder is a risk.","After you change the Podfile or Info.plist, run pod install, rebuild, and upload a new build.","https:\u002F\u002Fapp369.com\u002Fblog\u002Fitms-90683-missing-purpose-string-info-plist-flutter-2026\u002F","DlDVqFGdCLi9s936ZbhhDiik0K1_LXLBot7SsfVNAZo",{"id":2566,"title":2567,"author":2568,"body":2570,"category":543,"createdAt":3070,"description":3071,"disclosure":546,"extension":547,"faq":546,"howTo":546,"lastVerified":546,"location":564,"meta":3072,"navigation":571,"ogImage":546,"path":3078,"primaryKeyword":546,"readingTime":2045,"related":546,"seo":3079,"sources":546,"stem":3080,"tags":3081,"takeaways":546,"updatedAt":3070,"url":3082,"__hash__":3083},"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":2569},{"twitter":9},{"type":11,"value":2571,"toc":3053},[2572,2578,2589,2593,2596,2629,2632,2688,2692,2722,2726,2735,2760,2764,2770,2813,2890,2906,2910,2922,2954,2958,2967,2970,2974,2977,2981,2987,2991,2996,3010,3014,3026,3030,3033,3037,3043,3047,3050],[14,2573,2574,2577],{},[17,2575,2576],{},"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,2579,2580,2581,2584,2585,513],{},"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 ",[69,2582,2583],{"href":523},"fixed-price Flutter & Firebase Fix Ticket",". For the wider method, see ",[69,2586,2588],{"href":2587},"\u002Fblog\u002Fhow-to-debug-a-flutter-firebase-bug-2026\u002F","how to debug a Flutter and Firebase bug",[31,2590,2592],{"id":2591},"step-1-read-the-real-error","Step 1: Read the real error",[14,2594,2595],{},"Don't start by deleting folders. First get the full output.",[326,2597,2598,2605,2619],{},[162,2599,2600,2601,2604],{},"Run ",[407,2602,2603],{},"flutter doctor -v"," and fix anything it flags under Xcode or CocoaPods.",[162,2606,2600,2607,2610,2611,2614,2615,2618],{},[407,2608,2609],{},"flutter build ios -v"," (or ",[407,2612,2613],{},"flutter run -v",") and read from the first line that says ",[407,2616,2617],{},"error:",", not the last line. The final \"Xcode build failed\" message is a summary.",[162,2620,2621,2622,2624,2625,2628],{},"If the failure happens in Xcode itself, open ",[407,2623,1729],{}," (never ",[407,2626,2627],{},"Runner.xcodeproj",") and use the Report navigator to open the build log. Filter for errors and read the first one.",[14,2630,2631],{},"Where the error appears tells you which step failed:",[36,2633,2634,2644],{},[39,2635,2636],{},[42,2637,2638,2641],{},[45,2639,2640],{},"Where it fails",[45,2642,2643],{},"Likely area",[55,2645,2646,2656,2664,2672,2680],{},[42,2647,2648,2653],{},[60,2649,2650,2652],{},[407,2651,1952],{}," output, before compiling",[60,2654,2655],{},"CocoaPods resolution, Podfile, specs",[42,2657,2658,2661],{},[60,2659,2660],{},"\"Compiling for iOS X, but module requires iOS Y\"",[60,2662,2663],{},"Deployment target too low",[42,2665,2666,2669],{},[60,2667,2668],{},"Swift or Objective-C compile errors inside a plugin",[60,2670,2671],{},"Plugin and Xcode or SDK version mismatch",[42,2673,2674,2677],{},[60,2675,2676],{},"Linking or \"framework not found\"",[60,2678,2679],{},"Stale Pods or build cache",[42,2681,2682,2685],{},[60,2683,2684],{},"Code signing messages",[60,2686,2687],{},"Signing and provisioning, covered at the end",[31,2689,2691],{"id":2690},"step-2-check-your-xcode-and-cocoapods-versions","Step 2: Check your Xcode and CocoaPods versions",[14,2693,2694,2695,2700,2701,310,2704,2707,2708,2713,2714,2717,2718,2721],{},"Upgrades often fail because the Firebase SDK moved its minimum requirements. The ",[69,2696,2699],{"href":2697,"rel":2698},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fios\u002Finstallation-methods",[73],"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 ",[407,2702,2703],{},"pod --version",[407,2705,2706],{},"xcodebuild -version",", and update if either is below what your plugins need. Flutter's own ",[69,2709,2712],{"href":2710,"rel":2711},"https:\u002F\u002Fdocs.flutter.dev\u002Fplatform-integration\u002Fios\u002Fsetup",[73],"iOS setup page"," covers pointing the command-line tools at the right Xcode (",[407,2715,2716],{},"xcode-select",") and accepting licenses (",[407,2719,2720],{},"sudo xcodebuild -license","); a second Xcode installed on the machine is a common reason a build uses the wrong toolchain.",[31,2723,2725],{"id":2724},"step-3-fix-the-ios-deployment-target","Step 3: Fix the iOS deployment target",[14,2727,2728,2729,2734],{},"A plugin upgrade can raise the minimum iOS version. The ",[69,2730,2733],{"href":2731,"rel":2732},"https:\u002F\u002Ffirebase.google.com\u002Fdocs\u002Fflutter\u002Fsetup",[73],"Firebase Flutter setup page"," lists iOS 15 or later as the Apple requirement for the FlutterFire plugins. Check three places and make them agree:",[159,2736,2737,2747,2750],{},[162,2738,2739,2742,2743,2746],{},[407,2740,2741],{},"ios\u002FPodfile",": the line ",[407,2744,2745],{},"platform :ios, '15.0'"," (use the minimum your plugins ask for; if the line is commented out, uncomment it).",[162,2748,2749],{},"Xcode: Runner target, General tab, \"Minimum Deployments\".",[162,2751,2752,2753,2755,2756,2759],{},"The ",[407,2754,2305],{}," block in the Podfile, if you have one that sets ",[407,2757,2758],{},"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,2761,2763],{"id":2762},"step-4-refresh-cocoapods-then-clean-it-out","Step 4: Refresh CocoaPods, then clean it out",[14,2765,2766,2767,2769],{},"Work from least to most destructive. Run these inside the ",[407,2768,2454],{}," folder.",[326,2771,2772,2780,2807],{},[162,2773,2774,2779],{},[17,2775,2776],{},[407,2777,2778],{},"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.",[162,2781,2782,2787,2788,2790,2791,2796,2797,2799,2800,2802,2803,2806],{},[17,2783,2784],{},[407,2785,2786],{},"pod update PODNAME"," if one pod needs to move to a newer version than ",[407,2789,1963],{}," allows. As the ",[69,2792,2795],{"href":2793,"rel":2794},"https:\u002F\u002Fguides.cocoapods.org\u002Fusing\u002Fpod-install-vs-update.html",[73],"CocoaPods guide"," explains, ",[407,2798,1952],{}," respects the versions in ",[407,2801,1963],{},", while ",[407,2804,2805],{},"pod update"," ignores the lock and fetches the newest version your constraints allow.",[162,2808,2809,2812],{},[17,2810,2811],{},"A clean reinstall."," If it is still broken, remove the generated pieces and rebuild them:",[1765,2814,2818],{"className":2815,"code":2816,"language":2817,"meta":531,"style":531},"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",[407,2819,2820,2830,2845,2852,2860,2870],{"__ignoreMap":531},[1773,2821,2822,2826],{"class":1775,"line":1776},[1773,2823,2825],{"class":2824},"sj4cs","cd",[1773,2827,2829],{"class":2828},"sZZnC"," ios\n",[1773,2831,2832,2836,2839,2842],{"class":1775,"line":532},[1773,2833,2835],{"class":2834},"sScJk","rm",[1773,2837,2838],{"class":2824}," -rf",[1773,2840,2841],{"class":2828}," Pods",[1773,2843,2844],{"class":2828}," Podfile.lock\n",[1773,2846,2847,2849],{"class":1775,"line":1787},[1773,2848,2825],{"class":2824},[1773,2850,2851],{"class":2828}," ..\n",[1773,2853,2854,2857],{"class":1775,"line":1793},[1773,2855,2856],{"class":2834},"flutter",[1773,2858,2859],{"class":2828}," clean\n",[1773,2861,2862,2864,2867],{"class":1775,"line":1799},[1773,2863,2856],{"class":2834},[1773,2865,2866],{"class":2828}," pub",[1773,2868,2869],{"class":2828}," get\n",[1773,2871,2872,2874,2877,2881,2884,2887],{"class":1775,"line":1805},[1773,2873,2825],{"class":2824},[1773,2875,2876],{"class":2828}," ios",[1773,2878,2880],{"class":2879},"sVt8B"," && ",[1773,2882,2883],{"class":2834},"pod",[1773,2885,2886],{"class":2828}," install",[1773,2888,2889],{"class":2824}," --repo-update\n",[14,2891,2892,2893,2895,2896,2898,2899,2901,2902,2905],{},"Deleting ",[407,2894,1960],{}," is safe because it is generated. Deleting ",[407,2897,1963],{}," 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 ",[407,2900,1963],{},", 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 ",[407,2903,2904],{},"~\u002FLibrary\u002FDeveloper\u002FXcode\u002FDerivedData","; it only holds build products, and Xcode recreates it.",[31,2907,2909],{"id":2908},"step-5-upgrade-the-flutterfire-plugins-together","Step 5: Upgrade the FlutterFire plugins together",[14,2911,2912,826,2915,826,2918,2921],{},[407,2913,2914],{},"firebase_core",[407,2916,2917],{},"cloud_firestore",[407,2919,2920],{},"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.",[159,2923,2924,2933,2948],{},[162,2925,2600,2926,2929,2930,2932],{},[407,2927,2928],{},"flutter pub outdated"," to see the gap, then upgrade the whole FlutterFire family in one ",[407,2931,443],{}," change.",[162,2934,2935,2936,2939,2940,2944,2945,513],{},"Re-run ",[407,2937,2938],{},"flutterfire configure"," if you added a Firebase service or platform; the ",[69,2941,2943],{"href":2731,"rel":2942},[73],"Firebase docs"," say re-running it keeps your configuration current. Install the tool with ",[407,2946,2947],{},"dart pub global activate flutterfire_cli",[162,2949,2950,2951,2953],{},"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 ",[407,2952,2914],{}," is a classic conflict.",[31,2955,2957],{"id":2956},"step-6-know-that-cocoapods-is-being-phased-out","Step 6: Know that CocoaPods is being phased out",[14,2959,2960,2961,2966],{},"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 ",[69,2962,2965],{"href":2963,"rel":2964},"https:\u002F\u002Fdocs.flutter.dev\u002Fpackages-and-plugins\u002Fswift-package-manager\u002Ffor-app-developers",[73],"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,2968,2969],{},"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,2971,2973],{"id":2972},"step-7-signing-errors-briefly","Step 7: Signing errors, briefly",[14,2975,2976],{},"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,2978,2980],{"id":2979},"when-to-get-help","When to get help",[14,2982,2983,2984,2986],{},"If an iOS build has eaten more than a day and the steps above haven't moved it, App369's ",[69,2985,2583],{"href":523}," 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,2988,2990],{"id":2989},"frequently-asked-questions","Frequently Asked Questions",[2992,2993,2995],"h3",{"id":2994},"why-did-my-flutter-ios-build-fail-after-upgrading-flutter","Why did my Flutter iOS build fail after upgrading Flutter?",[14,2997,2998,2999,3001,3002,3004,3005,3007,3008,513],{},"Most often the Podfile or Xcode project still has an old iOS deployment target, ",[407,3000,1963],{}," pins old pod versions, or plugin versions no longer match each other. Run ",[407,3003,2609],{},", find the first ",[407,3006,2617],{}," line, then work through the deployment target and ",[407,3009,2778],{},[2992,3011,3013],{"id":3012},"is-it-safe-to-delete-podfilelock-and-the-pods-folder","Is it safe to delete Podfile.lock and the Pods folder?",[14,3015,3016,3017,3019,3020,3022,3023,3025],{},"Yes, for a repair. ",[407,3018,1960],{}," is generated and ",[407,3021,1963],{}," is rebuilt by ",[407,3024,1952],{},". The catch is that pods may resolve to newer versions, so check the new lock file and commit it once the build works.",[2992,3027,3029],{"id":3028},"what-does-pod-install-repo-update-do","What does \"pod install --repo-update\" do?",[14,3031,3032],{},"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.",[2992,3034,3036],{"id":3035},"should-i-upgrade-only-one-flutterfire-plugin","Should I upgrade only one FlutterFire plugin?",[14,3038,3039,3040,3042],{},"Avoid it. FlutterFire plugins depend on matching Firebase SDK releases, so upgrade ",[407,3041,2914],{}," and the other FlutterFire packages together and rebuild.",[2992,3044,3046],{"id":3045},"do-i-need-to-switch-from-cocoapods-to-swift-package-manager","Do I need to switch from CocoaPods to Swift Package Manager?",[14,3048,3049],{},"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.",[2006,3051,3052],{},"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":531,"searchDepth":532,"depth":532,"links":3054},[3055,3056,3057,3058,3059,3060,3061,3062,3063],{"id":2591,"depth":532,"text":2592},{"id":2690,"depth":532,"text":2691},{"id":2724,"depth":532,"text":2725},{"id":2762,"depth":532,"text":2763},{"id":2908,"depth":532,"text":2909},{"id":2956,"depth":532,"text":2957},{"id":2972,"depth":532,"text":2973},{"id":2979,"depth":532,"text":2980},{"id":2989,"depth":532,"text":2990,"children":3064},[3065,3066,3067,3068,3069],{"id":2994,"depth":1787,"text":2995},{"id":3012,"depth":1787,"text":3013},{"id":3028,"depth":1787,"text":3029},{"id":3035,"depth":1787,"text":3036},{"id":3045,"depth":1787,"text":3046},"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":3073},{"text":3074,"minutes":3075,"time":3076,"words":3077},"6 min read",5.995,359700,1199,"\u002Fblog\u002Fflutter-ios-build-failed-after-upgrade-2026",{"title":2567,"description":3071},"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",[3085,3087,3090,3093],{"keyword":5,"url":616,"title":5,"relevance":3086},75,{"keyword":3088,"url":3089,"title":3088,"relevance":1811},"Best CRM for Social Media Marketing Agencies: implementation guide","https:\u002F\u002Fapp369.com\u002Fblog\u002Fbest-crm-for-social-media-marketing-agencies\u002F",{"keyword":3091,"url":3092,"title":3091,"relevance":1811},"How to Build a Social Media App in 2026","https:\u002F\u002Fapp369.com\u002Fblog\u002Fhow-to-build-social-media-app-2026\u002F",{"keyword":3094,"url":3095,"title":3094,"relevance":1805},"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",1792388767826]