Публікація в Play Store крок за кроком
Повна інструкція, як розмістити гру JumPHP у Google Play і підтримувати її там: що потрібно зібрати, що потрібно зберегти, що перевірити на телефоні, і Play Console від початку до кінця. Вона стосується обох видів застосунків:
| Вебзастосунок (У Google Play) | Нативний застосунок (Нативний застосунок Android) | |
|---|---|---|
| Команда | bin/jumphp twa mon-jeu --url https://jumphp.net/mon-jeu |
bin/jumphp android mon-jeu |
| Що це | сторінка гри в Chrome на весь екран | PHP, SDL і гра всередині застосунку, без мережі |
| Гра оновлюється | разом із сайтом, одразу (нового застосунку не потрібно) | з новою версією застосунку |
Ваш Claude знає цей посібник (він є в AGENTS.md вашого проєкту та в docs/google-play.md): попросіть його
«розмісти мою гру в Google Play». Він робить технічну частину; вибір і надсилання залишаються за вами (див. кінець).
0. Перш ніж почати
- Акаунт розробника Google Play: play.google.com/console, 25 $ одноразово, з перевіркою особи. Це ваш акаунт: умови Google приймаєте ви.
- Новий особистий акаунт має провести закрите тестування щонайменше з 12 тестувальниками протягом 14 днів, перш ніж зможе публікувати у продакшн. Запустіть його раніше.
- Назва пакета (
io.github.<ваш акаунт github>.<mon_jeu>): ідентифікатор застосунку в Google Play. Він більше ніколи не змінюється. Команда запитує його під час першого запуску. - Ліцензія Android SDK: ви приймаєте її у своєму терміналі під час першого запуску (SDK, ~1 ГБ,
зберігається в
~/.jumphp). Ваш Claude попросить вас запустити команду самостійно (! bin/jumphp twa …). - Політика конфіденційності за публічною адресою: Google вимагає її, навіть якщо гра нічого не збирає.
Достатньо короткої сторінки: гра не збирає, не надсилає й не передає жодних персональних даних; без акаунта, без
реклами, без стеження; налаштування та збереження залишаються на пристрої; контактна адреса.
Розмістіть її на сайті гри,
games/mon-jeu/site/privacy.html: вона доступна за адресоюhttps://play.jumphp.net/mon-jeu/privacy.html(абоPRIVACY.mdвашого публічного репозиторію). Відкрийте адресу один раз, перш ніж давати її Google: помилка 404 блокує перевірку.
1. Ключі: спершу збережіть їх
Перше збирання створює ваш ключ завантаження: ~/.jumphp/android/keys/<пакет>.keystore і його пароль
у <пакет>.env.
- Ніколи в git, ні в нотатці, ні в повідомленні. Збережіть обидва файли деінде (менеджер паролів, зашифрований диск). Без них нове збирання створить інший ключ, і Google Play відхилить оновлення.
- З підписуванням застосунку Google Play (за замовчуванням) Google зберігає власний ключ, яким підписує застосунок на телефонах. Ваш лише доводить, що завантаження надходять від вас; якщо його втрачено, Google може його замінити (Налаштування > Підписування застосунку), але це займає дні.
- Тому є два відбитки SHA-256: вашого ключа (її показує команда) і ключа Google (Play Console > Налаштування > Підписування застосунку, після першого завантаження).
2. Зібрати застосунок
bin/jumphp twa mon-jeu --url https://jumphp.net/mon-jeu # вебзастосунок
bin/jumphp android mon-jeu # або нативний застосунок
- Кожне збирання збільшує номер версії на 1 (Google Play відхиляє вже надісланий номер; невдала спроба споживає номер, це не страшно).
- Одразу закомітьте файл версії:
games/mon-jeu/android/twa-manifest.json(вебзастосунок) абоgames/mon-jeu/android/app.json(нативний застосунок). Ніколиdist/. - Назва під іконкою:
pwa: {short_name: …}уgame.yaml(12 символів видно повністю). Іконка:assets/icon.png.
3. Лише вебзастосунок: сайт ручається за застосунок
Android відкриває сторінку на весь екран, лише якщо сайт оголошує застосунок: назву пакета та обидва
відбитки (ваш і Google). Лише з вашим відбитком застосунок, встановлений із вашого .apk, працює,
але той, що встановлений із Google Play, відкривається з адресним рядком (або з вибором «Відкрити за допомогою»).
У Studio, на сторінці гри, у розділі Застосунок Android (або ваш Claude: update_project). Сайт публікує
їх у https://jumphp.net/.well-known/assetlinks.json. На вашому власному сервері:
https://votre-domaine/.well-known/assetlinks.json.
4. Спробувати його на справжньому телефоні
З увімкненим налагодженням USB і adb:
adb install -r games/mon-jeu/dist/android/mon-jeu-<version>.apk
adb shell pm get-app-links <paquet> # вебзастосунок: «jumphp.net: verified»
adb exec-out screencap -p > capture.png # подивіться: гра має бути на місці
- Застосунок має відкритися на титульному екрані гри.
.apk, підписаний вашим ключем, не встановлюється поверх такого самого застосунку з Google Play (INSTALL_FAILED_UPDATE_INCOMPATIBLE): спершу видаліть його (збереження застосунку буде втрачено).- Вебзастосунок відкривається й одразу закривається з вибором «Відкрити за допомогою»: на телефоні два Chrome, як правило, через клонований простір / другий простір / подвійний застосунок (Xiaomi, Samsung…). Застосунок JumPHP запитує Chrome основного профілю, що розв'язує проблему для гравців; на вашому тестовому телефоні видалення клонованого простору стирає всі застосунки в ньому.
- Те, що гра відкривається в Chrome, не доводить, що застосунок працює: спробуйте застосунок.
5. Play Console, перший раз
Список «Налаштуйте свій застосунок» на панелі (X з 11) показує, що ще залишилося зробити; «Надіслати на перевірку» залишається неактивною, доки чогось бракує.
- Створити застосунок: назва, мова за замовчуванням, Гра, Безкоштовний, декларації.
- Вміст застосунку (Політики > Вміст застосунку), кожна декларація:
- Політика конфіденційності: публічна адреса з кроку 0;
- Реклама: без реклами (JumPHP її не додає);
- Доступ до застосунку: усе доступно без особливого доступу (без акаунта);
- Цільова аудиторія: вік, для якого зроблено гру. Вибір віку до 13 років вводить застосунок у програму для сімей (суворіші правила, менша видимість): робіть це, лише якщо гра справді зроблена для дітей;
- Класифікація вмісту (опитування IARC): категорія Гра; відповідайте чесно для своєї гри (мультиплікаційне або фентезійне насильство, кров, страх, азартні ігри, вміст, створений гравцями, обмін між гравцями, геолокація, покупки);
- Безпека даних: гра JumPHP без акаунта та статистики не збирає й не передає жодних даних (збереження залишаються на пристрої; якщо ваша гра звертається до вебсервісу, вкажіть це);
- Рекламний ідентифікатор: не використовується;
- Урядові застосунки, фінансові функції, здоров'я: ні.
- Налаштування Play Store (Розвиток > Присутність у Play Store > Налаштування): категорія (Аркада, Екшн, Головоломки…) і контактна електронна адреса. Обидва обов'язкові: без них «Your app cannot be published yet». Адреса публічна.
- Головна сторінка: назва (30 символів), короткий опис (80), повний опис (4000), іконка
512 × 512 PNG (її створює
bin/jumphp build:dist/web/icon-512.png), зображення 1024 × 500, щонайменше 2 скриншоти телефона (bin/jumphp shot mon-jeu, збільшені в ціле число разів, або зроблені на телефоні). Зберігайте зображення в грі (games/mon-jeu/store/), щоб переробляти їх для наступних версій. - Тести: Тестування та публікація > Тестування > Внутрішнє тестування (або Закрите тестування для 12 тестувальників
нового акаунта) > Створити випуск >
.aab> примітки до випуску > Зберегти > Переглянути > Почати розгортання. Тестувальники: список адрес; кожен відкриває запрошення ввійшовши з цим акаунтом Google і натискає Стати тестувальником. - Вебзастосунок: після цього першого завантаження додайте відбиток ключа Google (крок 3), встановіть за тестовим посиланням і перевірте повноекранний режим.
- Продакшн: Продакшн > Країни / регіони > Додати, виберіть, Зберегти (випуск без країн
відхиляється), потім Створити випуск >
.aab> примітки > Далі > Зберегти. - Огляд публікації > Надіслати на перевірку, підтвердіть. Перевірка триває від кількох годин до 7 днів; консоль і електронна пошта акаунта повідомляють, коли застосунок з'явився онлайн.
6. Примітки до випуску
По блоку на мову, теги в окремих рядках:
<fr-FR>
Première version.
</fr-FR>
<en-US>
First release.
</en-US>
7. Наступні версії
- Вебзастосунок: гра оновлюється разом із сайтом (ви робите push, і вона публікується): нового застосунку не потрібно. Новий
застосунок потрібен, лише якщо змінюються назва, іконка, кольори, початкова адреса або пакет:
bin/jumphp twa mon-jeu. - Нативний застосунок: кожна зміна гри — це новий застосунок:
bin/jumphp android mon-jeu --version-name 1.1.
Потім: закомітьте файл версії, спробуйте .apk на телефоні, потім Play Console > та сама доріжка >
Створити випуск > новий .aab > примітки > Надіслати на перевірку. Декларації залишаються чинними, якщо гра
не змінює того, що вони описують (онлайн-гра, покупки, дані): оновіть їх перед цим.
8. Підводні камені, на які натрапляли
| Симптом | Причина, рішення |
|---|---|
| Застосунок відкривається з адресним рядком | на сайті бракує відбитка (Google) або пакета: крок 3 |
| Вебзастосунок відкривається й одразу закривається | два Chrome на телефоні (клонований простір): крок 4 |
INSTALL_FAILED_UPDATE_INCOMPATIBLE |
встановлений застосунок із Google Play (інший ключ): спершу видаліть його |
| «Код версії вже використано» | зберіть знову (версія + 1) |
| Google Play відхиляє ключ оновлення | ключ завантаження втрачено або створено заново: відновіть резервну копію або попросіть Google скинути його |
| «Your app cannot be published yet» | Налаштування Play Store: категорія та контактна електронна адреса |
| «Надіслати на перевірку» неактивна | бракує одного кроку в «Налаштуйте свій застосунок»; випуск без країн |
| «Імпортуйте щонайменше 1 ресурс» | зображення є в бібліотеці, але не прикріплене до сторінки: додайте його з панелі бібліотеки |
| Тестувальника не додано | введіть адресу й натисніть Enter (з'явиться мітка), потім Зберегти та підтвердити |
| Політику конфіденційності відхилено | її адреса повертає 404 або не є публічною: відкрийте її в режимі інкогніто |
Чого ваш Claude не робить без вас
- приймати ліцензію Android SDK, умови Google або відповідати на опитування класифікації, не повідомивши вам своїх відповідей;
- вибирати цільову аудиторію (твердження, що гра «для дітей», змінює правила та видимість);
- надсилати у продакшн без вашої згоди саме на це надсилання;
- видаляти клонований простір або видаляти застосунок з вашого телефона (дані будуть втрачені);
- класти ключі, паролі або
dist/у git.