How to publish an app to the Apple App Store
A complete end-to-end guide covering Apple Developer accounts, certificates, provisioning profiles, App Store Connect, signing, and submission.
Publishing an iOS/iPadOS/macOS app to the Apple App Store involves several moving parts: an Apple Developer account, certificates, provisioning profiles, App Store Connect metadata, and the Xcode archive/upload workflow. This guide walks you through every step from zero to live on the store.
Table of contents
- Prerequisites
- Create an Apple Developer account
- Create an App ID
- Create a distribution certificate
- Create a provisioning profile
- Configure your project in Xcode
- Prepare App Store Connect
- Archive and upload
- Submit for review
- Post-release: updates & maintenance
- Troubleshooting
Prerequisites
- A Mac running the latest version of Xcode (free from the Mac App Store)
- An Apple ID (personal iCloud Apple ID works)
- A completed, tested app that compiles without errors
- App icons in all required sizes (1024×1024 master, Xcode will generate the rest with a single-size icon in the asset catalog)
- A privacy policy URL (required even if your app collects no data)
1. Create an Apple Developer account
- Go to https://developer.apple.com and sign in with your Apple ID.
- Click Join the Apple Developer Program.
- Enroll as either an Individual or an Organization:
- Individual — your personal legal name appears as the seller. Simplest option for solo devs.
- Organization — requires a D-U-N-S number from Dun & Bradstreet (free) and legal entity verification. Your company name appears as the seller.
- Pay the $99 USD/year membership fee.
- Wait for verification (usually within 24 hours, up to 48 for organizations).
Tip: You can test on-device with a free Apple ID (sideloading via Xcode), but you must have a paid membership to distribute on the App Store.
2. Create an App ID
An App ID uniquely identifies your app in Apple’s ecosystem.
- Go to Certificates, Identifiers & Profiles.
- Click Identifiers → + (plus button).
- Select App IDs and click Continue.
- Description — a human-readable label (e.g. “My Awesome App”).
- Bundle ID — choose Explicit and enter a reverse-domain identifier, e.g.
com.yourdomain.myawesomeapp. This must match the bundle identifier in your Xcode project. - Under Capabilities, enable any entitlements your app uses (Push Notifications, Sign in with Apple, App Groups, etc.).
- Click Register.
3. Create a distribution certificate
Certificates let Apple verify that the app was built by you. You need a Distribution Certificate for App Store builds.
Option A: Let Xcode manage it (recommended for beginners)
Xcode can automatically create and manage certificates and profiles:
- In Xcode → Settings → Accounts, add your Apple ID.
- Select your team → click Manage Certificates.
- Click + → Apple Distribution.
- Xcode creates the certificate and installs it in your Keychain.
Option B: Manual creation
- Open Keychain Access → Keychain Access → Certificate Assistant → Request a Certificate from a Certificate Authority…
- Enter your email and common name, choose Saved to disk, and save the
.certSigningRequestfile. - Go to Certificates, Identifiers & Profiles → Certificates.
- Click + → choose Apple Distribution → Continue.
- Upload the
.certSigningRequestfile. - Download the generated
.cerfile and double-click it to install in Keychain.
Important: The private key is generated in your Keychain at step 2. If you lose it or your Mac dies, you cannot revoke and re-create the same certificate without invalidating existing profiles. Back up your private key (export as
.p12from Keychain Access) and store it securely.
4. Create a provisioning profile
A provisioning profile ties together your App ID, certificate, and (for Ad-Hoc/Development) device UDIDs.
- Go to Certificates, Identifiers & Profiles → Profiles.
- Click + → select App Store under Distribution → Continue.
- Select the App ID you created in step 2 → Continue.
- Select your distribution certificate → Continue.
- Profile Name — e.g. “My Awesome App AppStore Profile”.
- Click Generate, then Download the
.mobileprovisionfile. - Double-click the file to install it in Xcode.
Note: If you let Xcode manage signing (step 5), profiles are created automatically. You only need manual profiles if you’re using advanced CI/CD setups.
5. Configure your project in Xcode
Bundle identifier
- Open your project in Xcode.
- Select the target → Signing & Capabilities tab.
- Team — select your Apple Developer team.
- Bundle Identifier — must exactly match the App ID you registered (e.g.
com.yourdomain.myawesomeapp).
Automatic vs Manual signing
- Automatically manage signing — Xcode handles certificates and profiles. Great for solo devs and simple workflows.
- Manual signing — you specify the provisioning profile yourself. Required for CI/CD pipelines.
Version and build numbers
- Version (CFBundleShortVersionString) — the user-facing version, e.g.
1.0.0. Follow semantic versioning. - Build (CFBundleVersion) — an incrementing integer or version string, e.g.
1. Must be unique per version. Each upload to App Store Connect must have a higher build number than the last.
Required settings
Ensure your Info.plist or project settings include:
| Key | Value |
|---|---|
NSAppTransportSecurity |
Configure if your app talks to HTTP (non-HTTPS) endpoints |
UIApplicationSceneManifest |
Required for iOS 13+ scene-based lifecycle |
Privacy – Camera Usage Description |
If your app uses the camera |
Privacy – Location When In Use Usage Description |
If your app requests location |
ITSAppUsesNonExemptEncryption |
Set to NO if your app doesn’t use custom encryption, to speed up export compliance review |
App icons and launch screen
- Add a 1024×1024 icon to
Assets.xcassets → AppIcon. - Ensure your Launch Screen storyboard or
LaunchScreen.storyboardis set correctly.
6. Prepare App Store Connect
App Store Connect is where you manage metadata, screenshots, pricing, and submissions.
Create the app record
- Go to App Store Connect.
- Click My Apps → + → New App.
- Fill in:
- Platforms — iOS (or others).
- Name — your app’s display name on the store.
- Primary Language — determines the default language for metadata.
- Bundle ID — select the App ID you registered.
- SKU — a unique internal identifier (e.g.
myawesomeapp2026).
- Click Create.
Fill in metadata
Navigate to your app → App Information and fill in all required fields:
| Section | Details |
|---|---|
| App Information | Category, subcategory, content rights |
| Pricing and Availability | Price tier, availability regions |
| Privacy | Privacy policy URL, data collection declarations |
| App Review Information | Contact info, notes for reviewers, demo account if login is required |
Screenshots
You must provide screenshots for every device size you support. Required sizes:
| Device | Dimensions (portrait) |
|---|---|
| iPhone 6.9" (iPhone 15 Pro Max) | 1290 × 2796 px |
| iPhone 6.7" (iPhone 14 Plus) | 1284 × 2778 px |
| iPhone 6.5" | 1284 × 2778 px |
| iPhone 5.5" | 1242 × 2208 px |
| iPad 12.9" | 2048 × 2732 px |
| iPad 11" | 1668 × 2388 px |
Tip: Use Xcode’s simulator to take screenshots, or use tools like fastlane snapshot to automate the process. You can also drag a 6.9" screenshot and App Store Connect will scale it for other sizes if you check “Use same screenshot for all iPhone sizes.”
App description and keywords
- Description — up to 4000 characters. Make the first 3 lines count (visible before “More”).
- Keywords — up to 100 characters, comma-separated. No need to repeat words already in the app name.
- What’s New (for updates) — up to 4000 characters describing changes.
7. Archive and upload
Archive the app
- Connect a physical device or select Any iOS Device as the run destination (required for archiving).
- In Xcode: Product → Archive.
- Wait for the build to complete. The Organizer window opens.
- Verify the archive: check version, build number, and that the right provisioning profile was used.
Upload to App Store Connect
- In the Organizer, click Distribute App.
- Choose App Store Connect → Upload.
- Configure upload options:
- Upload your app’s symbols — recommended for crash symbolication.
- Manage Version and Build Number — let Xcode auto-increment if needed.
- Click Distribute and wait for the upload to complete.
- App Store Connect processes the build (typically 5–30 minutes). You’ll receive an email when it’s ready.
Alternative: Use
xcodebuildandxcrun altoolor the newxcrun notarytoolfor command-line uploads. See the CI/CD section below.
Common upload errors
| Error | Fix |
|---|---|
| “Invalid signature” | Re-generate your distribution certificate or provisioning profile |
| “Missing required icon” | Ensure 1024×1024 icon is in the asset catalog |
| “Invalid Bundle Identifier” | Bundle ID must match App Store Connect and Developer Portal exactly |
| “Build number conflict” | Increment the build number in Xcode |
8. Submit for review
- In App Store Connect, go to your app → App Store tab.
- Select (or create) a version.
- Choose the uploaded build under Build section.
- Complete all required metadata fields (description, keywords, screenshots, etc.).
- Answer the Export Compliance question (usually “No” if you’re not using custom encryption beyond standard HTTPS).
- Click Add for Review.
Review timeline
- Standard review: typically 24–48 hours.
- First submission: may take longer (up to 7 days).
- Appeals: if rejected, you can appeal or modify and resubmit.
Common rejection reasons
- Crashes or bugs — test thoroughly before submitting.
- Missing privacy policy — required even if you collect no data.
- Broken links — all support/marketing URLs must work.
- Incomplete UI — placeholder text, “lorem ipsum”, or “coming soon” sections.
- Misleading metadata — screenshots must reflect actual app content.
- 2.1 Performance: App Completeness — the most common rejection; ensure your app is fully functional.
9. Post-release: updates & maintenance
Releasing an update
- Increment Version and Build numbers in Xcode.
- Archive and upload the new build.
- In App Store Connect, create a new version or add the build to the existing version.
- Fill in What’s New.
- Submit for review.
Managing certificates over time
- Distribution certificates expire after 5 years.
- Provisioning profiles expire after 1 year.
- Set reminders to renew them before expiration.
- Revoke compromised certificates immediately in the Developer Portal.
Phased release
App Store Connect supports phased releases — rolling out updates to 1%, 2%, 5%, 10%, 20%… of users over 7 days. Enable this under Phased Release in the version section.
CI/CD with fastlane
For teams and automation, fastlane is the industry standard:
# Install fastlane
gem install fastlane
# Initialize in your project
fastlane init
# Common commands
fastlane match # Sync certificates & profiles across team
fastlane snapshot # Automated screenshots
fastlane gym # Build and archive
fastlane deliver # Upload metadata & screenshots to App Store Connect
fastlane pilot # Distribute TestFlight builds
Example Fastfile lane
default_platform(:ios)
platform :ios do
desc "Build and upload to App Store Connect"
lane :release do
match(type: "appstore", readonly: true)
build_app(workspace: "MyApp.xcworkspace",
scheme: "MyApp",
export_method: "app-store")
upload_to_app_store(skip_screenshots: true,
skip_metadata: true,
force: true)
end
end
Troubleshooting
“Signing for requires a development team”
Open the project in Xcode → select target → Signing & Capabilities → choose your team from the dropdown.
“Provisioning profile doesn’t include the current device”
For development builds, register your device UDID in the Developer Portal and regenerate the profile. For App Store builds, device registration is not needed.
“No signing certificate found”
Your distribution certificate’s private key is missing from Keychain. Import the .p12 backup or re-generate the certificate.
“iTunes Connect operation failed”
This usually means a metadata conflict or duplicate build number. Increment the build number and re-upload.
Xcode stuck on “Processing”
App Store Connect processing can take up to several hours. Check status at App Store Connect under Activity.
Checklist
- Apple Developer account enrolled ($99/year)
- App ID registered with correct bundle identifier
- Distribution certificate created and installed in Keychain
- Provisioning profile generated and installed
- Xcode project configured (bundle ID, team, signing)
- App icons (1024×1024) added to asset catalog
- Launch screen configured
- Privacy policy URL set up
- App Store Connect app record created
- Screenshots captured for all required device sizes
- Metadata filled in (description, keywords, categories)
- App archived and uploaded via Xcode Organizer
- Build selected in App Store Connect version
- Export compliance answered
- Submitted for review