Skip to main content
Publishing your React Native app to the App Store and Google Play Store requires careful preparation, testing, and configuration. This guide covers the entire process for both platforms.

Pre-Publishing Checklist

Before publishing, ensure:
  • App is tested on physical devices
  • All features work correctly
  • Performance is optimized
  • Security best practices implemented
  • App icons and splash screens created
  • Privacy policy and terms of service ready
  • App store descriptions prepared
  • Screenshots and preview videos created
  • Version number and build number set

iOS App Store

Prerequisites

  1. Apple Developer Account: $99/year
  2. Mac with Xcode: Latest version recommended
  3. Test devices: Physical iOS devices for testing

Step 1: App Store Connect Setup

  1. Go to App Store Connect
  2. Click “My Apps” → ”+” → “New App”
  3. Fill in app information:
    • Platform: iOS
    • App Name
    • Primary Language
    • Bundle ID
    • SKU (unique identifier)

Step 2: Configure Xcode Project

Open ios/YourApp.xcworkspace in Xcode:

Bundle Identifier

  1. Select project in navigator
  2. Select target under “Targets”
  3. In “General” tab, set Bundle Identifier
  4. Must match App Store Connect bundle ID

App Icons

Add app icons to ios/YourApp/Images.xcassets/AppIcon.appiconset/:
  • 1024×1024 (App Store)
  • 180×180 (@3x iPhone)
  • 120×120 (@2x iPhone)
  • 87×87 (@3x iPhone Settings)
  • 80×80 (@2x iPhone Spotlight)
  • 58×58 (@2x iPhone Settings)

Launch Screen

Configure in ios/YourApp/LaunchScreen.storyboard or use react-native-splash-screen.

Version and Build Number

<!-- ios/YourApp/Info.plist -->
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleVersion</key>
<string>1</string>

Step 3: Code Signing

  1. In Xcode, select project
  2. Under “Signing & Capabilities”
  3. Check “Automatically manage signing”
  4. Select your team

Manual Signing

  1. Create App ID in Apple Developer Portal
  2. Create Distribution Certificate
  3. Create Provisioning Profile
  4. Download and install in Xcode

Step 4: Build for Release

Clean Build Folder

cd ios
xcodebuild clean

Archive the App

  1. In Xcode, select “Any iOS Device” as destination
  2. Product → Archive
  3. Wait for archive to complete
  4. Organizer window opens automatically

Step 5: Upload to App Store Connect

  1. In Organizer, select your archive
  2. Click “Distribute App”
  3. Select “App Store Connect”
  4. Choose “Upload”
  5. Select signing options
  6. Click “Upload”
Wait for processing (usually 10-30 minutes).
  1. In App Store Connect, go to “TestFlight” tab
  2. Add internal testers (up to 100)
  3. Add external testers (up to 10,000, requires App Review)
  4. Share TestFlight link with testers

Step 7: Submit for Review

  1. In App Store Connect, go to “App Store” tab
  2. Click ”+” next to “iOS App”
  3. Fill in all required information:

App Information

  • Name
  • Subtitle (30 characters)
  • Privacy Policy URL
  • Category (Primary and Secondary)
  • Age Rating

Pricing and Availability

  • Price tier
  • Availability regions
  • Pre-orders (optional)

Version Information

  • What’s New (release notes)
  • Promotional text
  • Description
  • Keywords (100 characters, comma-separated)
  • Support URL
  • Marketing URL (optional)

Screenshots

Required sizes:
  • 6.5” Display (iPhone 14 Pro Max): 1290×2796
  • 5.5” Display (iPhone 8 Plus): 1242×2208
Optional:
  • iPad Pro (3rd gen): 2048×2732

App Review Information

  • Contact information
  • Demo account (if app requires login)
  • Notes for reviewer
  1. Select build from TestFlight
  2. Answer export compliance questions
  3. Click “Submit for Review”
Review times typically range from 24-48 hours. Rejections are common - address feedback and resubmit.

Google Play Store

Prerequisites

  1. Google Play Console Account: $25 one-time fee
  2. Android Studio: For building and signing
  3. Test devices: Physical Android devices

Step 1: Generate Signing Key

Create a keystore file:
cd android/app
keytool -genkeypair -v -storetype PKCS12 -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
You’ll be asked for:
  • Keystore password
  • Key password
  • Your name, organization, city, state, country
Keep the keystore file safe! If you lose it, you cannot update your app.

Step 2: Configure Gradle

Store Keystore Credentials

Create android/gradle.properties (add to .gitignore):
MYAPP_UPLOAD_STORE_FILE=my-release-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=****
MYAPP_UPLOAD_KEY_PASSWORD=****

Configure Build

Edit android/app/build.gradle:
android {
    ...
    defaultConfig { ... }
    signingConfigs {
        release {
            if (project.hasProperty('MYAPP_UPLOAD_STORE_FILE')) {
                storeFile file(MYAPP_UPLOAD_STORE_FILE)
                storePassword MYAPP_UPLOAD_STORE_PASSWORD
                keyAlias MYAPP_UPLOAD_KEY_ALIAS
                keyPassword MYAPP_UPLOAD_KEY_PASSWORD
            }
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro"
        }
    }
}

Step 3: Build Release APK/AAB

cd android
./gradlew bundleRelease
Output: android/app/build/outputs/bundle/release/app-release.aab

APK (Alternative)

cd android
./gradlew assembleRelease
Output: android/app/build/outputs/apk/release/app-release.apk
Google Play requires App Bundles (AAB) for new apps since August 2021. APKs are mainly for direct distribution.

Step 4: Google Play Console Setup

  1. Go to Google Play Console
  2. Click “Create app”
  3. Fill in:
    • App name
    • Default language
    • App or game
    • Free or paid
    • Declarations (content policy, export laws)

Step 5: Complete Store Listing

App Details

  • Short description (80 characters)
  • Full description (4000 characters)
  • App icon (512×512 PNG)
  • Feature graphic (1024×500 JPG/PNG)
  • Screenshots:
    • Phone: At least 2 (16:9 or 9:16 ratio)
    • 7” Tablet: Optional
    • 10” Tablet: Optional

Categorization

  • App category
  • Content rating questionnaire
  • Target audience
  • News app (if applicable)

Contact Details

  • Email
  • Website (optional)
  • Phone (optional)
  • Privacy policy URL

Store Settings

  • App name
  • Default language
  • External marketing

Step 6: Content Rating

  1. Go to “Content rating” section
  2. Fill out IARC questionnaire
  3. Receive ratings for various regions

Step 7: Set Up Release

Production Track

  1. Go to “Production” under “Release”
  2. Click “Create new release”
  3. Upload AAB file
  4. Fill in release notes
  5. Set rollout percentage (optional)
  6. Review and roll out
  1. Set up internal testing track
  2. Add testers by email
  3. Upload build
  4. Share testing link

Closed/Open Testing

  • Closed testing: Limited testers, private
  • Open testing: Anyone with link can join

Step 8: App Review

  1. Complete all required sections in Play Console
  2. Click “Send for review”
  3. Wait for approval (typically 1-3 days)
First app review can take longer. Ensure all policies are followed to avoid rejection.

Post-Launch

iOS

Monitor Reviews

# Respond to user reviews in App Store Connect
# Reviews tab → Read and respond

Analytics

  • App Store Connect provides:
    • Downloads
    • Revenue
    • Crashes
    • Performance metrics

Phased Release

Enable in App Store Connect:
  • Day 1: 1% of users
  • Day 2: 2% of users
  • Day 3: 5% of users
  • Day 4: 10% of users
  • Day 5: 20% of users
  • Day 6: 50% of users
  • Day 7: 100% of users

Android

Staged Rollout

1. Production → Create release
2. Set rollout percentage (e.g., 10%)
3. Monitor for issues
4. Increase percentage gradually
5. Full rollout at 100%

Monitor Health

Google Play Console provides:
  • Crash reports
  • ANRs (App Not Responding)
  • User reviews
  • Pre-launch reports

Updates and Maintenance

Version Numbering

Follow semantic versioning:
MAJOR.MINOR.PATCH

1.0.0 → Initial release
1.0.1 → Bug fix
1.1.0 → New feature
2.0.0 → Breaking change

iOS Updates

<!-- Increment version for each release -->
<key>CFBundleShortVersionString</key>
<string>1.1.0</string>

<!-- Increment build for each upload -->
<key>CFBundleVersion</key>
<string>2</string>

Android Updates

android {
    defaultConfig {
        versionCode 2          // Increment for each release
        versionName "1.1.0"    // User-facing version
    }
}

Common Rejection Reasons

iOS

Issue: App crashes or has broken features.Solution:
  • Test thoroughly on physical devices
  • Provide demo account if login required
  • Ensure all features work
  • Test on multiple iOS versions
Issue: App is too similar to existing apps.Solution:
  • Make your app unique
  • Avoid duplicate functionality
  • Add distinguishing features
  • Improve design and UX

Android

Issue: App contains prohibited content.Solution:
  • Review content policy
  • Remove prohibited content
  • Update age rating if needed
  • Moderate user-generated content
Issue: App has security issues.Solution:
  • Update dependencies
  • Fix SSL/TLS issues
  • Implement proper authentication
  • Secure API communications

Best Practices

  1. Test extensively: Use TestFlight and internal testing
  2. Prepare assets: High-quality icons and screenshots
  3. Write clear descriptions: Highlight key features
  4. Respond to reviews: Engage with users
  5. Monitor crashes: Fix issues quickly
  6. Use staged rollouts: Catch issues early
  7. Keep credentials safe: Store keystore securely
  8. Follow guidelines: Read app store policies
  9. Update regularly: Fix bugs and add features
  10. Track analytics: Understand user behavior

Next Steps

Security

Implement security best practices

Troubleshooting

Solve common publishing issues

Build docs developers (and LLMs) love