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.

, updated

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

  1. Prerequisites
  2. Create an Apple Developer account
  3. Create an App ID
  4. Create a distribution certificate
  5. Create a provisioning profile
  6. Configure your project in Xcode
  7. Prepare App Store Connect
  8. Archive and upload
  9. Submit for review
  10. Post-release: updates & maintenance
  11. 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

  1. Go to https://developer.apple.com and sign in with your Apple ID.
  2. Click Join the Apple Developer Program.
  3. 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.
  4. Pay the $99 USD/year membership fee.
  5. 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.

  1. Go to Certificates, Identifiers & Profiles.
  2. Click Identifiers → + (plus button).
  3. Select App IDs and click Continue.
  4. Description — a human-readable label (e.g. “My Awesome App”).
  5. 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.
  6. Under Capabilities, enable any entitlements your app uses (Push Notifications, Sign in with Apple, App Groups, etc.).
  7. 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.

Xcode can automatically create and manage certificates and profiles:

  1. In Xcode → Settings → Accounts, add your Apple ID.
  2. Select your team → click Manage Certificates.
  3. Click +Apple Distribution.
  4. Xcode creates the certificate and installs it in your Keychain.

Option B: Manual creation

  1. Open Keychain Access → Keychain Access → Certificate Assistant → Request a Certificate from a Certificate Authority…
  2. Enter your email and common name, choose Saved to disk, and save the .certSigningRequest file.
  3. Go to Certificates, Identifiers & Profiles → Certificates.
  4. Click + → choose Apple Distribution → Continue.
  5. Upload the .certSigningRequest file.
  6. Download the generated .cer file 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 .p12 from 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.

  1. Go to Certificates, Identifiers & Profiles → Profiles.
  2. Click + → select App Store under Distribution → Continue.
  3. Select the App ID you created in step 2 → Continue.
  4. Select your distribution certificate → Continue.
  5. Profile Name — e.g. “My Awesome App AppStore Profile”.
  6. Click Generate, then Download the .mobileprovision file.
  7. 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

  1. Open your project in Xcode.
  2. Select the target → Signing & Capabilities tab.
  3. Team — select your Apple Developer team.
  4. 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.storyboard is set correctly.

6. Prepare App Store Connect

App Store Connect is where you manage metadata, screenshots, pricing, and submissions.

Create the app record

  1. Go to App Store Connect.
  2. Click My Apps → + → New App.
  3. 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).
  4. 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

  1. Connect a physical device or select Any iOS Device as the run destination (required for archiving).
  2. In Xcode: Product → Archive.
  3. Wait for the build to complete. The Organizer window opens.
  4. Verify the archive: check version, build number, and that the right provisioning profile was used.

Upload to App Store Connect

  1. In the Organizer, click Distribute App.
  2. Choose App Store ConnectUpload.
  3. Configure upload options:
    • Upload your app’s symbols — recommended for crash symbolication.
    • Manage Version and Build Number — let Xcode auto-increment if needed.
  4. Click Distribute and wait for the upload to complete.
  5. App Store Connect processes the build (typically 5–30 minutes). You’ll receive an email when it’s ready.

Alternative: Use xcodebuild and xcrun altool or the new xcrun notarytool for 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

  1. In App Store Connect, go to your app → App Store tab.
  2. Select (or create) a version.
  3. Choose the uploaded build under Build section.
  4. Complete all required metadata fields (description, keywords, screenshots, etc.).
  5. Answer the Export Compliance question (usually “No” if you’re not using custom encryption beyond standard HTTPS).
  6. 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

  1. Increment Version and Build numbers in Xcode.
  2. Archive and upload the new build.
  3. In App Store Connect, create a new version or add the build to the existing version.
  4. Fill in What’s New.
  5. 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