nkbmusic/docs/app-store-release.md
metatroncubeswdev db6abdefd3 Codemagic: pass the iOS certificate key base64-encoded and stop on signing errors
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-31 15:15:32 -04:00

6.2 KiB
Raw Blame History

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 clickstocart-app (already added; it works for every app in the Apple team).
  3. iOS signing (automatic). The build creates the Apple Distribution certificate and the App Store profile itself through the API key, so no profiles are made by hand.
    • Create a variable group nk_ios_signing with CERTIFICATE_PRIVATE_KEY_BASE64 (secure).
    • Its value is the one line in C:\Users\manes\nk-keys\ios_distribution_private_key.base64.txt.
    • The API key needs the Admin role, or App Manager with access to Certificates, Identifiers & Profiles.
    • Apple allows only a few distribution certificates per team. If the limit is reached, revoke an unused one on developer.apple.com.
  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.