# React Native Deployment & Usage Guide
## 1. Prerequisites
### Development Environment
- **Node.js**: LTS version (18.x or newer recommended)
- **Package Manager**: npm, Yarn, or pnpm
- **Watchman**: Required for macOS and Linux development (`brew install watchman`)
- **Git**: For version control and cloning repositories
### Platform-Specific Requirements
**iOS Development (macOS only)**
- macOS 13.5 or newer
- Xcode 15.0 or newer (includes iOS 15.1+ SDK)
- CocoaPods: `sudo gem install cocoapods`
- iOS Simulator or physical device running iOS 15.1+
**Android Development (Windows/macOS/Linux)**
- Android Studio (latest stable)
- Android SDK 34 (compileSdkVersion)
- Android 7.0 (API 24) minimum for devices/emulators
- JDK 17 (OpenJDK or Oracle)
- Android Virtual Device (AVD) or physical device with USB debugging enabled
**Note**: Building iOS apps requires macOS. Windows/Linux users can use [Expo](https://expo.dev) to develop iOS apps via cloud builds.
## 2. Installation
### Option A: New Application (Recommended)
Using React Native CLI:
```bash
npx react-native@latest init MyApp --version latest
cd MyApp
Using Expo (zero-config alternative):
npx create-expo-app MyApp
cd MyApp
Option B: Integrate into Existing App
Follow the Integration Guide for adding React Native to existing Android (Gradle) or iOS (Xcode) projects.
Option C: Build React Native from Source (Contributors)
git clone https://github.com/facebook/react-native.git
cd react-native
yarn install
3. Configuration
Environment Variables
Android (Required)
Add to ~/.bashrc, ~/.zshrc, or Windows System Environment:
export ANDROID_HOME=$HOME/Library/Android/sdk # macOS/Linux
# or export ANDROID_HOME=%LOCALAPPDATA%\Android\Sdk # Windows
export PATH=$PATH:$ANDROID_HOME/emulator
export PATH=$PATH:$ANDROID_HOME/platform-tools
export PATH=$PATH:$ANDROID_HOME/cmdline-tools/latest/bin
iOS (macOS) Ensure Xcode command line tools are selected:
sudo xcode-select --switch /Applications/Xcode.app
sudo xcodebuild -runFirstLaunch
Project Configuration
iOS Dependencies
cd ios && pod install && cd ..
Android Gradle (Optional)
Edit android/gradle.properties for memory settings:
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m
4. Build & Run
Development Server
Start Metro bundler (keep running in separate terminal):
npx react-native start
# or
npm start
iOS
# Run on iOS Simulator (default)
npx react-native run-ios
# Run on specific device
npx react-native run-ios --device "iPhone 15 Pro"
# Run on physical device (requires signing configuration in Xcode)
npx react-native run-ios --device
Android
# Ensure emulator is running or device is connected
npx react-native run-android
# Run on specific variant
npx react-native run-android --variant=release
Debugging
- Flipper: Install Flipper Desktop for debugging (included in React Native 0.71+)
- Hermes: Enabled by default for performance; use Chrome DevTools via
chrome://inspect - React DevTools: Run
npx react-devtoolsfor component inspection
Production Builds
iOS
cd ios
xcodebuild -workspace MyApp.xcworkspace -scheme MyApp -configuration Release -sdk iphoneos
Android
cd android
./gradlew assembleRelease # APK output: android/app/build/outputs/apk/release/
./gradlew bundleRelease # AAB for Play Store
5. Deployment
iOS (App Store)
- Configure signing in Xcode:
ios/MyApp.xcworkspace→ Signing & Capabilities - Archive: Product → Archive
- Upload via Xcode Organizer or Transporter app
- Submit through App Store Connect
Android (Google Play)
- Generate upload key (one-time):
keytool -genkey -v -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000 - Place in
android/app/and configureandroid/gradle.properties:MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore MYAPP_UPLOAD_KEY_ALIAS=my-key-alias MYAPP_UPLOAD_STORE_PASSWORD=***** MYAPP_UPLOAD_KEY_PASSWORD=***** - Build AAB:
cd android && ./gradlew bundleRelease - Upload
android/app/build/outputs/bundle/release/*.aabto Google Play Console
Alternative Platforms
- Expo EAS:
eas build --platform allfor cloud builds without local native setup - Microsoft CodePush: For OTA JavaScript updates without store submission
- Firebase App Distribution: For beta testing
6. Troubleshooting
Metro Bundler Issues
Error: Error: listen EADDRINUSE: Address already in use :::8081
npx react-native start --port 8088
# Update iOS: npx react-native run-ios --port 8088
Error: Unable to resolve module
npx react-native start --reset-cache
# or
npm start -- --reset-cache
iOS Build Failures
CocoaPods Errors:
cd ios && pod deintegrate && pod install --repo-update
Xcode Build Failures:
- Clean build folder:
Cmd+Shift+Kin Xcode - Reset simulator: Device → Erase All Content and Settings
Android Build Failures
Gradle Daemon Issues:
cd android && ./gradlew --stop && ./gradlew clean
SDK/NDK Not Found:
- Verify
ANDROID_HOMEpoints to correct SDK location - Install missing components via Android Studio SDK Manager
Duplicate Classes/Dex Merge Errors:
Check for conflicting dependencies in android/app/build.gradle:
implementation("com.example:library:1.0.0") {
exclude group: 'com.conflicting.group'
}
Runtime Issues
App crashes immediately:
- Check
adb logcat(Android) or Xcode Console (iOS) for native stack traces - Verify Hermes is enabled consistently across builds:
npx react-native info
Network requests failing (iOS):
Add to ios/MyApp/Info.plist:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Performance
- Enable Hermes: Verify in
android/app/build.gradleandios/Podfile - Use Flipper to profile JavaScript and native threads
- Enable ProGuard/R8 for Android release builds (enabled by default in new projects)