- App icon from the NK emblem (iOS set, Android adaptive icon, Play 512 icon) - Dark launch screen on both platforms; app locked to portrait; iPhone-only - Info.plist: display name, photo/camera reasons, export compliance - Android release signing from key.properties or Codemagic CM_KEYSTORE_* - codemagic.yaml: iOS to TestFlight, Android to Play internal testing - Account deletion web page; fix trailing dot in email links - docs/app-store-release.md: step-by-step store guide Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
97 lines
5.9 KiB
Markdown
97 lines
5.9 KiB
Markdown
# Releasing Nanga Kathai to Google Play and the App Store
|
||
|
||
| | Android | iOS |
|
||
|---|---|---|
|
||
| App ID | `com.metatroncubesolutions.nanga_kathai` | `com.metatroncubesolutions.nangaKathai` |
|
||
| Built by | Codemagic (`android-release`) or locally | Codemagic (`ios-release`) |
|
||
| First stop | Play Console, Internal testing | TestFlight |
|
||
|
||
The version comes from `pubspec.yaml` (`version: 1.0.0+1`). Raise the first part (1.0.1, 1.1.0…) for
|
||
each store release. Build numbers are set automatically by Codemagic.
|
||
|
||
## 1. Accounts (one-time)
|
||
|
||
- **Apple Developer Program** (US$99 a year), enrolled as an organisation. This needs a D-U-N-S
|
||
number for Metatroncube Software Solutions.
|
||
- **Google Play Console** (US$25 once), as an organisation account. A *personal* account must run
|
||
a closed test with at least 12 testers for 14 days before it can publish, so use an organisation account.
|
||
- **Codemagic**, signed in with GitHub, with the `metatroncubeswdev/nkbmusic_app` repo added.
|
||
|
||
## 2. Codemagic setup (one-time)
|
||
|
||
1. **Variables.** Open App settings > Environment variables and create the group **`nk_app`** with:
|
||
- `SUPABASE_URL` = `https://app.nkbmusic.com`
|
||
- `SUPABASE_PUBLISHABLE_KEY` = the value from your local `env.json`
|
||
- `MEDIA_BASE_URL` = `https://app.nkbmusic.com/storage/v1/object/public/audio`
|
||
2. **App Store Connect API key.**
|
||
- In App Store Connect, open Users and Access > Integrations > App Store Connect API and generate a key with the **App Manager** role.
|
||
- In Codemagic, open Team settings > Team integrations > Developer Portal and add the key with the name **`NK App Store Connect`**.
|
||
3. **iOS signing.** Open Team settings > codemagic.yaml settings > Code signing identities.
|
||
- Under iOS certificates, generate an **Apple Distribution** certificate.
|
||
- Under iOS provisioning profiles, fetch the **App Store** profile for `com.metatroncubesolutions.nangaKathai`. Create that profile on developer.apple.com first if it doesn't exist (see step 3.1).
|
||
4. **Android signing.** On the same page, under Android keystores, upload
|
||
`C:\Users\manes\nk-keys\nk-upload.jks` with the reference name **`nk_upload_keystore`**,
|
||
alias `upload`. The password is in `C:\Users\manes\nk-keys\key.properties.backup`.
|
||
5. **Google Play publishing (optional).**
|
||
- Create a Google Cloud service account, invite it in Play Console > Users and permissions with release rights, and download its JSON key.
|
||
- Store the key as `GCLOUD_SERVICE_ACCOUNT_CREDENTIALS` (secure) in a variable group **`nk_google_play`**.
|
||
|
||
## 3. iOS: first release
|
||
|
||
1. On developer.apple.com, open Identifiers and register the App ID
|
||
`com.metatroncubesolutions.nangaKathai`. In-App Purchase is on by default. Background audio
|
||
needs nothing extra.
|
||
2. In App Store Connect, create the app with the name **Nanga Kathai**, that bundle ID, and primary language English (India or UK).
|
||
3. In Codemagic, start the **iOS release (TestFlight)** workflow, or push a tag:
|
||
`git tag v1.0.0 && git push github v1.0.0`.
|
||
The build is uploaded to TestFlight automatically after about 20–30 minutes plus Apple processing.
|
||
4. Test it from the TestFlight app on an iPhone.
|
||
5. Fill in the listing (section 5) and submit for review.
|
||
|
||
## 4. Android: first release
|
||
|
||
1. In Play Console, create the app: Nanga Kathai, App, Free.
|
||
2. Build the first bundle locally and upload it manually. Google requires the very first upload to be done by hand.
|
||
```
|
||
flutter build appbundle --release --dart-define-from-file=env.json
|
||
```
|
||
The file is `build/app/outputs/bundle/release/app-release.aab`. Upload it under Testing >
|
||
Internal testing > Create release. Accept **Play App Signing**: Google keeps the app signing key,
|
||
and you sign uploads with `nk-upload.jks`.
|
||
3. Later builds come from the Codemagic **Android release** workflow, which uploads a draft to Internal testing.
|
||
4. Promote it from Internal testing, to Closed testing (optional), to Production.
|
||
|
||
## 5. Store listing checklist
|
||
|
||
**Links (publish the files from `site/` on nkbmusic.com first)**
|
||
- Privacy Policy: `https://nkbmusic.com/privacy`
|
||
- Terms: `https://nkbmusic.com/terms`
|
||
- Account deletion (required by Play): `https://nkbmusic.com/delete-account`
|
||
- Support: `support@nkbmusic.com`
|
||
|
||
**Graphics** (in `assets/brand/`: `app_icon_1024.png` and `play_store_icon_512.png`)
|
||
- Play: a 512×512 icon, a 1024×500 feature graphic, and 2–8 phone screenshots.
|
||
- App Store: 6.9-inch iPhone screenshots (1320×2868). The app is iPhone-only, so no iPad screenshots are needed.
|
||
|
||
**Questionnaires**
|
||
- **Data collected** (Play Data safety and Apple App Privacy):
|
||
- email, name, optional phone and photo;
|
||
- app interactions (plays) and crash/diagnostics data if crash reporting is added;
|
||
- not used for tracking or ads, data encrypted in transit, users can request deletion.
|
||
- **Content rating:** music app, no violence and no user chat. Expect *Everyone* / *4+*.
|
||
- **Ads:** none. **In-app purchases:** yes (the Support products in `docs/support-payments.md`).
|
||
|
||
**App Review notes (important)**
|
||
- Create a reviewer account (for example `review@nkbmusic.com`) with a password, and enter it as the sign-in details. Apple and Google can't receive the email code.
|
||
- **Music rights** are the most likely reason for a rejection (Apple guideline 5.2.3 and Google's IP
|
||
policy). Explain it in the notes: *"Nanga Kathai preserves Badaga community music from a family
|
||
collection. Every song has an in-app 'Is this your song?' claim or removal option, and we act on
|
||
requests promptly. New songs will come only from verified creators who confirm their rights."*
|
||
Keep written permission from any singers you can reach, in case review asks.
|
||
|
||
## 6. Keys: back these up now
|
||
|
||
`C:\Users\manes\nk-keys\` holds the Android upload key and its password. Copy that folder to
|
||
two safe places, such as a password manager and an offline drive. If it is lost, Google can reset
|
||
the upload key, but that takes a support request and several days. Never commit it to git.
|