Special Year-End Offer: AI Review Toolkit $29.99 $49.99 Get it now →

iOS Submission Guide

Native iOS Updated December 2025

Swift & SwiftUI App Store Submission Guide 2025

The complete guide to submitting your native Swift or SwiftUI app to the App Store. From Xcode configuration to App Store Connect, learn how to avoid common pitfalls and get approved on the first try.

How Long Does Swift App Submission Take?

The technical submission process (archive, upload, processing) takes about 30-60 minutes. App Store review typically takes 24-48 hours. Most native Swift apps have fewer review issues than cross-platform apps because they naturally follow Apple's design patterns.

Native apps using SwiftUI have higher approval rates due to built-in HIG compliance

Submission Overview

Prerequisites

  • Apple Developer Account ($99/year)
  • Xcode 15+ (latest recommended)
  • macOS Sonoma or later
  • App registered in App Store Connect
  • Valid Distribution Certificate
  • App Store Provisioning Profile
  • App icons (all sizes)
  • Screenshots for all device sizes

1. Configure Xcode Project

Set bundle ID, version, build number, deployment target, and capabilities.

2. Set Up Signing

Configure automatic signing or manual provisioning profiles.

3. Create App Store Connect Record

Register your app, add metadata, screenshots, and pricing.

4. Archive & Upload

Build archive in Xcode and upload via Xcode or Transporter.

5. Submit for Review

Select build, complete review information, and submit.

Xcode Project Setup

General Settings

In Xcode, select your target → General tab:

Bundle Identifier: com.yourcompany.appname
Version: 1.0.0 (marketing version)
Build: 1 (increment for each upload)
Minimum Deployments: iOS 16.0+ (recommended)
Device Orientation: Select supported orientations
App Icons Source: AppIcon (asset catalog)

Info.plist Configuration

Essential keys for App Store submission:

<key>CFBundleDisplayName</key>
<string>Your App Name</string>

<!-- Privacy usage descriptions (required if used) -->
<key>NSCameraUsageDescription</key>
<string>We need camera access to scan documents</string>

<key>NSPhotoLibraryUsageDescription</key>
<string>We need photo access to save images</string>

<key>NSLocationWhenInUseUsageDescription</key>
<string>We need location to show nearby stores</string>

<!-- Required for networking -->
<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
</dict>

Important: Every permission your app requests MUST have a usage description explaining why. Vague descriptions like "for app functionality" will be rejected.

Build Settings

Build Active Architecture Only No (Release)
Enable Bitcode Yes (deprecated in Xcode 14+)
Swift Language Version Swift 5 or later
Debug Information Format DWARF with dSYM File

Signing & Provisioning

Automatic Signing (Recommended)

  1. 1 Select target → Signing & Capabilities
  2. 2 Check "Automatically manage signing"
  3. 3 Select your Team (Apple Developer account)
  4. 4 Xcode creates certificates and profiles automatically

Manual Signing

  1. 1 Create Distribution Certificate in Developer Portal
  2. 2 Create App Store Provisioning Profile
  3. 3 Download and install both in Keychain/Xcode
  4. 4 Select profile in Xcode signing settings

Common Signing Errors

  • "No signing certificate" → Re-download certificate from Developer Portal or use automatic signing
  • "Provisioning profile doesn't match" → Bundle ID in Xcode must match the profile's App ID exactly
  • "Certificate has expired" → Create new certificate in Developer Portal and update profiles

App Store Connect Setup

Create New App

  1. 1
    Go to App Store Connect → Apps → "+"

    Select "New App" and choose iOS platform

  2. 2
    Fill in Basic Information

    Name (30 chars), Primary Language, Bundle ID, SKU (unique identifier)

  3. 3
    Complete App Information

    Subtitle, Category, Content Rights, Age Rating

  4. 4
    Add Screenshots & Preview

    Required for 6.7", 6.5", 5.5" iPhones and 12.9" iPad

  5. 5
    Set Pricing & Availability

    Free or paid, country availability, pre-orders

Archive & Upload

Step 1: Create Archive

  1. 1. Select "Any iOS Device (arm64)" as build destination
  2. 2. Product → Archive (Cmd + Shift + A)
  3. 3. Wait for archive to complete (opens Organizer automatically)
# Or via command line:
xcodebuild -workspace YourApp.xcworkspace \
  -scheme YourApp \
  -configuration Release \
  -archivePath ./build/YourApp.xcarchive \
  archive

Step 2: Upload to App Store Connect

  1. 1. In Organizer, select the archive → "Distribute App"
  2. 2. Choose "App Store Connect" → "Upload"
  3. 3. Select distribution options (usually keep defaults)
  4. 4. Choose signing (automatic or manual)
  5. 5. Review and click "Upload"

Processing Time: After upload, Apple processes your build (5-30 minutes). You'll receive an email when it's ready to submit.

Alternative: Transporter App

For CI/CD pipelines or when Xcode upload fails:

  1. 1. Export archive as .ipa (Xcode Organizer → Export)
  2. 2. Download Transporter from Mac App Store
  3. 3. Drag .ipa into Transporter and click "Deliver"

Common Swift/SwiftUI Issues

ITMS-90683: Missing Purpose String

Your app uses a permission (camera, location, etc.) without an Info.plist usage description.

Fix: Add NSCameraUsageDescription, NSLocationWhenInUseUsageDescription, etc. with user-friendly explanations.

ITMS-90725: SDK Contains Simulator Slices

A third-party framework includes simulator architectures (x86_64).

Fix: Use XCFrameworks instead of fat frameworks, or add a build script to strip simulator architectures.

ITMS-90338: Non-Public API Usage

Your code or a dependency uses private Apple APIs.

Fix: Remove the offending code or update the third-party library. Common culprits: jailbreak detection, runtime introspection.

Missing App Icons

App Store Connect requires a 1024x1024 icon, and your asset catalog needs all sizes.

Fix: Use an icon generator or Xcode 15+'s single-size icon feature. Ensure no alpha channel in App Store icon.

SwiftUI Preview Crashes in Production

Preview-only code or #if DEBUG guards not properly configured.

Fix: Wrap preview providers in #if DEBUG. Test release builds on device before submission.

Swift App Optimization Tips

Performance

  • • Enable Whole Module Optimization in Release
  • • Use @MainActor for UI updates
  • • Profile with Instruments before submission
  • • Minimize app launch time (< 400ms cold start)
  • • Use lazy loading for heavy views

App Size

  • • Enable App Thinning (automatic)
  • • Compress images with HEIC format
  • • Remove unused assets and code
  • • Use On-Demand Resources for large assets
  • • Check for duplicate embedded frameworks

SwiftUI Best Practices

  • • Use @StateObject for owned references
  • • Prefer @EnvironmentObject for shared state
  • • Extract complex views into separate files
  • • Use .task modifier for async work
  • • Test on older iOS versions you support

Accessibility

  • • Add accessibility labels to images
  • • Support Dynamic Type for text
  • • Test with VoiceOver enabled
  • • Ensure sufficient color contrast
  • • Use semantic colors (.label, .background)

Related Guides

Ready to Submit Your Swift App?

Our AI-powered review tool checks your app against all App Store guidelines before you submit, catching issues that could cause rejection.

Check Your App

Frequently Asked Questions

Should I use UIKit or SwiftUI for App Store submission?

Both work fine for App Store submission. SwiftUI apps often have fewer HIG violations since they use native components. For new projects, SwiftUI is recommended unless you need UIKit-specific features.

What iOS version should I target?

iOS 16.0+ is a good baseline for 2025, covering 95%+ of devices. If using SwiftUI, iOS 17+ gives you the latest features. Check Apple's adoption stats in your App Store Connect analytics.

How do I handle the build number for updates?

Increment the build number (CFBundleVersion) for every upload. You can keep the same version number (CFBundleShortVersionString) for TestFlight builds, but must increment for production updates.

My archive is stuck at "Processing" - what do I do?

Processing can take 5-30 minutes. If stuck longer, check your email for processing errors. Common issues: invalid icon format, missing entitlements, or provisioning profile mismatch.

Want AI to audit your app before submission?

Get our AI Review Toolkit with prompts that catch guideline violations automatically.

Get the AI Toolkit