В App Store и Google Play
По ссылке и QR-коду приложение открывается у любого — через приложение le.codes или в браузере, и это не требует ни сборки, ни магазинов (см. Публикацию). Своё приложение в сторе — под вашим именем, с вашей иконкой, без посредника — второй путь.
Не хотите возиться с Xcode и ключами — напишите в поддержку. Пока выпуск в App Store и Google Play мы делаем вручную по запросу: вы присылаете проект, название, иконку и данные аккаунтов разработчика — мы собираем, подписываем и загружаем. Публикация из самой платформы появится позже. Почта support@le.codes, Telegram @lecodes_bot.
Хотите сами — это делает lecodes app: генерирует нативную оболочку, собирает её и отправляет в App Store Connect. Ниже честно: что нужно, что делает CLI и что остаётся на вас.
Что понадобится
| iOS | Android | |
|---|---|---|
| Аккаунт | Apple Developer Program (платный, годовой) | Google Play Console (разовый платёж) |
| Машина | Mac с Xcode — иначе iOS-приложение не собрать и не подписать | Windows, macOS или Linux: JDK и Android SDK (проще всего с Android Studio) |
| Подпись | автоматическая через Xcode, по id команды | ключ загрузки — CLI создаст и сохранит |
| Загрузка | lecodes app upload ios — прямо в App Store Connect | руками через Play Console: .aab, который собрал CLI |
Облачной сборки у le.codes пока нет: без Mac в App Store не попасть. Это главное ограничение пути, и лучше знать о нём до начала.
Шаг 1 — оболочка
lecodes app init ios --team ABCDE12345 # Xcode-проект в ./ios, bundle id по умолчанию com.example.<slug>
lecodes app init ios --bundle-id com.acme.game # свой bundle id
lecodes app init android --app-id com.acme.game # Gradle-проект в ./androidОболочка — обычный Xcode- или Gradle-проект, который запускает скомпилированный бандл офлайн: приложение работает без сети и без платформы. Папки ios/ и android/ не отправляются на le.codes и живут в вашем git. Версия нативного SDK закрепляется в app.json (ios.sdk, android.sdk), чтобы сборки были воспроизводимыми; вариант SDK — core, 2d, 3d или full — CLI подбирает по тому, что бандл реально использует.
Иконка — квадратная картинка от 1024 px в app.json → icon; CLI отрисует все размеры при каждой синхронизации. Нативные плагины (камера, QR-сканер, карта, геолокация, push) подключаются через lecodes app plugin add <id> и вендорятся в оболочку с закреплением версий.
Шаг 2 — синхронизация и проверка
lecodes app sync # бандл + ассеты + вариант SDK + плагины → в оболочку; ваши Swift/Kotlin-файлы не трогаются
lecodes app doctor # тулчейн, подпись, иконки, ключи — фатальное валит команду, мягкое печатает подсказку
lecodes app open ios # открыть проект в Xcode / Android Studio, когда нужно рукамиsync запускается сам перед каждой сборкой; отдельно он нужен, когда вы правите оболочку в IDE. doctor стоит прогнать перед первым релизом: он проверяет всё, что обычно ломается на этапе загрузки.
iOS: сборка и загрузка
lecodes app build ios # xcodebuild archive + экспорт .ipa (метод app-store-connect) в ios/build/export/
lecodes app upload ios \
--key-path ~/AuthKey_ABC123.p8 --key-id ABC123 --issuer-id 1234-… # ключ App Store Connect API — один раз, дальше запоминаетсяСборка идёт с автоматической подписью по id команды из app init. upload ios отправляет архив в App Store Connect и увеличивает ios.buildNumber в app.json — номер сборки расходуется при загрузке. Дальше — как у любого приложения: TestFlight, страница в App Store Connect, отправка на проверку. --method ad-hoc соберёт .ipa для раздачи на свои устройства мимо стора.
OTA-обновления кода: "update": true в app.json — оболочка на iOS подтягивает новый JS при запуске, и мелкая правка не требует релиза в сторе. На Android этого пока нет.
Android: ключ, сборка, Play Console
lecodes app keystore create --generate # ключ загрузки: путь и пароли — в .env проекта, метаданные — в app.json
lecodes app keystore use ~/keys/upload.keystore # или свой существующий
lecodes app keystore info # алиас и отпечатки SHA-1 / SHA-256 — их спрашивают Play и Firebase
lecodes app build android # gradlew assembleRelease + bundleRelease → dist/<имя>-<версия>-<код>.apk и .aabРелиз без ключа CLI не собирает — --allow-unsigned только для одноразовых сборок. С Play App Signing (по умолчанию для новых приложений) ваш ключ — это ключ загрузки: Google хранит ключ подписи, а потерянный ключ загрузки сбрасывается через поддержку Play. Всё равно сделайте резервную копию.
Загрузки в Play через CLI нет: .aab из dist/ вы отправляете в Play Console сами — создание приложения, тестовые дорожки, страница в магазине и проверка идут там. Gradle ищет Android SDK в android/local.properties или по ANDROID_HOME.
Обновления
Новая версия приложения — это новая версия бандла в оболочке: правите проект, поднимаете версию и код сборки в app.json, lecodes app build — и снова в стор. lecodes app update двигает закрепления SDK и плагинов на свежие выпуски и пересинхронизирует оболочку (--check только покажет, что есть новее); lecodes update делает это в числе прочего.
Ссылка и QR-код при этом продолжают работать: обновление по ним — бесплатное, без прохождения проверки. Многие держат оба пути: стор для тех, кто ищет там, ссылка — для всех остальных.
Честно об ограничениях
- Без Mac и Xcode iOS-приложение не собрать — облачной сборки нет.
- Загрузка в Google Play — руками через Play Console; CLI готовит подписанный .aab.
- OTA-обновления JS — только на iOS.
- Нативный плагин — это отдельный репозиторий с нативным кодом (
github:owner/repo@tag), а не файл в проекте; сторонний плагин просмотрите до выпуска. - Прохождение проверки сторов, скриншоты и тексты страницы — ваша часть работы, как и в любом другом инструменте.
Ничего из этого не мешает выпустить приложение сегодня по ссылке и QR-коду и выложить его в le.store — а в стор идти, когда будет ради чего.