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.
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
Signing & Provisioning
Automatic Signing (Recommended)
- 1 Select target → Signing & Capabilities
- 2 Check "Automatically manage signing"
- 3 Select your Team (Apple Developer account)
- 4 Xcode creates certificates and profiles automatically
Manual Signing
- 1 Create Distribution Certificate in Developer Portal
- 2 Create App Store Provisioning Profile
- 3 Download and install both in Keychain/Xcode
- 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
Go to App Store Connect → Apps → "+"
Select "New App" and choose iOS platform
-
2
Fill in Basic Information
Name (30 chars), Primary Language, Bundle ID, SKU (unique identifier)
-
3
Complete App Information
Subtitle, Category, Content Rights, Age Rating
-
4
Add Screenshots & Preview
Required for 6.7", 6.5", 5.5" iPhones and 12.9" iPad
-
5
Set Pricing & Availability
Free or paid, country availability, pre-orders
Archive & Upload
Step 1: Create Archive
- 1. Select "Any iOS Device (arm64)" as build destination
- 2. Product → Archive (Cmd + Shift + A)
- 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. In Organizer, select the archive → "Distribute App"
- 2. Choose "App Store Connect" → "Upload"
- 3. Select distribution options (usually keep defaults)
- 4. Choose signing (automatic or manual)
- 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. Export archive as .ipa (Xcode Organizer → Export)
- 2. Download Transporter from Mac App Store
- 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 AppFrequently 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.