Irbisa · Cheatsheet

Release & Store Review

App Store Connect, Play Console, review rejections, phased release, forced update, policy

Middle Developer · 16 questions

  1. 01

    What is the difference between versionCode and versionName, and what rules does Google Play enforce on each?

    versionCode is an integer Play uses to order builds and decide what is an update: it must grow with every upload and can never be reused.

    // app/build.gradle.ktsandroid {    defaultConfig {        versionCode = 42        // must grow with every upload, never reused        versionName = "8.4.0"   // display only, may repeat    }…
  2. 02

    Which testing tracks does Google Play offer, and how do they compare to TestFlight?

    Play has internal, closed and open testing tracks plus production: internal testing reaches up to 100 testers within minutes, while closed and open releases are reviewed like production.

  3. 03

    Your new personal Play developer account cannot publish to production yet. What does Google require first?

    Personal developer accounts created after 13 November 2023 must first run a closed test with at least 12 testers who stay opted in for 14 consecutive days, and then apply for production access in Play Console.

  4. 04

    What happens between uploading a build and users being able to download it on Google Play and the App Store?

    An upload only hands the binary to the store: it is then processed, reviewed and released, and it can stall or be rejected at each step.

  5. 05

    What is the difference between an APK and an Android App Bundle, and what does Play do with the AAB you upload?

    An APK is an installable package; an AAB is a publishing format that cannot be installed.

    ./gradlew bundleRelease   # app/build/outputs/bundle/release/app-release.aab # What Play does, done locally: split APKs from the bundlebundletool build-apks \  --bundle=app/build/outputs/bundle/release/app-release.aab \  --output=app.apks \…
  6. 06

    Marketing wants a new description and screenshots today, but there is no new build. What can you change on each store without one?

    On Play the store listing is published separately from releases, so new text and screenshots go live after a short listing review.

  7. 07

    What are Google Play's target API level requirements, and how do you prepare for a new Android version?

    Every year Play requires new apps and updates to target a recent API level: from 31 August 2026 that is API 36 (Android 16).

  8. 08

    How do Play's staged rollout and Apple's phased release work, and what does halting do to users who already updated?

    Play's staged rollout ships to a percentage of users that you raise by hand; Apple's phased release spreads an update over seven days on a fixed schedule.

  9. 09

    How do you ask for a rating with the Play In-App Review API, and why can you not control whether the dialog appears?

    You request a ReviewInfo from ReviewManager ahead of time and call launchReviewFlow at a natural pause; Play decides whether to show the dialog under a hidden quota and never tells you whether the user rated.

    class ReviewPrompt(private val activity: Activity) {    private val manager = ReviewManagerFactory.create(activity)    private var reviewInfo: ReviewInfo? = null     // Call early, e.g. when the order screen opens: the request is a round trip to Play.    fun prepare() {…
  10. 10

    What are the most common reasons a build is rejected by Google Play or App Store review, and how do you catch them before submitting?

    Most rejections are not about code: the reviewer cannot sign in, the metadata does not match the app, a permission or data practice is undeclared, or digital goods bypass store billing.

  11. 11

    The store rejects your update under a rule you are sure does not apply. How do you handle it?

    First reproduce what the reviewer saw on the exact submitted build with a fresh account: most rejections that look wrong come from a reviewer who could not reach the feature.

  12. 12

    Your release build shows an empty product list from queryProductDetailsAsync although the products exist in Play Console. What is missing?

    Play returns details only for Active products that belong to the same applicationId the build runs under, in an app whose build carrying the Billing Library is uploaded to a track; a payments profile is also needed.

  13. 13

    How do you force users onto a minimum app version on Android, and what changes on iOS?

    Keep the minimum supported version on your server and check it at startup; on Android the Play In-App Updates API can then install the update through the immediate flow.

    class UpdateGate(    private val activity: ComponentActivity,   // create in onCreate, before STARTED    private val minVersionCode: Int,           // from your server, not hardcoded) {    private val manager = AppUpdateManagerFactory.create(activity)    private val launcher = activity.registerForActivityResult(…
  14. 14

    A release at 100% crashes on launch for a third of users. What can you do in the first hour, and what should have existed before?

    Neither store can uninstall or downgrade a build already on phones, so the first hour is about stopping new damage (a server-side switch, halting the rollout) while a hotfix with a higher version number goes through review.

  15. 15

    Play removed your app for a policy violation and installs dropped to zero. What is the recovery path, and what should have existed before?

    Rejection, removal, suspension and termination are different states with different exits: a removed app returns after a compliant update, a suspension needs an appeal and counts as a strike, and termination ends every app on the account.

  16. 16

    How do you make sure store policy deadlines reach your roadmap months ahead instead of blocking a release?

    Treat each policy as a dependency with a fixed date: route announcements to a shared inbox, turn each one into a tracked item with an owner the day it appears, and land the change at least two releases before the deadline.