Publishing on Google Play and the App Store#

From a finished game to a store build. The store consoles change often: when a click path here no longer matches, the console's own help wins. Research, not legal advice.

Do it with AI (skill prepare-release, set up once): ask your agent "Prepare my game for release on Google Play." Or follow the Hub steps below.

Before any store build#

  1. Make it yours is done: your company, name and bundle id (Hub > Home, step 1).
  2. Hub > Release > Check for Android and Check for iOS: no ✖ blockers. Release builds run the same checks and stop on a blocker; Development builds never stop.
  3. Legal: your privacy policy, terms and support address are online and set in Hub > Project > Legal (Privacy policy and terms).
  4. The template's keys are gone: Hub > Monetization > Use your own keys is empty.
  5. The developer tools are out: no IDLE_DEV_TOOLS in the Scripting Define Symbols.
  6. Version: Edit > Project Settings > Player > Version (shown to players, for example 1.0.0) and the build number (Android: Bundle Version Code, iOS: Build). Raise the build number for every upload.

Google Play#

Upload key (keystore)#

Google Play needs every upload signed with your key.

  1. Edit > Project Settings > Player > Android tab > Publishing Settings > Keystore Manager > Create New > Anywhere.
  2. Save the .keystore file outside the project folder, pick a strong password, fill in the key's alias and password.
  3. Back it up somewhere safe (with the passwords). Never put it in a public repository.
  4. Unity forgets both passwords when it restarts: type them again in Publishing Settings before a release build (otherwise build.android-signing, see Errors.md).

Play App Signing#

Google re-signs your app with its own app signing key; your keystore becomes the upload key. This is the default for new apps (Play Console > your app > Test and release > App integrity). Two consequences:

  • Services that check the signature need both fingerprints (SHA-1): the app signing key (Play Console > App integrity) for installs from Google Play, and your upload key for builds you install yourself. Google Play Games sign-in is one of them (Online services).
  • If you lose the upload key, Google can reset it; if you lose an app signing key you manage yourself, you cannot update the app.

Build the AAB#

  1. File > Build Profiles > Android > Switch Platform.
  2. Tick Build App Bundle (Google Play) (an .aab, which Google Play requires).
  3. Leave Development Build off for a store build.
  4. Build, pick a folder outside Assets.

The template targets the current Android API level, 64-bit only. If a release build fails but a development build works, or the store or ads fail only in release, see FAQ.

Store forms: privacy and Data safety#

Play Console > Policy and programs > App content:

  • Privacy policy: its web address.
  • Ads: Yes, if LevelPlay is on.
  • Data safety: what your build collects. The offline template with the fake store collects nothing. Each service you turn on adds rows: ads (device IDs, approximate location, app interactions, diagnostics), purchases (purchase history), analytics (Analytics), Unity Gaming Services (user IDs; with leaderboards and friends also the player's display name). With cloud save or sign-in, answer the **account deletion** questions: the in-game row is Settings > Delete cloud data, and Google also wants a web address (a page of your site that explains it).
  • Target audience: 16+ or 18+ keeps you out of the Families policy (the game sells random items). Never under 13.
  • Content rating (IARC questionnaire): fantasy violence, and "In-game purchases (includes random items)" if you sell summons.
  • Advertising ID: declare its use when ads or analytics are on.

Testing tracks#

  • Upload the first AAB to Internal testing, add testers, install from the opt-in link. In-app purchases only work in builds installed from Google Play (Shop).
  • A new personal developer account must run a closed test with at least 12 testers for 14 days before it can publish to production. Plan for it.
  • After each upload, check the pre-launch report and App bundle explorer (memory page size 16 KB supported).

AI-generated content#

The template's pictures and sounds were made with AI-assisted tools and edited by hand. If your store images show them, tick Google Play's AI-generated content declaration on those images. Replacing the art is the better choice anyway (see Reskin).

App Store#

You need a Mac with Xcode, and an Apple Developer account.

Xcode and CocoaPods#

  1. File > Build Profiles > iOS > Switch Platform, then Build: Unity writes an Xcode project.
  2. The add-ons' iOS parts (ads, Firebase, sign-in) are installed with CocoaPods. Install it once (sudo gem install cocoapods in Terminal, or Assets > External Dependency Manager > iOS Resolver > Install Cocoapods). The build runs pod install by itself.
  3. Open the .xcworkspace file (not the .xcodeproj) in Xcode. A missing workspace means CocoaPods did not run: build.ios-cocoapods in Errors.md.

Signing and capabilities#

  1. Xcode > the Unity-iPhone target > Signing & Capabilities: your Team, Automatically manage signing, the bundle id from Make it yours.
  2. With Sign in with Apple, the capability is added by the build; check it is listed. Push notifications are not needed (reminders are local).
  3. Product > Archive, then Distribute App > App Store Connect.

The build writes ITSAppUsesNonExemptEncryption = NO (export compliance), your tracking sentence when set, and the template's privacy manifest (PrivacyInfo.xcprivacy). After the first archive, Generate Privacy Report shows it merged with the SDKs'.

App Privacy#

App Store Connect > your app > App Privacy: the same data as Google's Data safety (see above), including each ad network you mediate. Age rating: loot boxes Yes if you sell summons; minimum age 13+ or higher. With cloud save, App Review wants account deletion inside the app: Settings > Delete cloud data does it; say so in the review notes. A game that offers Google sign-in must also offer Sign in with Apple.

Privacy policy and terms#

Documentation/Legal/ has a privacy policy and terms template (PRIVACY-POLICY-TEMPLATE.md, TERMS-TEMPLATE.md). Fill in your company, address, e-mail, the services you use, and publish them as ordinary web pages (not PDFs, not geo-blocked). Put the addresses in Hub > Project > Legal: the game's Settings screen links them. Legal/README.md explains each part. Add every SDK you ship to the licences text shown in Settings > Licences (Legal/THIRD-PARTY-NOTICES.txt in the template's folder; how: Third-party notices).

Checklist before you submit#

  • [ ] Pre-flight green for the platform.
  • [ ] Your art, names and store texts (not the template's).
  • [ ] Real store and ads profile in use (Hub > Services shows Real), keys and receipt validation set.
  • [ ] Products created in the console with the same ids and types; tested with a licence / Sandbox tester.
  • [ ] Privacy policy, terms and support address online and in Hub > Project.
  • [ ] Data safety / App Privacy, content rating, target audience answered.
  • [ ] Countries chosen (loot-box rules: Shop).
  • [ ] Version and build number raised; IDLE_DEV_TOOLS removed; Development Build off.
  • [ ] Keystore backed up.