Topic 15: Uploading App to Appstore for iOS
📖 5 min read · 🎯 Advanced · 🧭 Prerequisites: uploading-app-to-playstore-for-android, deployment
Why this matters
You've built something real. The app works on your device, your friends have tested it, and now someone says, "Put it on the App Store." That's where most developers hit a wall — Apple's process is strict, and one wrong setting in Xcode or a missing provisioning profile will block your entire submission. It's not complicated once you've done it, but the first time through feels like a maze. In this lesson, we'll walk through every step — from archiving your React Native app in Xcode to submitting it through App Store Connect — so you know exactly what to do and why.
What You'll Learn
- Set up the prerequisites needed to publish to the Apple App Store
- Configure a React Native project in Xcode for a production distribution build
- Create and fill out an App Store Connect listing
- Archive, upload, and submit a build for Apple review
The Analogy
Think of the App Store submission pipeline like clearing customs at an international airport. Before you even pack, you need the right passport (Apple Developer Account). At check-in, your luggage gets tagged with a unique identifier (Bundle ID) and weighed to spec (app icons, deployment targets). The airline then seals it in a verified container (Xcode Archive). Customs officers inspect it thoroughly (Apple Review), and only once they stamp it approved does it land on shelves around the world. Skip any step, and the bag comes right back.
Chapter 1: Prerequisites
Before writing a single build configuration, make sure all three entry tickets are in hand.
1. Apple Developer Account
Register at https://developer.apple.com/. An individual account costs $99/year; an organization account requires a D-U-N-S number. Without this, no signing certificates, no submission.
2. Xcode
Download Xcode from the Mac App Store — it is macOS-only. The version you install must be current enough to support the iOS SDK version your app targets. Keep it updated; Apple stops accepting builds built with old Xcode versions a few months after each new iOS release.
3. App Store Connect Account
App Store Connect (https://appstoreconnect.apple.com/) is Apple's publisher dashboard. It is separate from the developer portal. You manage app metadata, screenshots, pricing, builds, and review submissions here.
Chapter 2: Setting Up the Project for Distribution
Open your React Native project's iOS workspace in Xcode:
open ios/YourAppName.xcworkspace
Always open the .xcworkspace file, never the .xcodeproj — CocoaPods dependencies live in the workspace.
Step 1: Update the Display Name and Bundle Identifier
- Select your project target in the Project Navigator (left sidebar).
- Open the General tab.
- Set Display Name — this is what users see under the app icon.
- Set Bundle Identifier — must match exactly what you register in App Store Connect (e.g.,
com.example.myapp).
Step 2: Set the Deployment Target
Still on the General tab, locate Deployment Info and set the minimum iOS version you intend to support (e.g., iOS 12.0). This controls which devices can install your app.
Step 3: Create and Add an App Icon
Apple requires icons in many sizes. The cleanest workflow is to generate them all from a single 1024×1024 source image.
- Open
Images.xcassetsin Xcode. - Right-click in the asset list → App Icons & Launch Images → New iOS App Icon.
- Drag your icon images into the appropriate size slots.
All required slots must be filled before Xcode will archive successfully.
Chapter 3: Creating an App Store Connect Listing
Step 1: Create a New App
- Log in to https://appstoreconnect.apple.com/.
- Click My Apps.
- Click the + button → New App.
- Fill in the required fields:
- App Name — visible on the App Store
- Primary Language
- Bundle ID — must match Xcode exactly
- SKU — an internal identifier (not shown to users)
- User Access — Full Access or Limited
Step 2: Fill In App Information
Navigate through the listing and complete each section:
| Section | What to Provide |
|---|---|
| App Information | Name, Subtitle, Privacy Policy URL |
| Pricing and Availability | Price tier, available territories |
| App Privacy | Data types collected, usage purposes |
| App Previews and Screenshots | Screenshots for every supported device size |
| Version Information | Version number, build number, description, keywords, support URL |
Screenshots are required for at least the 6.5-inch iPhone (iPhone Pro Max) and 12.9-inch iPad if your app supports iPad. Use Xcode Simulator or a physical device to capture them.
Chapter 4: Archiving and Uploading the App
Step 1: Configure Build Settings for Release
- Select your project in the Project Navigator.
- Go to the Build Settings tab.
- Confirm Build Configuration is set to Release (not Debug).
Release builds strip debug symbols, enable compiler optimizations, and use distribution signing identities.
Step 2: Create an Archive
- In Xcode, ensure the scheme target is your app (not a simulator — select Any iOS Device (arm64)).
- From the menu bar: Product → Archive.
- Xcode compiles a release build and packages it. This can take several minutes.
- When complete, the Organizer window opens automatically, listing your new archive.
# Equivalent via CLI using xcodebuild (optional automation path)
xcodebuild -workspace ios/YourAppName.xcworkspace \
-scheme YourAppName \
-configuration Release \
-archivePath build/YourAppName.xcarchive \
archive
Step 3: Upload the Archive to App Store Connect
- In the Organizer window, select your archive and click Distribute App.
- Choose App Store Connect → Next.
- Choose Upload → Next.
- Follow the prompts to select your app's provisioning profile and distribution certificate.
- Xcode validates and uploads the build. Once complete, the build appears in App Store Connect under your app's TestFlight and Builds sections within a few minutes (sometimes up to 30 minutes for processing).
Chapter 5: Submitting the App for Review
Step 1: Add the Build to Your Version
- In App Store Connect, navigate to My Apps → your app → App Store tab.
- Select the version you are preparing (or create a new version).
- Under Build, click the + icon and select the uploaded build once it finishes processing.
Step 2: Submit for Review
- Confirm all metadata sections are complete (a green checkmark appears on each).
- Click Submit for Review.
- Answer Apple's export compliance and content rights questions.
- Click Submit.
Step 3: Wait for Approval
Apple's review team inspects the build for compliance with App Store Review Guidelines. Typical review time is 24–48 hours for new apps, sometimes faster for updates. You receive email notifications at each status change:
- Waiting for Review → in queue
- In Review → actively being reviewed
- Approved / Rejected (rejection includes detailed feedback)
If rejected, address the stated reason and resubmit — the cycle repeats until approved.
flowchart TD
A[Apple Developer Account] --> B[Configure Xcode: Bundle ID, Display Name, Icon, Deployment Target]
B --> C[Create App Store Connect Listing]
C --> D[Product → Archive in Xcode]
D --> E[Organizer → Distribute App → Upload]
E --> F[App Store Connect: Add Build to Version]
F --> G[Submit for Review]
G --> H{Apple Decision}
H -->|Approved| I[Live on App Store]
H -->|Rejected| J[Fix Issues → Resubmit]
J --> G
🧪 Try It Yourself
Task: Archive your existing React Native app and get it as far as the Organizer window.
- Open your project:
open ios/YourAppName.xcworkspace - Set the scheme target to Any iOS Device (arm64) in the Xcode toolbar.
- Run Product → Archive.
Success criterion: The Xcode Organizer window opens and shows your archive with today's date and a green status indicator. You don't need an Apple Developer account to reach this step — archiving itself is local.
Starter config check — verify your Bundle ID is set:
grep -r "PRODUCT_BUNDLE_IDENTIFIER" ios/YourAppName.xcodeproj/project.pbxproj
You should see a consistent identifier (not the default org.reactjs.native.example) across all build configurations.
🔍 Checkpoint Quiz
Q1. Why must you open the .xcworkspace file instead of the .xcodeproj file when working with a React Native iOS project?
A) .xcworkspace has a better UI
B) .xcworkspace includes CocoaPods dependencies; .xcodeproj does not
C) Xcode requires workspace files for all projects
D) .xcodeproj files are deprecated in newer Xcode versions
Q2. Given the following Xcode archive command, what is wrong with it?
xcodebuild -workspace ios/MyApp.xcworkspace \
-scheme MyApp \
-configuration Debug \
-archivePath build/MyApp.xcarchive \
archive
A) The -archivePath flag is not supported
B) The -configuration should be Release, not Debug
C) The -scheme flag requires the full path
D) Nothing is wrong; Debug archives upload fine
Q3. You upload a build to App Store Connect but it does not appear in the version's Build selector after 5 minutes. What is the most likely explanation?
A) The bundle identifier does not match
B) Apple is still processing the build (can take up to 30 minutes)
C) You forgot to run pod install
D) The archive was created in Debug configuration
Q4. Your app is rejected by Apple with a message that it "uses private APIs." How should you proceed?
A) Resubmit immediately without changes — Apple sometimes makes mistakes
B) Remove or replace the private API calls, create a new archive, upload, and resubmit
C) Email Apple to request an exception
D) Switch the deployment target to an older iOS version
A1. B — CocoaPods generates a workspace that wraps the original project. Opening .xcodeproj directly skips all pod dependencies, causing build failures.
A2. B — Archive builds destined for the App Store must use Release configuration. A Debug build contains debug symbols and non-optimized code; Apple will reject it.
A3. B — Apple processes uploaded .ipa files asynchronously. The delay is normal and can stretch to 30 minutes for larger builds or during high-traffic periods.
A4. B — Apple's static analysis detects private API usage and will reject the build every time until the calls are removed. Fix the code, archive, upload, and resubmit.
🪞 Recap
- You need an Apple Developer Account, Xcode, and App Store Connect access before any submission work can begin.
- The Bundle Identifier in Xcode must exactly match the Bundle ID registered in App Store Connect — a mismatch blocks upload.
- Archiving (
Product → Archive) produces a signed, release-mode.xcarchivethat Xcode's Organizer then uploads directly to App Store Connect. - App Store Connect requires complete metadata — screenshots, privacy details, pricing, and version info — before you can submit for review.
- Apple's review typically takes 24–48 hours; rejections include specific feedback and the fix-resubmit cycle can repeat until approval.
📚 Further Reading
- App Store Review Guidelines — Apple's official rulebook; read before submitting
- App Store Connect Help — source of truth for every field in the submission flow
- React Native iOS deployment docs — official React Native guidance on building for iOS production
- ⬅️ Previous: Deployment
- ➡️ Next: None