What it takes to ship on both stores
One codebase, two stores. They agree on almost nothing beyond that, and most of the distance between a finished build and a listing is not code.
Decided before anything is written
- One identifier on both sides. The iOS bundle identifier and the Android package should be the same string, and it is a day-one decision: changing either one later means a new listing and a new install base.
- iOS wants a sentence, not a checkbox. Every sensitive permission carries its own explanation, shown to the person at the moment it is asked for. Write it badly and you are asking a stranger for their movement data with no reason attached.
- Android wants the permission declared. Activity recognition for a step counter, and so on for the rest: the manifest says up front what the app will ever ask for.
- Three icon layers on Android. Foreground, background and monochrome, because the launcher composes them differently and the monochrome one is what themed icons use.
Three build profiles
The build config carries development, preview and production. The first embeds the development client, which is the only way background sensors ever run. The second is an internal build to hand to a tester. The third increments the build number automatically, which is the one thing you should never do by hand: a duplicate build number is rejected after the upload, not before.
Not code, and not a form
- The developer accounts. Apple's is a yearly subscription, Google's a one-off fee, and neither is issued the minute you ask.
- Google asks a new personal developer account to run a closed test with a group of testers over a period of days before production opens. That is a calendar entry, not a checkbox.
- Both stores want a data declaration — App privacy on one side, Data safety on the other. When nothing leaves the device the answer is short, but a short answer still has to be filed and still has to match what the binary actually does.
- An age rating, and with it a question worth asking early: a mechanic that can be avoided by paying is exactly the pattern reviewers look at on apps that may reach minors.
The apple-app-site-association file belongs to the same list. Universal links need a file at the root of a domain, which is one of the reasons each product here gets its own host rather than a folder.
None of this is difficult. All of it is sequential, and most of it cannot be started on the day the build is ready.