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.
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 Select your project in the navigator (blue icon at top)
- 2 Select your app target under "TARGETS"
- 3 Go to "Signing & Capabilities" tab
-
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
Enable Automatic Signing
In Signing & Capabilities, check "Automatically manage signing"
-
2
Select Your Team
Choose your Apple Developer account from the Team dropdown
-
3
Done!
Xcode will automatically create certificates and provisioning profiles
Option B: Manual Signing (For Teams/CI)
-
1. Create Distribution Certificate
In Apple Developer Portal → Certificates → Create "Apple Distribution" certificate
-
2. Create App ID
Identifiers → App IDs → New with your Bundle ID
-
3. Create Provisioning Profile
Profiles → Distribution → App Store → Select your App ID and Certificate
-
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. In Xcode, go to Product → Scheme → Edit Scheme
- 2. Select "Archive" from the left sidebar
- 3. Set Build Configuration to "Release"
- 4. Close the dialog
Step 3: Create Archive
- 1. Select "Any iOS Device (arm64)" as the build destination (not a simulator)
- 2. Go to Product → Archive
- 3. Wait for the build to complete (may take 5-15 minutes)
- 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. In the Organizer, select your archive and click "Distribute App"
- 2. Choose "App Store Connect" → "Upload"
- 3. Keep default options (usually) and click Next
- 4. Review the app content and click Upload
- 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 guide5 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 ReviewFrequently 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.