iOS Deployment
App Store Connect
- 1Create App ID
- Go to Apple Developer Portal - Identifiers → App IDs → Register App
- 1Provisioning Profile
- Create provisioning profile - Download and install
- 1Code Signing
bash
# Generate certificate
openssl genrsa -out mykey.key 2048
openssl req -new -key mykey.key -out CertificateSigningRequest.certSigningRequest- 1Xcode Configuration
xml
<!-- ios/MyApp/Info.plist -->
<key>CFBundleIdentifier</key>
<string>com.company.myapp</string>
<key>CFBundleVersion</key>
<string>1.0.0</string>- 1Archive
bash
# Build archive
npx react-native run-ios --configuration Release
# Or use Xcode
Product → Archive- 1Upload to App Store
bash
# Using Xcode
Window → Organizer → Archive → UploadTestFlight
- 1Internal Testing
- Add internal testers - Distribute via TestFlight
- 1External Testing
- Create external testing group - Share public link
Android Deployment
Google Play Console
- 1Create App
- Go to Google Play Console - Create application
- 1Generate Signed APK/AAB
bash
# Generate signing key
keytool -genkeypair -v -storetype PKCS12 -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000- 1Configure Gradle
groovy
// android/app/build.gradle
android {
signingConfigs {
release {
storeFile file('my-upload-key.keystore')
storePassword 'password'
keyAlias 'my-key-alias'
keyPassword 'password'
}
}
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}- 1Build Release Bundle
bash
cd android
./gradlew bundleRelease- 1Upload to Play Console
- Go to Release → Production - Upload AAB file
Testing Tracks
- 1Internal Testing: Quick testing
- 2Closed Testing: Beta testers
- 3Open Testing: Public beta
- 4Production: Full release
CI/CD
GitHub Actions
yaml
name: Build and Deploy
on:
push:
tags:
- 'v*'
jobs:
build-ios:
runs-on: macos-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '18'
- name: Install dependencies
run: npm ci
- name: Build iOS
run: |
cd ios
pod install
xcodebuild -workspace MyApp.xcworkspace -scheme MyApp -configuration Release archiveFastlane
ruby
# Fastfile
lane :beta do
increment_build_number
build_app(scheme: "MyApp")
upload_to_testflight
end
lane :release do
increment_build_number
build_app(scheme: "MyApp")
upload_to_app_store
endVersion Management
Semantic Versioning
json
{
"version": "1.0.0",
"buildNumber": "100"
}Auto-Increment
javascript
// package.json
{
"scripts": {
"version:patch": "npm version patch && cd ios && pod install",
"version:minor": "npm version minor && cd ios && pod install",
"version:major": "npm version major && cd ios && pod install"
}
}App Icons & Splash Screens
Generate Icons
bash
npm install -g react-native-icon-setter
react-native-icon-setter icon.pngSplash Screen
bash
npm install react-native-splash-screenStore Listing
Screenshots
- iPhone 6.7" Display (1290x2796)
- iPhone 6.5" Display (1242x2688)
- Android Phone (1080x1920)
Description
Brief description (80 chars): App description here
Full description: Detailed description with featuresKeywords
iOS: Separate with commas
Android: Separate with spacesUpdates
iOS Updates
- 1Increment version
- 2Build and archive
- 3Upload to App Store Connect
- 4Submit for review
Android Updates
- 1Increment version
- 2Build AAB
- 3Upload to Play Console
- 4Roll out to production
Best Practices
- 1Test thoroughly: Before submission
- 2Follow guidelines: Store policies
- 3Prepare assets: Screenshots, icons
- 4Optimize size: Reduce bundle size
- 5Monitor crashes: Use crash reporting
- 6Gather feedback: Early access testing
Conclusion
Deploying to stores requires attention to detail. Follow the process carefully for successful submissions.