mobile-app-distribution
SKILL.md
Mobile App Distribution
Publish React Native apps to Apple App Store and Google Play Store. Covers signing, building, submitting, and passing review.
Quick Reference
| Topic | Reference |
|---|---|
| Android Signing & Publishing | Upload key, Gradle config, AAB/APK, ProGuard, Google Play |
| iOS Publishing | Xcode release scheme, archiving, App Store Connect, TestFlight |
| App Store Review Guidelines | Apple's review rules — safety, performance, business, design, legal |
| Pre-Submission Checklist | Both platforms — signing, metadata, screenshots, compliance |
Android: Key Steps
1. Generate upload key
keytool -genkeypair -v -storetype PKCS12 -keystore my-upload-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
2. Configure Gradle signing
Add to ~/.gradle/gradle.properties (not project, to avoid Git commits):
MYAPP_UPLOAD_STORE_FILE=my-upload-key.keystore
MYAPP_UPLOAD_KEY_ALIAS=my-key-alias
MYAPP_UPLOAD_STORE_PASSWORD=*****
MYAPP_UPLOAD_KEY_PASSWORD=*****
Add signing config to android/app/build.gradle:
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
}
}
3. Build release AAB
npx react-native build-android --mode=release
Output: android/app/build/outputs/bundle/release/app-release.aab
4. Test release build
npx react-native run-android --mode=release
iOS: Key Steps
1. Configure release scheme
Xcode: Product > Scheme > Edit Scheme > Run > Build Configuration > Release
2. Build and archive
- Set device to Any iOS Device (arm64)
- Product > Archive
- Verify Bundle Identifier matches Apple Developer Dashboard
3. Submit
- Archive window: Distribute App > App Store Connect > Upload
- Find build in App Store Connect under TestFlight
- Fill metadata, select build, Submit For Review
CLI alternative
npx react-native run-ios --mode=Release
Apple Review: Common Rejection Reasons
| Reason | Guideline | Fix |
|---|---|---|
| Crashes/bugs | 2.1 | Test thoroughly, fix all crashes before submission |
| Incomplete metadata | 2.3 | Complete all fields, accurate screenshots showing app in use |
| Login required without demo | 2.1 | Provide demo account in App Review notes |
| Missing privacy policy | 5.1.1 | Add privacy policy link in App Store Connect and within app |
| Requesting unnecessary permissions | 5.1.1(iii) | Only request data relevant to core functionality |
| Hidden features | 2.3.1 | Describe all features in Notes for Review |
| In-app purchase bypass | 3.1.1 | Use Apple IAP for digital content/features |
| No account deletion | 5.1.1(v) | Offer account deletion if supporting account creation |
| Minimum functionality | 4.2 | App must be more than a repackaged website |
| Missing Sign in with Apple | 4.8 | Required when offering third-party social login |
Key Rules
- Keep keystore private — if Android upload key is compromised, follow Google's reset process
- Never commit signing credentials to Git — use
~/.gradle/gradle.propertiesor CI secrets - Ensure
gradle.propertiesdoes not haveorg.gradle.configureondemand=true— breaks JS bundling - Test release builds on device before submitting
- Screenshots must show app in use — not splash screens or login pages
- Privacy policy is mandatory for both platforms
- Expo users: Use
expo buildor EAS Build for automated distribution
Weekly Installs
4
Repository
0xkynz/codekitGitHub Stars
1
First Seen
11 days ago
Security Audits
Installed on
opencode4
antigravity4
claude-code4
github-copilot4
codex4
zencoder4