Skip to content

Swift / SwiftUI — Checklist

OWNER: martijn, valentin ALSO_USED_BY: alexander (design integration) LAST_VERIFIED: 2026-03-26 GE_STACK_VERSION: Xcode 26 / iOS 26 SDK


Overview

Machine-parseable checklists for iOS development and App Store submission. Items grow organically — agents add items when they discover pitfalls. Items are NEVER removed — only marked DEPRECATED: {reason} if no longer applicable.


PRE-DEVELOPMENT CHECKLIST (project setup)

  • [ ] CHECK: Xcode version is 26 or later IF_SKIPPED: App Store rejection after April 28, 2026
  • [ ] CHECK: Swift strict concurrency is enabled (-strict-concurrency=complete) IF_SKIPPED: Data races go undetected until production crash
  • [ ] CHECK: Minimum deployment target is iOS 17 IF_SKIPPED: SwiftData unavailable, Liquid Glass degraded
  • [ ] CHECK: Dependencies use Swift Package Manager only — no CocoaPods, no Carthage IF_SKIPPED: Build system conflicts, CI pipeline breaks
  • [ ] CHECK: SwiftLint is configured with .swiftlint.yml at project root IF_SKIPPED: Inconsistent code style across agents
  • [ ] CHECK: Fastlane Match is configured for code signing IF_SKIPPED: Manual signing creates certificate conflicts
  • [ ] CHECK: GitHub Actions workflow exists for test + build + deploy IF_SKIPPED: No automated quality gate, manual uploads
  • [ ] CHECK: Project structure follows GE convention (App/, Features/, Core/, Resources/, Tests/) IF_SKIPPED: Files scattered, hard to navigate for other agents

PRE-COMMIT CHECKLIST (every code change)

  • [ ] CHECK: No ObservableObject or @Published in new code — use @Observable IF_SKIPPED: Legacy patterns, inconsistent state management
  • [ ] CHECK: All escaping closures use [weak self] IF_SKIPPED: Memory leaks and retain cycles
  • [ ] CHECK: All network calls go through APIClient — no direct URLSession in ViewModels IF_SKIPPED: Duplicated error handling, no retry logic, no auth injection
  • [ ] CHECK: No secrets (tokens, keys, passwords) in source code or UserDefaults IF_SKIPPED: Security breach, App Store rejection
  • [ ] CHECK: Every interactive UI element has an accessibility label IF_SKIPPED: VoiceOver broken, HIG non-compliant
  • [ ] CHECK: No fixed font sizes — use semantic text styles (.headline, .body, etc.) IF_SKIPPED: Dynamic Type broken for vision-impaired users
  • [ ] CHECK: .glassEffect() only on navigation/control elements, never on content IF_SKIPPED: Visual noise, violates Apple HIG for Liquid Glass
  • [ ] CHECK: No @unchecked Sendable — fix the actual concurrency issue IF_SKIPPED: Data race hidden from compiler, crashes in production
  • [ ] CHECK: No NavigationView — use NavigationStack IF_SKIPPED: Deprecated API, broken iPad navigation
  • [ ] CHECK: Services injected via protocol — not concrete types IF_SKIPPED: Untestable ViewModels
  • [ ] CHECK: Previews render without crashes for all new/modified views IF_SKIPPED: Development velocity drop, preview canvas unusable

PRE-TESTFLIGHT CHECKLIST (beta release)

  • [ ] CHECK: All unit tests pass IF_SKIPPED: Regressions shipped to testers
  • [ ] CHECK: Build number incremented (GitHub Actions run number) IF_SKIPPED: TestFlight rejects duplicate build numbers
  • [ ] CHECK: Tested on physical device (not just Simulator) IF_SKIPPED: Performance issues, Liquid Glass rendering differences, camera/AR bugs
  • [ ] CHECK: Memory Graph Debugger shows no leaks on main flows IF_SKIPPED: Memory climbs over time, OS kills the app
  • [ ] CHECK: Dark mode renders correctly IF_SKIPPED: Unreadable text, invisible elements
  • [ ] CHECK: Landscape orientation handled or locked to portrait IF_SKIPPED: Broken layouts on rotation
  • [ ] CHECK: Network error states tested (airplane mode, slow connection) IF_SKIPPED: App hangs or shows blank screens offline
  • [ ] CHECK: VoiceOver walkthrough of all primary flows IF_SKIPPED: Accessibility failures, HIG non-compliance

PRE-APP-STORE CHECKLIST (production submission)

  • [ ] CHECK: App name, subtitle, description, keywords complete in App Store Connect IF_SKIPPED: Metadata rejection
  • [ ] CHECK: Screenshots provided for required device sizes (6.5"/6.9" iPhone, 13" iPad) IF_SKIPPED: Submission blocked
  • [ ] CHECK: Privacy policy URL is publicly accessible and accurate IF_SKIPPED: Automatic rejection
  • [ ] CHECK: Support URL is live and reachable IF_SKIPPED: Rejection
  • [ ] CHECK: App Review notes include test account credentials (if auth required) IF_SKIPPED: Reviewer cannot test, rejection
  • [ ] CHECK: Age rating questionnaire completed IF_SKIPPED: Submission blocked
  • [ ] CHECK: All Info.plist privacy usage descriptions present (camera, photos, location, etc.) IF_SKIPPED: Automatic rejection during validation
  • [ ] CHECK: No private API usage IF_SKIPPED: Rejection during automated scan
  • [ ] CHECK: App does not crash on launch IF_SKIPPED: Immediate rejection
  • [ ] CHECK: automatic_release set to false — client approves release timing IF_SKIPPED: App goes live before client is ready
  • [ ] CHECK: Version number follows semantic versioning (X.Y.Z) IF_SKIPPED: Confusing version history
  • [ ] CHECK: Built with iOS 26 SDK (required from April 28, 2026) IF_SKIPPED: Submission rejected ADDED_FROM: apple-requirements-2026-04, SDK minimum bump

HIG COMPLIANCE CHECKLIST (Apple Human Interface Guidelines)

  • [ ] CHECK: Navigation follows iOS conventions (back button, swipe-to-go-back) IF_SKIPPED: Rejection for "non-standard UI"
  • [ ] CHECK: No custom alert/action sheet implementations that mimic system dialogs IF_SKIPPED: HIG violation, confuses users
  • [ ] CHECK: Tab bar has 3-5 items maximum IF_SKIPPED: Crowded navigation, HIG violation
  • [ ] CHECK: Icons use SF Symbols where possible IF_SKIPPED: Inconsistent visual language
  • [ ] CHECK: Launch screen matches initial app state (no blank white screen) IF_SKIPPED: Perceived slow launch
  • [ ] CHECK: Haptic feedback used sparingly and appropriately IF_SKIPPED: Annoying or missing tactile cues
  • [ ] CHECK: Liquid Glass usage follows Apple guidelines — navigation layer only IF_SKIPPED: Visual clutter, HIG non-compliance

Cross-References

READ_ALSO: wiki/docs/stack/swift-swiftui/index.md READ_ALSO: wiki/docs/stack/swift-swiftui/pitfalls.md READ_ALSO: wiki/docs/stack/swift-swiftui/distribution.md READ_ALSO: wiki/docs/stack/swift-swiftui/ui-patterns.md