234 lines
6.9 KiB
Markdown
234 lines
6.9 KiB
Markdown
# App Store Submission Guide
|
|
|
|
Complete guide for publishing the Expo React Native app to Apple App Store and Google Play Store.
|
|
|
|
## 1. Prerequisites
|
|
|
|
### Accounts & Fees
|
|
|
|
| Platform | Cost | Notes |
|
|
|----------|------|-------|
|
|
| Apple Developer Program | $99/year | Required for App Store distribution |
|
|
| Google Play Console | $25 one-time | Developer registration |
|
|
| Expo Account | Free (paid plans available) | Required for EAS Build/Submit |
|
|
|
|
- Apple Developer account review: 1-2 days
|
|
- Google Play developer account review: days to weeks
|
|
|
|
### Tools
|
|
|
|
```bash
|
|
npm install -g eas-cli
|
|
eas login
|
|
eas whoami # verify login
|
|
```
|
|
|
|
## 2. Project Configuration
|
|
|
|
### Initialize EAS
|
|
|
|
```bash
|
|
eas build:configure
|
|
```
|
|
|
|
Generates `eas.json` with three build profiles: `development`, `preview`, `production`.
|
|
|
|
### Key `app.json` / `app.config.ts` Fields
|
|
|
|
```jsonc
|
|
{
|
|
"name": "Multica",
|
|
"slug": "multica",
|
|
"version": "1.0.0",
|
|
"ios": {
|
|
"bundleIdentifier": "com.multica.app",
|
|
"buildNumber": "1" // increment on each submission
|
|
},
|
|
"android": {
|
|
"package": "com.multica.app",
|
|
"versionCode": 1 // increment on each submission
|
|
},
|
|
"icon": "./assets/icon.png", // 1024x1024 PNG
|
|
"splash": {
|
|
"image": "./assets/splash.png"
|
|
}
|
|
}
|
|
```
|
|
|
|
## 3. App Signing & Credentials
|
|
|
|
### iOS
|
|
|
|
- EAS auto-manages credentials (recommended): Distribution Certificate + Provisioning Profile
|
|
- Or create manually in Apple Developer Portal
|
|
|
|
### Android
|
|
|
|
- EAS auto-generates Keystore (recommended), stored securely on EAS servers
|
|
- **Back up Keystore** — losing it means you cannot update the published app
|
|
- Play Store requires AAB (Android App Bundle) format
|
|
|
|
## 4. Production Build
|
|
|
|
```bash
|
|
# iOS
|
|
eas build --platform ios --profile production
|
|
|
|
# Android
|
|
eas build --platform android --profile production
|
|
|
|
# Both
|
|
eas build --platform all --profile production
|
|
```
|
|
|
|
Builds run in Expo cloud — no local Xcode or Android Studio needed.
|
|
|
|
## 5. Store Listing Preparation
|
|
|
|
### Required for Both Platforms
|
|
|
|
#### Privacy Policy
|
|
|
|
- **Mandatory** — must be a publicly accessible URL
|
|
- Must clearly state:
|
|
- What data the app collects and how
|
|
- Whether data is shared with third parties
|
|
- Data retention and deletion policies
|
|
- How users can request data deletion
|
|
- **2025 rule**: If data is sent to third-party AI, must disclose explicitly and obtain user consent
|
|
- Tools: Termly, PrivacyPolicies.com, or custom page
|
|
|
|
#### App Screenshots
|
|
|
|
- **iOS**: Multiple sizes required (6.7", 6.5", 5.5" iPhone + iPad)
|
|
- **Android**: 2-8 screenshots
|
|
- Must accurately reflect current app interface
|
|
|
|
#### App Icon
|
|
|
|
- 1024x1024 high-resolution PNG
|
|
- No alpha/transparency for iOS
|
|
|
|
#### App Description
|
|
|
|
- Short description (≤80 chars for Google Play)
|
|
- Full description
|
|
|
|
#### Support URL
|
|
|
|
- A link where users can get help
|
|
|
|
#### Account Deletion
|
|
|
|
- If the app supports registration, users **must** be able to delete their account and data in-app
|
|
- Both Apple and Google require this
|
|
|
|
### Apple App Store Connect — Additional Requirements
|
|
|
|
| Item | Details |
|
|
|------|---------|
|
|
| Privacy Nutrition Labels | Fill out data collection practices per category in App Store Connect |
|
|
| App Review Information | Reviewer contact info, demo/test account credentials |
|
|
| Content Rating | Age classification |
|
|
| Export Compliance | Encryption usage declaration |
|
|
| Info.plist Permission Strings | Clear purpose description for each permission (camera, location, etc.) |
|
|
|
|
### Google Play Console — Additional Requirements
|
|
|
|
| Item | Details |
|
|
|------|---------|
|
|
| Data Safety Form | Detail data collection and sharing (required even if no data is collected) |
|
|
| Content Rating Questionnaire | IARC rating questionnaire |
|
|
| Target Audience | Declare if the app targets children |
|
|
| First Upload | Must be done manually via Play Console (Google Play API limitation) |
|
|
|
|
## 6. Submit to Stores
|
|
|
|
### Apple App Store
|
|
|
|
```bash
|
|
eas submit --platform ios
|
|
```
|
|
|
|
This uploads the build to **App Store Connect / TestFlight**. Then you must:
|
|
|
|
1. Log into App Store Connect
|
|
2. Select the uploaded build
|
|
3. Associate it with a version
|
|
4. Fill in all metadata, screenshots, privacy labels
|
|
5. Submit for App Review
|
|
|
|
### Google Play Store
|
|
|
|
```bash
|
|
eas submit --platform android
|
|
```
|
|
|
|
**First time**: Must upload AAB manually in Play Console.
|
|
|
|
After initial upload:
|
|
1. Navigate to Production → Create new release
|
|
2. Upload AAB or use the EAS-submitted build
|
|
3. Fill in description, screenshots, data safety form
|
|
4. Submit for review
|
|
|
|
### Auto-Submit (Optional)
|
|
|
|
```bash
|
|
eas build --platform all --profile production --auto-submit
|
|
```
|
|
|
|
## 7. App Review
|
|
|
|
| | Apple | Google |
|
|
|---|---|---|
|
|
| Review time | Typically 24-48 hours | Hours to 7 days |
|
|
| Common rejections | Incomplete features, misleading screenshots, missing privacy policy, unclear permission strings | Data safety form mismatch, policy violations |
|
|
| After rejection | Fix issues, resubmit | Fix issues, resubmit |
|
|
|
|
## 8. Post-Launch
|
|
|
|
### OTA Updates (No Re-Review Needed)
|
|
|
|
```bash
|
|
eas update --branch production
|
|
```
|
|
|
|
- Only for JS/asset-level changes
|
|
- Native code changes still require a new build + review
|
|
|
|
### CI/CD Automation
|
|
|
|
Create `.eas/workflows/build-and-submit.yml` to auto-build and submit on push to main.
|
|
|
|
### Google Service Account Key (for Automated Android Submissions)
|
|
|
|
1. Go to EAS dashboard → Credentials → Android
|
|
2. Click Application identifier → Service Credentials
|
|
3. Add Google Service Account Key
|
|
|
|
## 9. Checklist
|
|
|
|
- [ ] Register Apple Developer + Google Play Console accounts
|
|
- [ ] Configure `app.json` and `eas.json`
|
|
- [ ] Prepare app icon, splash screen, screenshots
|
|
- [ ] Write and host privacy policy URL
|
|
- [ ] Implement in-app account deletion (if registration exists)
|
|
- [ ] Add Info.plist permission descriptions (iOS)
|
|
- [ ] Run `eas build --platform all --profile production`
|
|
- [ ] Create app in App Store Connect, fill metadata + privacy labels
|
|
- [ ] Create app in Google Play Console, fill data safety form, manual first AAB upload
|
|
- [ ] `eas submit` or submit manually for review
|
|
- [ ] Wait for review approval → live
|
|
- [ ] Set up `eas update` for OTA updates
|
|
|
|
## References
|
|
|
|
- [Expo: Submit to App Stores](https://docs.expo.dev/deploy/submit-to-app-stores/)
|
|
- [Expo: EAS Submit](https://docs.expo.dev/submit/introduction/)
|
|
- [Expo: Build Your Project](https://docs.expo.dev/deploy/build-project/)
|
|
- [Expo: App Stores Best Practices](https://docs.expo.dev/distribution/app-stores/)
|
|
- [Apple App Review Guidelines](https://developer.apple.com/app-store/review/guidelines/)
|
|
- [Apple App Privacy Details](https://developer.apple.com/app-store/app-privacy-details/)
|
|
- [Google Play Data Safety](https://support.google.com/googleplay/android-developer/answer/10787469)
|
|
- [Google Play Developer Policy Center](https://play.google/developer-content-policy/)
|