Release Mobile
Ship a working app to App Store and Play Store. Code quality is out of scope — this is purely release mechanics.
Versioning
- iOS:
CFBundleShortVersionString(semver) +CFBundleVersion(monotonic integer). Both must bump per submission. - Android:
versionName(semver) +versionCode(integer, must increase per track upload). - Automate bumps in CI — never hand-edit
Info.plistorbuild.gradlein PRs.
iOS — Signing and Build
- Certificates: Development (local), Distribution (App Store/Ad Hoc). Store in Keychain or CI secret; never in the repo.
- Provisioning profiles: match bundle ID, capabilities, and certificate. Regenerate when a device or capability changes.
- Archive:
xcodebuild archive -scheme <Scheme> -archivePath out.xcarchive - Export:
xcodebuild -exportArchive -archivePath out.xcarchive -exportPath out/ -exportOptionsPlist export.plist export.plistmust setmethod: app-storeandsigningCertificate.- Automate: Fastlane
match(cert/profile sync) +gym(build) +pilot(TestFlight) +deliver(App Store).
iOS — Submission
- Upload via
xcrun altool, Transporter, orfastlane deliver. - Required: release notes, screenshots per device family, privacy manifest (required since iOS 17).
- Phased rollout: 1% → 2% → 5% → 10% → 20% → 50% → 100% over 7 days. Pause if crash rate spikes.
- Review: typically 24–48 h; expedited review available for critical fixes.
Android — Signing and Build
- Keystore: generate once, store securely — never commit. Fields: alias, key password, store password.
- Build AAB (preferred):
./gradlew bundleRelease. ConfiguresigningConfigsfrom env vars. - Automate: Fastlane
supplyor the Play Developer API.
Play Store Tracks
Internal → Closed testing → Open testing → Production. Promote via Console or API — no rebuild needed. Same 1%→100% rollout pattern; monitor ANR and crash rates before expanding.
OTA Updates (React Native / Expo)
- Expo EAS Update / CodePush: push JS + assets without App Store review.
- JS/assets only — native changes, permission changes, and payment flows always need a store release.
CI Pipeline
branch push → build + unit tests
tag vX.Y.Z → sign → upload TestFlight / Play internal → notify QA
manual gate → promote to production track
Guardrails
- Rotate certificates and keystore passwords annually; record expiry dates.
- Test the release build (not debug) on a real device before submitting.
- Never store signing credentials in the repository.