Store mistakes
Every item here happened while we shipped our first mobile apps to both stores. Read it in your first week, and add to it after every rejection.
The pattern behind most of them
Most store bugs only exist in the release build, installed from the store, on the other flavor or device. Test that combination before every submission.
Review
- Eight iOS review rounds for the first release. User-generated content moderation, an error screen, business model, AI data sharing twice, microphone permission, support URL. See Getting through review.
- Prices live on the website before the app could sell anything. 2.1(b) rejection.
- Consent for AI on the first-run screen instead of before each AI feature. Rejected.
- A listing rejected for "#1" claims inside screenshots.
- The review account broke itself on sign-in, then the app refused it at sign-up.
- A fixed review code was committed and live in production.
- The app was removed from one country's store after approval, for content that is illegal there. Check which storefronts you publish to.
Identifiers and signing
- A production bundle id had to be abandoned because Apple cannot rename it.
- Google Sign-In failed only on Play builds: missing Play app signing SHA.
- Wrong signing key on upload.
- Sign-in schemes hard-coded to one flavor.
- Build numbers collided from manual bumps on parallel branches.
Builds
- Launch crash on a new iOS after the scene lifecycle had been disabled.
- New Xcode could not archive old pod deployment targets.
- Archive failed after a dependency-manager change: stale crash-symbol build phase.
- CI out of memory, missing secrets, wrong Ruby, wrong framework version.
- A crash fix existed only on a side branch while the release branches still had the bug. After a hotfix, check it is merged into every release branch.
Declarations
- Advertising-id permission shipped while Data safety said no.
- Age rating, terms and policy disagreed across the stores.
- The deletion URL and support URL filed in the stores were moved by a website rebuild. Store-filed URLs are permanent; redirect, never delete.
- An analytics SDK's domain was missing from the privacy manifest.
Updates
- Users stuck on an old Android build with no force-update gate.