AppDockStore deployment guides

This guide is reference only — AppDock does not automate Xcode, signing, or App Store Connect. Use the table of contents in your browser (long pages) and horizontal scroll for wide tables on small screens.

🍎 iOS App Store Deployment Checklist

Flutter / React Native / Native iOS — 2026 Edition

Last updated: April 2026 | Reflects Apple's latest SDK requirements (iOS 26 SDK mandatory from April 28, 2026)


Legend

TagMeaning
🔴 [BLOCKER]App will be rejected without this
🟠 [MANDATORY]Required by policy — may not cause immediate rejection but risks it
🟡 [RECOMMENDED]Best practice; impacts ratings, discoverability, or UX
🟢 [OPTIONAL]Nice to have

Phase 1 — Developer Account & Identity

1.1 Apple Developer Program

#ItemStatusSeverityField TypeLimits & ValidationMandatory?
1.1.1Apple Developer Program enrolled[ ]🔴 BLOCKERAccount enrollment$99/year. Individual or Organization. Card payment required.✅ Yes
1.1.2D-U-N-S Number (Org accounts only)[ ]🔴 BLOCKERText / registration9-digit number. Apply via Dun & Bradstreet. Takes 5–14 business days if new.✅ Yes (Org only)
1.1.3Two-Factor Authentication enabled[ ]🔴 BLOCKERAccount setting toggleMust be enabled on the Apple ID used for developer account.✅ Yes
1.1.4EU Digital Services Act (DSA) Trader Status[ ]🔴 BLOCKERForm in App Store ConnectRequired for EU App Store distribution. Text fields: business name, address, contact info.✅ Yes (EU)

1.2 App Identity

#ItemStatusSeverityField TypeLimits & ValidationMandatory?
1.2.1App Name (final)[ ]🔴 BLOCKERText inputMax 30 characters. No special characters that could cause confusion. Check trademark. Cannot use competitor names.✅ Yes
1.2.2Bundle ID (com.company.appname)[ ]🔴 BLOCKERText / reverse-domain stringReverse-domain format. Lowercase, dots, hyphens only. Cannot be changed after first submission. Must match Xcode project exactly.✅ Yes
1.2.3App ID registered in Apple Developer Portal[ ]🔴 BLOCKERPortal registrationMust match Bundle ID exactly. Created under Certificates, IDs & Profiles.✅ Yes
1.2.4Primary App Category[ ]🔴 BLOCKERDropdown selectSingle selection from Apple's category list. Affects discoverability and age rating assessment.✅ Yes
1.2.5Secondary App Category[ ]🟢 OPTIONALDropdown selectOptional second category. Separate from primary.No
1.2.6Age Rating (Content Questionnaire)[ ]🔴 BLOCKERMulti-question formMust answer all questions honestly (violence, adult content, gambling, etc.). Generates rating automatically (4+, 9+, 12+, 17+).✅ Yes
1.2.7Updated Age Rating Questions (2026)[ ]🔴 BLOCKERMulti-question formApple updated age rating questions in 2025/2026. Must respond by Jan 31, 2026 for existing apps (or before any update submission).✅ Yes

Phase 2 — Technical Build Requirements

2.1 Xcode & SDK Requirements (Critical 2026 Updates)

#ItemStatusSeverityField TypeLimits & ValidationMandatory?
2.1.1Built with Xcode 26 (or latest stable)[ ]🔴 BLOCKERBuild toolFrom April 28, 2026: must use iOS 26 SDK or later. Old Xcode = automatic rejection. macOS only.✅ Yes
2.1.2iOS 26 SDK targeted (from April 28, 2026)[ ]🔴 BLOCKERIPHONEOS_DEPLOYMENT_TARGETMinimum: iOS 26 SDK for new submissions after April 28, 2026. Check Apple's upcoming requirements page for exact date.✅ Yes
2.1.3Deployment Target set (min supported iOS)[ ]🟠 MANDATORYXcode project settingShould support last 2 major iOS versions. Example: iOS 17+ acceptable currently. Cannot be lower than what Apple deems obsolete.✅ Yes
2.1.464-bit architecture support[ ]🔴 BLOCKERBuild settingARM64 required. Flutter handles this automatically. No 32-bit.✅ Yes
2.1.5IPv6 network compatibility[ ]🟠 MANDATORYCode/network layerApple tests on IPv6-only networks. Must not use IPv4-only calls. Standard URLSession is fine.✅ Yes
2.1.6No private / undocumented API usage[ ]🔴 BLOCKERBinary scan (automated by Apple)Apple scans binary automatically. Flutter plugins can sometimes include private APIs — audit carefully.✅ Yes
2.1.7App does not crash on launch[ ]🔴 BLOCKERQA testingTest cold start on minimum 3 real devices including oldest supported iOS version.✅ Yes

2.2 Signing & Certificates

#ItemStatusSeverityField TypeLimits & ValidationMandatory?
2.2.1App Store Distribution Certificate (.p12)[ ]🔴 BLOCKERFile upload (Keychain/Xcode).p12 file with password. Has expiry date — typically 1 year. Must be re-generated if expired.✅ Yes
2.2.2App Store Distribution Provisioning Profile[ ]🔴 BLOCKERFile / Xcode managedTied to App ID + Certificate. Must be "App Store Distribution" type (not Development/Ad Hoc).✅ Yes
2.2.3Automatic Signing configured in Xcode[ ]🟠 MANDATORYXcode project settingXcode can manage automatically if Apple Developer account is connected. Preferred for simplicity.✅ Yes
2.2.4All Capability Entitlements configured[ ]🟠 MANDATORYXcode Capabilities tab + PortalPush Notifications, iCloud, Sign in with Apple, Background Modes — each needs entitlement registered in Portal AND Xcode.✅ Yes

2.3 Info.plist & Permissions

#ItemStatusSeverityField TypeLimits & ValidationMandatory?
2.3.1NSCameraUsageDescription[ ]🔴 BLOCKERString in Info.plistRequired if app accesses camera. Text must clearly explain why. Vague = rejection. Max ~200 chars recommended.Conditional
2.3.2NSMicrophoneUsageDescription[ ]🔴 BLOCKERString in Info.plistRequired if app accesses microphone. Clear purpose statement.Conditional
2.3.3NSLocationWhenInUseUsageDescription[ ]🔴 BLOCKERString in Info.plistRequired for foreground location access.Conditional
2.3.4NSLocationAlwaysAndWhenInUseUsageDescription[ ]🔴 BLOCKERString in Info.plistRequired for background location. Background location needs strong justification.Conditional
2.3.5NSPhotoLibraryUsageDescription[ ]🔴 BLOCKERString in Info.plistFor reading photo library.Conditional
2.3.6NSPhotoLibraryAddUsageDescription[ ]🔴 BLOCKERString in Info.plistFor saving to photo library (separate from reading).Conditional
2.3.7NSContactsUsageDescription[ ]🔴 BLOCKERString in Info.plistRequired for contacts access.Conditional
2.3.8NSFaceIDUsageDescription[ ]🔴 BLOCKERString in Info.plistRequired if app uses Face ID / biometric.Conditional
2.3.9NSUserTrackingUsageDescription[ ]🔴 BLOCKERString in Info.plistRequired if app uses ATT (App Tracking Transparency). Must explain tracking purpose clearly.Conditional
2.3.10NSHealthShareUsageDescription[ ]🔴 BLOCKERString in Info.plistRequired for HealthKit read access.Conditional
2.3.11NSHealthUpdateUsageDescription[ ]🔴 BLOCKERString in Info.plistRequired for HealthKit write access.Conditional
2.3.12NSCalendarsUsageDescription[ ]🔴 BLOCKERString in Info.plistRequired for calendar access.Conditional
2.3.13NSBluetoothAlwaysUsageDescription[ ]🔴 BLOCKERString in Info.plistRequired for Bluetooth.Conditional
2.3.14All unused permission keys removed[ ]🟠 MANDATORYInfo.plist auditIncluding a permission string for a feature you don't use = rejection. Audit and remove all unused keys.✅ Yes
2.3.15Background Modes justified[ ]🟠 MANDATORYXcode CapabilitiesBackground fetch, audio, location, VoIP — each requires clear business justification in review notes.Conditional

2.4 Versioning

#ItemStatusSeverityField TypeLimits & ValidationMandatory?
2.4.1CFBundleShortVersionString (version)[ ]🔴 BLOCKERString in Info.plistUser-visible version. Format: 1.0.0. Must match App Store Connect version field.✅ Yes
2.4.2CFBundleVersion (build number)[ ]🔴 BLOCKERString in Info.plistInteger or dotted integer. Must increment with EVERY upload to TestFlight or App Store. Cannot reuse build numbers.✅ Yes
2.4.3pubspec.yaml version matches (Flutter)[ ]🔴 BLOCKERversion: 1.0.0+1 in pubspecThe +1 is the build number. Must match CFBundleVersion.✅ Yes (Flutter)

2.5 Flutter-Specific Requirements

#ItemStatusSeverityField TypeLimits & ValidationMandatory?
2.5.1flutter_launcher_icons package configured[ ]🟠 MANDATORYpubspec.yaml config + run commandRun flutter pub run flutter_launcher_icons before every release build. All icon sizes generated.✅ Yes
2.5.2flutter_native_splash configured[ ]🟡 RECOMMENDEDpubspec.yaml configConsistent launch screen. Required behavior: no black flash on startup.Recommended
2.5.3Production Flutter flavor/scheme set up[ ]🟡 RECOMMENDEDBuild configurationSeparate prod flavor with prod API base URLs, Firebase project, RevenueCat keys.Recommended
2.5.4flutter build ipa --release tested[ ]🔴 BLOCKERCLI commandTest the actual release IPA. Debug builds behave very differently. Verify on TestFlight before App Store.✅ Yes
2.5.5Flutter obfuscation configured[ ]🟡 RECOMMENDED--obfuscate --split-debug-info=<dir>Hardens binary against reverse engineering. Keep debug symbols for crash symbolication.Recommended
2.5.6Platform channels tested on release build[ ]🟠 MANDATORYQANative method channels can behave differently in release mode (especially method not found errors).✅ Yes
2.5.7All dependencies on stable channel[ ]🟡 RECOMMENDEDpubspec.yamlAvoid pre-release packages in production builds.Recommended
2.5.8RevenueCat / StoreKit integration tested (if subscriptions)[ ]🔴 BLOCKERSDK integrationFull purchase → receipt → entitlement unlock flow tested in sandbox.Conditional

2.6 Launch Screen

#ItemStatusSeverityField TypeLimits & ValidationMandatory?
2.6.1LaunchScreen.storyboard configured[ ]🔴 BLOCKERXcode storyboard / Flutter splashMust exist. Cannot be missing. Cannot be all-black. Should match app branding.✅ Yes
2.6.2No text or logos on launch screen (Apple preference)[ ]🟡 RECOMMENDEDDesign guidelineApple recommends launch screen matches first screen of app. Logos/text technically allowed but not preferred.Recommended

Phase 3 — Store Listing Assets

3.1 App Icons

#ItemStatusSeverityDimensionsFile SpecsMandatory?
3.1.1App Store icon (1024×1024)[ ]🔴 BLOCKER1024 × 1024 pxPNG, no alpha/transparency, no rounded corners (Apple applies mask), no interlacing. Max 500KB recommended.✅ Yes
3.1.2All in-app icon sizes generated[ ]🔴 BLOCKERVarious (20, 29, 40, 58, 60, 76, 80, 87, 120, 152, 167, 180 px)Use flutter_launcher_icons or Xcode Asset Catalog. All sizes required.✅ Yes

3.2 Screenshots

#ItemStatusSeverityDimensionsFile SpecsMandatory?
3.2.1iPhone 6.9" screenshots (iPhone 16 Pro Max)[ ]🔴 BLOCKER1320 × 2868 pxJPEG or PNG. Required as of 2024 — this is now the primary screenshot slot.✅ Yes
3.2.2iPhone 6.5" screenshots (iPhone 14 Plus/Pro Max)[ ]🟡 RECOMMENDED1284 × 2778 pxShown on older iPhones if 6.9" not set separately.Recommended
3.2.3iPhone 5.5" screenshots[ ]🟢 OPTIONAL1242 × 2208 pxFor older device compatibility.No
3.2.4iPad Pro 12.9" screenshots (6th gen)[ ]🔴 BLOCKER (if iPad)2048 × 2732 pxRequired if app supports iPad.✅ Yes (iPad)
3.2.5iPad Pro 11" screenshots[ ]🟢 OPTIONAL1668 × 2388 pxOptional additional iPad size.No
3.2.6Apple Watch screenshots[ ]🟢 OPTIONALVariousRequired only if app has a watchOS extension.Conditional
3.2.7Minimum 2, maximum 10 screenshots per slot[ ]🔴 BLOCKERMust have at least 2 screenshots. Max 10 per device size.✅ Yes

Screenshot Content Rules:

  • Must show actual app functionality (no mockups of features that don't exist)
  • No pricing information in screenshots (Apple policy)
  • No UI from a different OS (no Android UI elements)
  • No misleading imagery or unsubstantiated claims
  • Text overlays allowed but Apple reviewers check accuracy

3.3 App Preview Video

#ItemStatusSeveritySpecsNotesMandatory?
3.3.1App Preview video[ ]🟢 OPTIONAL15–30 seconds, MP4/MOV, recorded at device resolutionMust show actual app use — no voiceover marketing. Must be recorded on device or simulator.No
3.3.2Video resolution matches screenshot slot[ ]🟠 MANDATORY (if video)Must match device size6.9" preview: 886×1920 or 1290×2796.Conditional

3.4 Text Metadata

#ItemStatusSeverityCharacter LimitNotesMandatory?
3.4.1App Name[ ]🔴 BLOCKERMax 30 charsShown under icon in store. Include primary keyword naturally. No ALL CAPS. No misleading keywords.✅ Yes
3.4.2Subtitle[ ]🟠 MANDATORYMax 30 charsShown in search results under name. Increases keyword surface area. High value field.Recommended
3.4.3Description[ ]🔴 BLOCKERMax 4000 charsFirst 3 lines visible before "More". Most critical copy. No HTML supported. Cannot mention Android/Google Play. Must match actual app functionality.✅ Yes
3.4.4Promotional Text[ ]🟢 OPTIONALMax 170 charsShown above description. Can be updated without a new app review. Use for time-sensitive messaging.No
3.4.5Keywords[ ]🟠 MANDATORYMax 100 chars totalComma-separated. No spaces after commas. Do not repeat words already in title/subtitle. Do not use competitor names. Do not use trademarked terms you don't own.✅ Yes
3.4.6Support URL[ ]🔴 BLOCKERValid URLMust be a working, live URL. Not a placeholder. Apple reviewers check this.✅ Yes
3.4.7Marketing URL[ ]🟢 OPTIONALValid URLOptional app website or landing page.No
3.4.8Privacy Policy URL[ ]🔴 BLOCKERValid URLRequired for ALL apps. Must be a live web page (not PDF). Must accurately describe data practices.✅ Yes
3.4.9What's New (Release Notes)[ ]🟠 MANDATORYMax 4000 charsRequired for every update submission. Describe changes clearly.✅ Yes (updates)
3.4.10Version Number[ ]🔴 BLOCKERe.g. 1.0.0Must match CFBundleShortVersionString in binary.✅ Yes
3.4.11Copyright[ ]🟠 MANDATORYTextFormat: © 2026 Company Name. Shown on store listing.✅ Yes
3.4.12Review Notes for Apple Reviewer[ ]🟡 RECOMMENDEDUp to 4000 charsProvide demo account credentials, explain non-obvious features, note any restricted features. Highly recommended to avoid rejection.Recommended
3.4.13Demo Account (login credentials)[ ]🔴 BLOCKER (if login required)TextIf app requires login, must provide working reviewer credentials. Account must have full feature access. No "demo" restricted accounts.Conditional

Phase 4 — Legal & Compliance

4.1 Privacy Policy

#ItemStatusSeverityNotesMandatory?
4.1.1Privacy policy hosted at live URL[ ]🔴 BLOCKERWeb page, not PDF. Must be accessible at time of review.✅ Yes
4.1.2All data types collected listed[ ]🔴 BLOCKERName, email, device ID, location, usage data, etc. Must be comprehensive.✅ Yes
4.1.3Third-party SDKs disclosed[ ]🟠 MANDATORYFirebase, RevenueCat, analytics SDKs — all data practices disclosed.✅ Yes
4.1.4Data sharing disclosed[ ]🟠 MANDATORYWho data is shared with and why.✅ Yes
4.1.5Data retention period stated[ ]🟠 MANDATORYHow long data is kept.✅ Yes
4.1.6User rights stated (GDPR/CCPA)[ ]🟠 MANDATORYRight to access, delete, correct, export data.✅ Yes
4.1.7AI/external AI service disclosure (2026 new)[ ]🔴 BLOCKERNew 2026 requirement. If app uses external AI services (OpenAI, Claude, Gemini, etc.), must disclose this in privacy policy AND get user consent before sending data.✅ Yes (if AI)

4.2 App Privacy Nutrition Labels (App Store Connect)

#ItemStatusSeverityInput TypeNotesMandatory?
4.2.1App Privacy section completed[ ]🔴 BLOCKERMulti-step form in App Store ConnectUnder App → App Privacy. Must be completed before submitting for review.✅ Yes
4.2.2"Data Used to Track You" declared[ ]🔴 BLOCKERCheckbox listAny cross-app or cross-website tracking must be listed.✅ Yes
4.2.3"Data Linked to You" declared[ ]🔴 BLOCKERCheckbox listAll data tied to user identity must be disclosed.✅ Yes
4.2.4"Data Not Linked to You" declared[ ]🔴 BLOCKERCheckbox listAnalytics or crash data not tied to identity.✅ Yes
4.2.5Labels match actual app behavior[ ]🔴 BLOCKERCross-check with codeApple verifies. Inconsistency = rejection and possible removal.✅ Yes
4.2.6Third-party SDK data practices included[ ]🟠 MANDATORYCheckbox listYou are responsible for disclosing data collected by ALL SDKs in your app, not just your own code.✅ Yes

4.3 App Tracking Transparency (ATT)

#ItemStatusSeverityNotesMandatory?
4.3.1ATT prompt implemented (if tracking)[ ]🔴 BLOCKERAppTrackingTransparency framework. iOS 14.5+. Must be called before any IDFA access.Conditional
4.3.2NSUserTrackingUsageDescription in Info.plist[ ]🔴 BLOCKERClear purpose string. Cannot be vague ("for better ad experience").Conditional
4.3.3AI service data consent (2026)[ ]🔴 BLOCKERNew 2026: Must get user consent before sending personal data to third-party AI services.✅ Yes (if AI)

4.4 Account Deletion

#ItemStatusSeverityNotesMandatory?
4.4.1In-app account deletion flow[ ]🔴 BLOCKERRequired since June 2022. Must be in-app — not "email us to delete." Must delete account + data.✅ Yes (if accounts)
4.4.2Account deletion deletes associated data[ ]🔴 BLOCKERData must be purged from backend. Link to App Store subscription cancellation if subscriptions exist.✅ Yes (if accounts)

4.5 Sign in with Apple

#ItemStatusSeverityNotesMandatory?
4.5.1Sign in with Apple offered[ ]🔴 BLOCKERRequired if app offers any other third-party login (Google, Facebook, Twitter, etc.). Must be equally prominent.Conditional
4.5.2Sign in with Apple entitlement added[ ]🔴 BLOCKERAdded in Xcode Capabilities + Apple Developer Portal.Conditional

4.6 Legal Compliance

#ItemStatusSeverityNotesMandatory?
4.6.1GDPR compliance (EU users)[ ]🟠 MANDATORYConsent management, data subject rights, DPA contact info.✅ Yes
4.6.2COPPA compliance (under-13 users)[ ]🔴 BLOCKERIf app targets or may be used by children. No behavioral advertising. Limited data collection.Conditional
4.6.3Kids Category compliance[ ]🔴 BLOCKERIf in Kids category — no third-party analytics, no external links, no behavioral ads.Conditional
4.6.4Declared Age Range API (iOS 26+)[ ]🟡 RECOMMENDEDNew in iOS 26. Lets app access user's declared age range for age-appropriate experiences without collecting birthdate.Recommended
4.6.5Export compliance answered[ ]🔴 BLOCKERStandard HTTPS/TLS encryption = select "Exempt." Apps with additional encryption must complete BIS export form.✅ Yes
4.6.6Content rights — original content confirmed[ ]🟠 MANDATORYYou own or have rights to all content in the app. Checked in App Store Connect.✅ Yes
4.6.7Terms of Service / EULA in-app[ ]🟠 MANDATORY (if ToS)User must affirmatively accept before using. Not pre-checked.Conditional

Phase 5 — Monetization Setup (If Applicable)

5.1 Apple In-App Purchases

#ItemStatusSeverityField TypeLimits & ValidationMandatory?
5.1.1IAP products created in App Store Connect[ ]🔴 BLOCKERForm in App Store Connect → In-App PurchasesProduct ID, Reference Name, Type (consumable/non-consumable/subscription), Price Tier, Localized display name + description.✅ Yes (if IAP)
5.1.2Product IDs match app code exactly[ ]🔴 BLOCKERText stringCase-sensitive. Must match string in code 100%. Cannot be changed after creation. Max 255 chars, alphanumeric + . + - + _.✅ Yes (if IAP)
5.1.3IAP reviewer screenshot submitted[ ]🔴 BLOCKERImage upload in App Store ConnectApple requires screenshot showing how IAP is presented to users. PNG/JPEG.✅ Yes (if IAP)
5.1.4IAP review notes[ ]🟡 RECOMMENDEDText fieldExplain what the purchase unlocks if not obvious from screenshot.Recommended
5.1.5StoreKit 2 integrated (or RevenueCat)[ ]🟠 MANDATORYSDKStoreKit 2 preferred for iOS 16+. Test with Xcode StoreKit Testing config or Sandbox.✅ Yes (if IAP)
5.1.6Sandbox test account created[ ]🟠 MANDATORYApp Store Connect → Sandbox TestersFor testing IAP on real device without real charges. Different Apple ID from main account.✅ Yes (if IAP)
5.1.7Restore Purchases button implemented[ ]🟠 MANDATORYUI button in appRequired by App Store guidelines for non-consumables and subscriptions. Must be visible/accessible.✅ Yes (if IAP)

5.2 Subscriptions

#ItemStatusSeverityField TypeLimits & ValidationMandatory?
5.2.1Subscription group created[ ]🔴 BLOCKERApp Store Connect formRequired for upgrade/downgrade flows. All subscription tiers must be in the same group.✅ Yes (if sub)
5.2.2Free trial period configured (if offered)[ ]🟠 MANDATORYDropdown in App Store ConnectDuration options: 3 days, 1 week, 2 weeks, 1 month, 2 months, 3 months, 6 months, 1 year.Conditional
5.2.3Subscription terms shown in-app before purchase[ ]🔴 BLOCKERUI designGuideline 3.1.2: Price, duration, auto-renewal terms must be shown to user BEFORE purchase confirmation. No exceptions.✅ Yes (if sub)
5.2.4Cancellation instructions accessible in-app[ ]🟠 MANDATORYSettings / help sectionLink to App Store subscription management OR clear instructions.✅ Yes (if sub)
5.2.5Subscription status checked on app launch[ ]🟠 MANDATORYCode logicCheck current entitlement via StoreKit/RevenueCat on every app launch. Don't cache indefinitely.✅ Yes (if sub)
5.2.6Billing grace period enabled[ ]🟡 RECOMMENDEDApp Store Connect toggleKeeps user access during failed payment retry window. Good UX.Recommended
5.2.7Tax information submitted in App Store Connect[ ]🟠 MANDATORYTax formsRequired before any paid sales. Varies by country — complete for all regions you sell in.✅ Yes (if paid)
5.2.8Bank account / payout details added[ ]🟠 MANDATORYApp Store Connect → Agreements, Tax, BankingRequired to receive revenue. Can take 3–5 business days to verify.✅ Yes (if paid)

5.3 Pricing

#ItemStatusSeverityField TypeNotesMandatory?
5.3.1App base price set[ ]🟠 MANDATORY (if paid)Dropdown — price tierSelect from Apple's price tier system. Automatically converts to local currencies.Conditional
5.3.2Price by region reviewed[ ]🟡 RECOMMENDEDPer-country overridePurchasing power varies. Consider lower tiers for emerging markets.Recommended
5.3.3Apple's 15–30% commission factored in[ ]🟡 RECOMMENDEDFinancial planning30% standard. 15% for Small Business Program (< $1M/year). 15% after 1 year continuous subscription.Recommended

Phase 6 — Testing & QA Gates

6.1 Functional Testing

#ItemStatusSeverityNotesMandatory?
6.1.1App launches without crash (cold start)[ ]🔴 BLOCKERTest on minimum 3 real devices. Apple reviewer will test this first.✅ Yes
6.1.2Core user flows work end-to-end[ ]🔴 BLOCKERAll main screens and happy paths.✅ Yes
6.1.3Offline/no network handling[ ]🟠 MANDATORYNo unhandled exceptions. Clear error messages.✅ Yes
6.1.4Permission denial handled gracefully[ ]🟠 MANDATORYApp must not crash if user denies any permission. Show appropriate fallback UI.✅ Yes
6.1.5Background / foreground transitions[ ]🟠 MANDATORYApp must not lose state or crash when backgrounded and reopened.✅ Yes
6.1.6Push notifications tested[ ]🟠 MANDATORY (if used)Both foreground and background states. Test on real device — not simulator.Conditional
6.1.7Deep links tested[ ]🟠 MANDATORY (if used)Test from browser, iMessage, email. Test universal links AND custom URL schemes.Conditional
6.1.8Logout / login cycle[ ]🟠 MANDATORY (if auth)All state and cached data cleared properly on logout.Conditional
6.1.9Account deletion flow tested[ ]🔴 BLOCKER (if accounts)Full flow: in-app delete → backend data purge → confirmation.Conditional
6.1.10IAP full purchase flow in sandbox[ ]🔴 BLOCKER (if IAP)Purchase → receipt → entitlement unlock → restore flow.Conditional
6.1.11In-app review prompt does NOT appear on first launch[ ]🟠 MANDATORYGuideline: prompt after meaningful user action, not on launch.Conditional

6.2 Device & iOS Version Coverage

#ItemStatusSeverityNotesMandatory?
6.2.1Tested on latest iPhone (iPhone 16 / Dynamic Island)[ ]🟠 MANDATORYDynamic Island, rounded corners, notch cutout.✅ Yes
6.2.2Tested on iPhone SE (small screen 4.7")[ ]🟡 RECOMMENDEDCommon source of layout overflow issues.Recommended
6.2.3Tested on minimum iOS deployment target[ ]🟠 MANDATORYReal device preferred. Catch API availability issues.✅ Yes
6.2.4Tested on latest iOS release[ ]🟠 MANDATORYApple reviewers run latest iOS.✅ Yes
6.2.5Tested on iPad (if iPad supported)[ ]🟠 MANDATORYiPad multitasking, split view, Stage Manager.Conditional
6.2.6Dark mode tested[ ]🟡 RECOMMENDEDApp should not look broken in dark mode.Recommended
6.2.7Dynamic Text / Accessibility sizes tested[ ]🟡 RECOMMENDEDText should not clip or overflow at large sizes.Recommended

6.3 Performance

#ItemStatusSeverityNotesMandatory?
6.3.1App startup time under 3 seconds[ ]🟡 RECOMMENDEDMeasure cold start on real device. Over 3s risks abandonment and review concerns.Recommended
6.3.2Memory leaks checked[ ]🟡 RECOMMENDEDUse Xcode Instruments → Leaks, Allocations.Recommended
6.3.360fps scrolling / animations[ ]🟡 RECOMMENDEDCheck with Xcode Core Animation instrument.Recommended
6.3.4Release build performance profiled[ ]🟠 MANDATORYAlways profile release build — debug builds are significantly slower.✅ Yes
6.3.5App size optimized[ ]🟡 RECOMMENDEDFlutter: use --split-debug-info. Aim under 50MB download size (100MB max limit for cellular download).Recommended

6.4 Security

#ItemStatusSeverityNotesMandatory?
6.4.1API keys not hardcoded in app binary[ ]🔴 BLOCKERUse environment variables, remote config, or backend proxy. Reviewers and bad actors can inspect binaries.✅ Yes
6.4.2HTTPS enforced for all network calls[ ]🟠 MANDATORYATS (App Transport Security) enforced by default on iOS. Do not disable NSAllowsArbitraryLoads without justification.✅ Yes
6.4.3Auth tokens stored in Keychain[ ]🟠 MANDATORYUse flutter_secure_storage (wraps Keychain). Not UserDefaults or shared preferences.✅ Yes (if auth)
6.4.4Sensitive data not logged in release[ ]🟠 MANDATORYRemove all print() / debugPrint() that output PII or tokens.✅ Yes
6.4.5Certificate pinning considered[ ]🟢 OPTIONALFor high-security apps (banking, health). Adds complexity but valuable.No

6.5 TestFlight

#ItemStatusSeverityNotesMandatory?
6.5.1Internal TestFlight testing completed[ ]🟠 MANDATORYUpload to TestFlight, test with dev team before submitting to App Store.✅ Yes
6.5.2External TestFlight beta (optional)[ ]🟡 RECOMMENDEDUp to 10,000 external testers. Requires beta review by Apple (usually < 24h).Recommended
6.5.3All TestFlight feedback addressed[ ]🟡 RECOMMENDEDAt least 1 full beta cycle before submitting for App Store review.Recommended
6.5.4Crashlytics / Sentry monitoring active in TestFlight[ ]🟠 MANDATORYKnow about crashes before app goes live.✅ Yes
6.5.5APNs new server certificate updated (if push)[ ]🔴 BLOCKERApple updated APNs server certificate in Feb 2025. Trust Store must include new SHA-2 Root: USERTrust RSA CA.Conditional

Phase 7 — Submission & Review

7.1 App Store Connect — Pre-Submission Checklist

#ItemStatusSeverityNotesMandatory?
7.1.1Binary uploaded via Xcode or Transporter[ ]🔴 BLOCKERmacOS only. Cannot be done on Windows/Linux without CI (Codemagic, Bitrise, GitHub Actions).✅ Yes
7.1.2All metadata fields completed[ ]🔴 BLOCKERName, description, screenshots, keywords, URLs, privacy policy all filled.✅ Yes
7.1.3Age rating questionnaire completed[ ]🔴 BLOCKERIncluding updated 2026 questions.✅ Yes
7.1.4App Privacy nutrition label completed[ ]🔴 BLOCKERAll data types, tracking, linked/unlinked to identity.✅ Yes
7.1.5Export compliance declared[ ]🔴 BLOCKERHTTPS = Exempt. Custom encryption = declare.✅ Yes
7.1.6Content rights declared[ ]🟠 MANDATORY"Do you own all rights to this content?"✅ Yes
7.1.7IDFA/Advertising Identifier usage declared[ ]🟠 MANDATORYEven if only "serving ads" — must be checked.✅ Yes
7.1.8Review notes + demo credentials added[ ]🟡 RECOMMENDEDDramatically reduces rejection risk for apps requiring login.Recommended
7.1.9Phased Release configured[ ]🟡 RECOMMENDED7-day phased release: 1%→2%→5%→10%→20%→50%→100%. Can pause at any time if crash spike detected.Recommended
7.1.10Additional submission while prior in progress[ ]🟢 OPTIONALNew 2026: Apple now allows submitting additional items while another submission is in review.No

7.2 Review Timeline

PhaseTypical Duration
Automated binary checksMinutes
App Review queue24–72 hours (most apps)
New developer account first submissionMay take up to 7 days
After rejection + resubmissionClock restarts
TestFlight external beta review< 24 hours usually

7.3 Common Rejection Reasons (2026)

#ReasonHow to Avoid
R1App crashes during reviewThorough TestFlight testing. Test on oldest supported iOS.
R2Broken Support URL or Privacy Policy URLCheck all URLs load correctly before submission.
R3Screenshots don't match actual appScreenshots must show real app UI, not design mockups.
R4Missing NSXxxUsageDescription for permissionsAudit Info.plist — every permission key needs a string.
R5Sign in with Apple missing when other social login presentImplement SIWA before submitting if Google/Facebook login exists.
R6Subscription terms not clearly disclosedShow price + duration + auto-renewal before purchase confirmation.
R7IAP not explained to reviewerAdd reviewer screenshot + notes explaining what purchase unlocks.
R8Login credentials not providedAlways include demo account in reviewer notes for login-required apps.
R9App offers insufficient value / "thin" appEnsure meaningful functionality beyond a simple web view.
R10Metadata mentions Android / Google PlayNever mention competing platforms in description, screenshots, or keywords.
R11Private API detectedRun binary analysis. Audit all third-party plugins.
R12AI data collection not disclosed or consentedNew 2026: disclose AI services and get consent.
R13Age rating questions not updatedComplete the new 2026 age rating questionnaire before submitting.

Phase 8 — Post-Launch

8.1 Monitoring

#ItemStatusSeverityNotesMandatory?
8.1.1Crashlytics / Sentry live and receiving events[ ]🟠 MANDATORYMonitor from day 1. Set up crash rate alerts.✅ Yes
8.1.2App Store Connect Analytics reviewed[ ]🟡 RECOMMENDEDImpressions, conversions, sessions, retention. Review within first week.Recommended
8.1.3Crash-free rate target set[ ]🟡 RECOMMENDEDTarget: >99.5% crash-free sessions. Apple badges/features apps with high quality metrics.Recommended

8.2 Support Infrastructure

#ItemStatusSeverityNotesMandatory?
8.2.1Support email actively monitored[ ]🟠 MANDATORYListed on App Store. Apple may also email here during review.✅ Yes
8.2.2Support URL live and functional[ ]🟠 MANDATORYMust remain live. App can be removed if support URL goes dead.✅ Yes
8.2.3In-app review prompt implemented[ ]🟡 RECOMMENDEDin_app_review Flutter package. Prompt after positive action — not on launch.Recommended
8.2.4Respond to App Store reviews[ ]🟡 RECOMMENDEDEspecially negative reviews. Shows engagement. Cannot offer incentives for positive reviews.Recommended

8.3 Legal Ongoing

#ItemStatusSeverityNotesMandatory?
8.3.1Privacy policy kept up to date[ ]🟠 MANDATORYUpdate any time data practices change.✅ Yes
8.3.2GDPR data deletion requests handled[ ]🟠 MANDATORYProcess within 30 days of request.✅ Yes
8.3.3Apple Developer Program renewed annually[ ]🔴 BLOCKERNon-renewal = app removed from App Store.✅ Yes
8.3.4Distribution certificate renewed before expiry[ ]🔴 BLOCKERExpires ~1 year. Create new one and update provisioning profiles before submitting updates.✅ Yes

8.4 Update Cadence

#ItemStatusSeverityNotesMandatory?
8.4.1Version numbering strategy defined[ ]🟠 MANDATORYSemantic versioning: major.minor.patch. Build number must always increment.✅ Yes
8.4.2SDK requirement deadline tracked (April 28, 2026)[ ]🔴 BLOCKERAll app updates submitted after April 28, 2026 must use iOS 26 SDK.✅ Yes
8.4.3Forced update mechanism (if needed)[ ]🟢 OPTIONALFirebase Remote Config can enforce minimum app version for breaking API changes.No

Quick Summary — Top 10 iOS Blockers in 2026

1.  Build with Xcode 26 + iOS 26 SDK (mandatory from April 28, 2026)
2.  Complete App Privacy Nutrition Labels accurately
3.  NSXxxUsageDescription for EVERY permission key used
4.  Sign in with Apple if any third-party login exists
5.  Subscription terms shown BEFORE purchase confirmation
6.  In-app account deletion (required since 2022)
7.  Demo account credentials in reviewer notes
8.  Screenshots match actual app UI (1320×2868 px for 6.9" slot)
9.  AI service usage disclosed + user consent obtained (new 2026)
10. Updated age rating questionnaire completed (new 2026 questions)

Reference sources: Apple Developer Documentation, Apple App Store Review Guidelines, Apple Upcoming Requirements page, Apple Developer News — April 2026