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

iOS Submission Guide

Framework Guide React Native

React Native App Store Submission Guide 2025

Everything you need to know to successfully submit your React Native app to the Apple App Store—from Xcode configuration to avoiding common rejection pitfalls.

How to Submit a React Native App to the App Store

To submit a React Native app to the App Store: 1) Configure your Xcode project with proper Bundle ID and certificates, 2) Build an Archive using Xcode or EAS Build, 3) Upload to App Store Connect via Xcode or Transporter, 4) Fill in app metadata, screenshots, and privacy details, 5) Submit for review. The entire process takes 1-3 days for approval.

Average review time: 24-48 hours

Prerequisites Before You Start

1 Apple Developer Account

  • Enrolled in Apple Developer Program ($99/year)
  • Access to App Store Connect
  • Distribution certificate created

2 Development Environment

  • Mac with latest Xcode (15.0+)
  • React Native 0.72+ (latest recommended)
  • CocoaPods installed and updated

3 App Requirements

  • 1024x1024 app icon (no alpha/transparency)
  • Screenshots for all required device sizes
  • Privacy policy URL (required)

4 If Using Expo

  • Expo SDK 49+ (latest recommended)
  • EAS CLI installed globally
  • app.json properly configured

Xcode Configuration for React Native

Before building for production, you need to configure several settings in Xcode. Open your project by double-clicking the .xcworkspace file (not .xcodeproj).

Step 1: Open in Xcode

# From your React Native project root
cd ios
open YourAppName.xcworkspace

Important: Always open the .xcworkspace file, not .xcodeproj. The workspace includes CocoaPods dependencies.

Step 2: Configure Bundle Identifier

  1. 1 Select your project in the navigator (blue icon at top)
  2. 2 Select your app target under "TARGETS"
  3. 3 Go to "Signing & Capabilities" tab
  4. 4 Set your Bundle Identifier (e.g., com.yourcompany.yourapp)

Step 3: Set Version and Build Numbers

In the "General" tab, configure:

  • Version: User-facing version (e.g., 1.0.0) - follows semantic versioning
  • Build: Internal build number (e.g., 1, 2, 3) - must increment for each upload

Tip: You can automate build number incrementing with agvtool or Fastlane.

Step 4: Configure Deployment Target

Set your minimum iOS version in "General" → "Deployment Info":

  • iOS 13.0+ - Maximum device compatibility
  • iOS 14.0+ - Modern React Native apps (recommended)
  • iOS 15.0+ - If using newer iOS-only features

Also ensure the devices section includes both iPhone and iPad if applicable.

Code Signing Setup

Code signing is often the most confusing part for React Native developers. Here's how to set it up correctly.

Option A: Automatic Signing (Recommended for Beginners)

  1. 1
    Enable Automatic Signing

    In Signing & Capabilities, check "Automatically manage signing"

  2. 2
    Select Your Team

    Choose your Apple Developer account from the Team dropdown

  3. 3
    Done!

    Xcode will automatically create certificates and provisioning profiles

Option B: Manual Signing (For Teams/CI)

  1. 1. Create Distribution Certificate

    In Apple Developer Portal → Certificates → Create "Apple Distribution" certificate

  2. 2. Create App ID

    Identifiers → App IDs → New with your Bundle ID

  3. 3. Create Provisioning Profile

    Profiles → Distribution → App Store → Select your App ID and Certificate

  4. 4. Download and Install

    Double-click downloaded profile to install, then select in Xcode

Common Signing Errors

  • "No signing certificate" - Your certificate is missing or expired. Create a new one in Developer Portal.
  • "Provisioning profile doesn't include signing certificate" - Regenerate your profile after creating new certificate.
  • "The executable was signed with invalid entitlements" - Enable matching capabilities in both Developer Portal and Xcode.

Creating a Production Build

Step 1: Install Pods and Build JS Bundle

# From project root
cd ios && pod install && cd ..

# The bundle is created automatically during Archive
# But you can manually create it:
npx react-native bundle --entry-file index.js \
  --platform ios \
  --dev false \
  --bundle-output ios/main.jsbundle \
  --assets-dest ios

Step 2: Set Build Configuration to Release

  1. 1. In Xcode, go to Product → Scheme → Edit Scheme
  2. 2. Select "Archive" from the left sidebar
  3. 3. Set Build Configuration to "Release"
  4. 4. Close the dialog

Step 3: Create Archive

  1. 1. Select "Any iOS Device (arm64)" as the build destination (not a simulator)
  2. 2. Go to Product → Archive
  3. 3. Wait for the build to complete (may take 5-15 minutes)
  4. 4. Organizer window will open automatically with your archive

Keyboard shortcut: Product → Archive has no default shortcut, but you can assign one in Xcode preferences.

Step 4: Upload to App Store Connect

  1. 1. In the Organizer, select your archive and click "Distribute App"
  2. 2. Choose "App Store Connect" → "Upload"
  3. 3. Keep default options (usually) and click Next
  4. 4. Review the app content and click Upload
  5. 5. Wait for processing (usually 10-30 minutes)

App Store Connect Setup

While your build processes, set up your app listing in App Store Connect.

Required Information

App Information

  • • App name (30 characters max)
  • • Subtitle (30 characters max)
  • • Primary category
  • • Privacy policy URL

Version Information

  • • Description (4000 characters max)
  • • Keywords (100 characters total)
  • • Support URL
  • • What's New (for updates)

Screenshot Requirements

You need screenshots for at least one device size. Required dimensions:

iPhone

  • • 6.7" (1290 × 2796) - iPhone 15 Pro Max
  • • 6.5" (1284 × 2778) - iPhone 14 Plus
  • • 5.5" (1242 × 2208) - iPhone 8 Plus

iPad (if supporting)

  • • 12.9" (2048 × 2732) - iPad Pro
  • • 11" (1668 × 2388) - iPad Pro

Tip: Upload 6.7" iPhone screenshots first—App Store Connect will offer to use them for smaller sizes.

App Privacy

You must declare what data your React Native app collects:

  • Analytics: If using Firebase, Amplitude, Mixpanel, etc.
  • Crash data: If using Sentry, Crashlytics, Bugsnag
  • Device ID: Many third-party SDKs collect this

React Native-Specific Rejection Reasons

React Native apps face some unique challenges during App Review. Here are the most common issues:

1 JavaScript Bundle Not Found (Crash on Launch)

The most common React Native rejection. App crashes immediately because the JS bundle isn't included in the archive.

Fix:

# Ensure bundle is generated for release builds
# In Xcode Build Phases, verify "Bundle React Native code and images" runs

2 Debug Menu Accessible in Production

If users can shake their device to see the React Native debug menu, you'll be rejected.

Fix:

The debug menu should be automatically disabled in Release builds. If not, check that your build configuration is set to "Release", not "Debug".

3 Missing Purpose Strings (NSCameraUsageDescription, etc.)

If your app uses camera, location, photos, or other permissions, you must explain why in Info.plist.

Fix in ios/YourApp/Info.plist:

<key>NSCameraUsageDescription</key>
<string>We need camera access to let you take photos for your profile</string>

<key>NSPhotoLibraryUsageDescription</key>
<string>We need photo library access to let you select images</string>

4 Guideline 4.2 - Minimum Functionality

Your app must provide value beyond what a website could offer. Simple WebView wrappers will be rejected.

Fix:

Add native features: push notifications, offline support, camera integration, HealthKit, or other iOS-specific APIs.

Read our complete Guideline 4.2 guide

5 iPad Compatibility Issues

If your app runs on iPad, it must have a proper layout—not just a stretched iPhone UI.

Fix:

Either use responsive layouts (Flexbox works great) or explicitly disable iPad in Xcode → Target → General → Deployment Info → uncheck iPad.

6 App Icon Contains Alpha Channel

App Store rejects icons with transparency. This is a common issue with PNG exports.

Fix:

# Remove alpha channel using ImageMagick
convert icon.png -alpha off -background white -flatten icon-no-alpha.png

Performance Optimization for App Review

Slow apps get rejected. Apple reviewers have limited patience, and performance issues often lead to 2.1 (crashes) or 4.2 (low quality) rejections.

Startup Time

  • • Use Hermes engine (enabled by default in RN 0.70+)
  • • Lazy load screens with React.lazy()
  • • Minimize bundle size—remove unused dependencies
  • • Consider RAM bundles for large apps

Memory Usage

  • • Profile with Xcode Instruments
  • • Optimize images (use WebP format)
  • • Use FlatList instead of ScrollView for lists
  • • Remove console.log statements in production

Render Performance

  • • Use React.memo for expensive components
  • • Implement useCallback and useMemo
  • • Avoid inline function definitions in JSX
  • • Use InteractionManager for heavy operations

Bundle Optimization

  • • Enable Proguard/R8 for Android (reduces bundle)
  • • Remove unused native modules
  • • Use dynamic imports for large features
  • • Check bundle size with source-map-explorer

Enable Hermes (Critical for Performance)

Hermes significantly improves startup time and memory usage. It's enabled by default in React Native 0.70+.

# Verify Hermes is enabled in ios/Podfile:
:hermes_enabled => true

# Then reinstall pods
cd ios && pod install

Expo & EAS Build

If you're using Expo, EAS Build simplifies the submission process significantly. You don't need a Mac for building.

Configure app.json for App Store

{
  "expo": {
    "name": "Your App Name",
    "slug": "your-app-slug",
    "version": "1.0.0",
    "ios": {
      "bundleIdentifier": "com.yourcompany.yourapp",
      "buildNumber": "1",
      "supportsTablet": false,
      "infoPlist": {
        "NSCameraUsageDescription": "We need camera access to...",
        "NSPhotoLibraryUsageDescription": "We need photo access to..."
      }
    }
  }
}

Build and Submit with EAS

# Install EAS CLI
npm install -g eas-cli

# Login to Expo account
eas login

# Configure EAS (first time)
eas build:configure

# Build for iOS App Store
eas build --platform ios --profile production

# Submit to App Store (after build completes)
eas submit --platform ios

EAS Build Advantages

  • No Mac required - builds happen in the cloud
  • Automatic code signing - EAS manages certificates
  • Built-in CI/CD - automatic builds on git push
  • One-command submit - eas submit handles upload

Troubleshooting Common Issues

"Unable to install" error in TestFlight

This usually means the device's iOS version is lower than your deployment target. Check your minimum iOS version in Xcode and ensure testers have compatible devices.

Build fails with "Could not find module" error
# Clean and reinstall everything
rm -rf node_modules
rm -rf ios/Pods
rm ios/Podfile.lock
npm install
cd ios && pod install
Archive succeeds but upload fails

Common causes:

  • Bundle ID mismatch between Xcode and App Store Connect
  • Build number wasn't incremented from previous upload
  • Invalid assets (wrong icon size, alpha channel)

Check the detailed error in Xcode's Organizer → "Show in Finder" → right-click → "Show Package Contents" → look for error logs.

App crashes only in production build

Debug builds work differently from Release builds. Common causes:

  • JS bundle not included in archive (check Build Phases)
  • Hermes optimization issues (try disabling temporarily)
  • ProGuard/R8 removing needed code (Android)
  • Environment variables not set for production

Test with: npx react-native run-ios --configuration Release

Pre-Submission Checklist

Use this checklist before every App Store submission:

Build & Technical

  • Build configuration set to "Release"
  • JS bundle included in archive
  • Build number incremented
  • Debug menu disabled
  • console.log statements removed
  • Tested on physical device

App Store Assets

  • App icon has no alpha channel
  • Screenshots for all required sizes
  • Privacy policy URL working
  • App privacy questionnaire completed
  • Support URL working
  • Demo account provided (if applicable)

Permissions & Privacy

  • All usage descriptions in Info.plist
  • Purpose strings explain user benefit
  • ATT prompt for ad tracking (if used)
  • Data collection matches privacy labels

Content & Quality

  • No placeholder content
  • All links working
  • App provides native value beyond web
  • iPad layout acceptable (if supporting)

Related Guides

Want to Ensure Your React Native App Gets Approved?

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

Try AI Review

Frequently Asked Questions

How long does App Store review take for React Native apps?

App Store review typically takes 24-48 hours for React Native apps. The review time is the same as native apps—Apple doesn't distinguish based on framework. First submissions may take slightly longer as reviewers examine all aspects of your app.

Can Apple tell if an app is built with React Native?

Apple can identify React Native apps during review, but this doesn't affect approval chances. What matters is app quality, not the technology used. Apple's guidelines apply equally to all apps regardless of whether they're built with Swift, React Native, Flutter, or other frameworks.

Do I need a Mac to submit a React Native app to the App Store?

For traditional React Native CLI projects, yes—you need a Mac with Xcode to create the archive and upload to App Store Connect. However, if you use Expo with EAS Build, you can build and submit entirely from the cloud without a Mac.

Why does my React Native app crash only in the App Store build?

This usually means the JavaScript bundle isn't included in your release build. Check that "Bundle React Native code and images" is in your Xcode Build Phases and runs during archiving. Also verify your build configuration is set to "Release" in the Archive scheme.

Want AI to audit your app before submission?

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

Get the AI Toolkit