-
App icon requirements.
| Platform | Size | Format | Notes |
|---|
| iOS | 1024x1024 px | PNG, no alpha | Single icon; iOS generates all sizes |
| Android | 512x512 px | PNG, 32-bit | Used in Play Store listing |
| Adaptive (Android) | 108x108 dp foreground + background | PNG | For launcher; configure in app.json |
In Expo app.json:
{
"expo": {
"icon": "./assets/icon.png",
"android": {
"adaptiveIcon": {
"foregroundImage": "./assets/adaptive-icon.png",
"backgroundColor": "#FFFFFF"
}
}
}
}
Tips: no transparency on iOS (Apple rejects it), no text in the icon (does not scale), test on dark and light wallpapers.
-
Screenshot requirements.
iOS (App Store Connect):
| Device | Size (portrait) | Required |
|---|
| iPhone 6.7" (15 Pro Max) | 1290 x 2796 | Yes (at minimum one set) |
| iPhone 6.5" (11 Pro Max) | 1242 x 2688 | Recommended |
| iPhone 5.5" (8 Plus) | 1242 x 2208 | Only if supporting older devices |
| iPad Pro 12.9" | 2048 x 2732 | Required if iPad app |
Minimum 1 screenshot, maximum 10 per device size. First 3 are visible in search results.
Android (Play Console):
| Type | Size | Required |
|---|
| Phone | 320-3840 px, 16:9 or 9:16 | Min 2, max 8 |
| Tablet 7" | 320-3840 px | If targeting tablets |
| Tablet 10" | 320-3840 px | If targeting tablets |
| Feature graphic | 1024 x 500 | Required |
Tips: use real device screenshots with a clean status bar, or design marketing frames. Tools: Fastlane screengrab/snapshot, or design in Figma with device frames.
-
App metadata.
iOS:
| Field | Limit | Notes |
|---|
| App Name | 30 chars | Shown below icon; cannot include generic terms alone |
| Subtitle | 30 chars | Appears below name in search |
| Keywords | 100 chars | Comma-separated, not visible to users |
| Description | 4000 chars | Not indexed for search; sell the app |
| Promotional Text | 170 chars | Can update without new build |
| What's New | 4000 chars | Release notes |
Android:
| Field | Limit | Notes |
|---|
| App Name | 30 chars | Title in Play Store |
| Short Description | 80 chars | Shown in listing header |
| Full Description | 4000 chars | Indexed for search |
-
Privacy policy. Both stores require a publicly accessible privacy policy URL. Must cover:
- What data is collected
- How data is used
- Third-party services (analytics, crash reporting, ads)
- Data retention and deletion policy
- Contact information
Set in app.json:
{
"expo": {
"ios": {
"privacyManifests": {
"NSPrivacyAccessedAPITypes": []
}
}
}
}
And provide the URL in App Store Connect / Play Console.
-
Age rating / content rating.
- iOS: Fill the age rating questionnaire in App Store Connect (violence, language, etc.). Apple updated the age rating system in January 2026; review your responses.
- Android: Complete the content rating questionnaire in Play Console (uses IARC system)
Both are required before the first submission.
-
Review guideline checklist. Common rejection reasons:
| Issue | Platform | How to avoid |
|---|
| Crashes on launch | Both | Test on real devices, not just simulators |
| Placeholder content | Both | Remove "lorem ipsum" and test data |
| Missing login credentials | iOS | Provide demo account in review notes |
| No privacy policy | Both | Add URL before submitting |
| Misleading metadata | Both | Screenshots must show actual app UI |
| External payment links | iOS | Do not link to web payment outside IAP |
| Missing App Tracking Transparency | iOS | Add ATT prompt if using IDFA |
| Missing AI disclosure | iOS | If using AI, explain what it does and what data it uses |
| Target API too low | Android | Must target latest or latest-1 API level (API 36 from Aug 2026) |
-
Version numbering.
{
"expo": {
"version": "1.0.0",
"ios": {
"buildNumber": "1"
},
"android": {
"versionCode": 1
}
}
}
version (semver): displayed to users in the store
buildNumber (iOS): must increment for each upload to App Store Connect
versionCode (Android): must increment for each upload to Play Console