Нативное iOS-приложение для Encounter: очередь кодов, уровни, Live Activity, уведомления.
Клиент API — Encx.xcframework (gomobile-обёртка над пакетом encx из репозитория encx-cli).
Самый простой способ: открой ссылку с iPhone, и TestFlight установит приложение.
- На Mac собери IPA командой
make unsigned-ipa; файл появится вbuild/. - Установи любой sideloading-инструмент:
AltStore/SideStoreдля установки прямо на устройствоSideloadlyесли удобнее ставить с компьютера
- Импортируй
.ipaв выбранный инструмент и подпиши своим Apple ID. - После установки на iPhone, если iOS попросит доверить профиль разработчика:
Настройки->Основные->VPN и управление устройством-> доверить профиль. - Запусти
enkapp.
Что важно:
- На бесплатном Apple ID такая установка обычно живёт 7 дней, потом приложение надо переустановить или переподписать.
- Название файла IPA и bundle местами ещё могут содержать старое имя
encx-cli; это нормально.
- macOS с Xcode 16+
- Для пересборки
Encx.xcframework: Go 1.26+ и доступ в сеть — исходники encx-cli подтягиваются автоматически
# Пересобрать Encx.xcframework (опционально, если менялся API).
# Без переменных берёт последний коммит upstream в build/encx-cli-upstream/
make framework
# Собрать из локального чекаута encx-cli вместо upstream
make framework ENCX_CLI_ROOT=/path/to/encx-cli
# Зафиксировать версию upstream
make framework ENCX_CLI_REF=v0.14.0
# Unsigned / signed IPA (см. make help)
make unsigned-ipa
make signed-ipa DEVELOPMENT_TEAM=XXXXXXXXXX EXPORT_METHOD=release-testing
# Скриншоты для App Store / README
make screenshotsОткрыть в Xcode: encx-cli.xcodeproj, схема encx-cli.
Encx.xcframework лежит в encx-cli/Frameworks/. После make framework он синхронизируется из encx-cli/build/gomobile/.
Workflow iOS tagged release запускается только при push тега формата v<major>.<minor>.<patch>.<build>.
После проверки версии (version) job testflight один раз собирает подписанный
Release-архив из коммита тега с готовым Encx.xcframework и загружает его в App Store Connect
как TestFlight Internal Only. Push веток, PR и ручной запуск релиз не собирают.
Например, v0.2.25.71 задаёт MARKETING_VERSION=0.2.25 и CURRENT_PROJECT_VERSION=71
для приложения, widget и App Clip. Xcode сохраняет эти значения
при загрузке. Повторная загрузка уже использованной версии и номера сборки Apple
не допускается: для следующей сборки увеличь последнюю часть тега. Неправильный формат
тега отклоняется до сборки и использования секретов.
В Settings → Secrets and variables → Actions добавь repository secrets:
| Secret | Значение |
|---|---|
APP_STORE_CONNECT_KEY_ID |
ID командного API-ключа App Store Connect |
APP_STORE_CONNECT_ISSUER_ID |
Issuer ID команды |
APP_STORE_CONNECT_PRIVATE_KEY |
Полное содержимое файла .p8, включая BEGIN/END |
IOS_CERTIFICATES_P12_BASE64 |
Base64 от .p12 с сертификатами Apple Development и Apple Distribution и их приватными ключами |
IOS_CERTIFICATES_PASSWORD |
Непустой пароль этого .p12 |
IOS_APP_STORE_PROFILE_APP |
Base64 содержимого App Store .mobileprovision для com.svk-team.encx-cli |
IOS_APP_STORE_PROFILE_WIDGET |
Base64 содержимого App Store .mobileprovision для com.svk-team.encx-cli.widget |
IOS_APP_STORE_PROFILE_CLIP |
Base64 содержимого App Store .mobileprovision для com.svk-team.encx-cli.Clip |
Профили разделены на отдельные секреты, потому что один общий JSON-секрет с тремя
профилями превышает лимит размера GitHub Actions secret (48 КБ).
Ключу нужны права на загрузку сборок и на создание/чтение Certificates, Identifiers & Profiles
(роль Admin или App Manager — роли Developer для создания профилей через API недостаточно).
Сертификаты должны принадлежать команде ZLQX2C6SX2.
Для архивации Xcode получает Development profiles автоматически. Для экспорта используются
явные App Store profiles из секретов выше и установленный Distribution
сертификат; Cloud Signing не используется. Профили проверяются на срок действия,
команду, bundle ID и наличие соответствующего приватного ключа. При продлении
сертификата обнови также профили в секретах.
Приложение с bundle ID com.svk-team.encx-cli должно уже существовать в App Store Connect.
В TestFlight создай внутреннюю группу, добавь тестеров и включи Enable automatic distribution:
после обработки Apple сборка будет доступна этой группе. Требуемые Apple сведения
об экспортном соответствии должны быть заполнены. Такие сборки недоступны по публичной
ссылке внешнего TestFlight и не предназначены для публикации в App Store.
См. инструкцию Apple по внутренним тестерам.
git tag v0.2.25.71
git push origin v0.2.25.71Workflow iOS TestFlight public release запускается вручную (workflow_dispatch) с вводом
tag — уже существующим тегом, для которого iOS tagged release успешно загрузил билд
в TestFlight. Он не пересобирает приложение (Apple не разрешает повторно загрузить тот же
номер сборки), а находит уже загруженный билд по номеру сборки из тега через App Store Connect
API, добавляет его во внешнюю тестовую группу encx-public-testflight (публичная ссылка
https://testflight.apple.com/join/QVfQ5Hzf) и отправляет билд на Beta App Review. После
одобрения Apple билд станет доступен всем, у кого есть публичная ссылка. Проверка занимает
от нескольких часов до пары дней; повторный запуск для уже отправленного билда безопасен.
Использует те же секреты APP_STORE_CONNECT_KEY_ID/APP_STORE_CONNECT_ISSUER_ID/
APP_STORE_CONNECT_PRIVATE_KEY, что и internal-релиз. Запустить: Actions →
iOS TestFlight public release → Run workflow → указать тег.
Workflow скриншотов продолжает работать на ветках, PR и вручную; теги его не запускают.
make screenshots собирает Debug-приложение для iOS Simulator, запускает его с --screenshots и сохраняет PNG в build/screenshots/.
В CI это делает workflow iOS screenshots; результат доступен как artifact enkapp-ios-screenshots
| Путь | Назначение |
|---|---|
encx-cli/ |
Исходники приложения (SwiftUI) |
encx-cli-widget/ |
Live Activity (Widget Extension) |
Shared/ |
ActivityAttributes, общие с виджетом |
export/ExportOptions.plist |
Шаблон для xcodebuild -exportArchive |
В приложение встроен ИИ-ассистент на PicoClaw: агент
целиком живёт внутри Encx.xcframework и работает через тот же движок Encounter, что и само
приложение, — под вашей учётной записью.
Включается в «Настройки → Ассистент»: провайдер, модель и учётные данные. После включения кнопка ✨ появляется и в тулбаре списка игр, и в шапке экрана игры.
Аутентификация — на выбор:
- Ключ API для OpenAI, Anthropic или Polza.AI —
российского агрегатора с сотнями моделей по одному ключу. Можно указать свой endpoint, но он обязан
обслуживать
/chat/completions: агент ходит именно туда, поэтому шлюз, реализующий только Responses API, ответит 404. - Подписка ChatGPT — вход по коду устройства: приложение показывает код, вы подтверждаете его на странице OpenAI. Ключ при этом не нужен.
Учётные данные хранятся в Keychain устройства, а не в UserDefaults; запросы уходят напрямую выбранному провайдеру, так что данные игры покидают устройство вместе с ними.
Доступ к движку задаётся политикой:
| Политика | Что может ассистент |
|---|---|
| Чтение | Видит игру, уровень, секторы, бонусы, подсказки, лог кодов и статистику. Ничего не отправляет. |
| С подтверждением (по умолчанию) | То же плюс отправка кодов и бонусов, штрафные подсказки, заявка на игру — каждое такое действие подтверждается вами в диалоге. |
| Без подтверждения | Ассистент действует сам. Ошибочный код тратит время и может включить блокировку ответов, а штрафная подсказка необратимо добавляет команде штрафное время. |
В режиме с подтверждением вызов доходит до движка только после явного «Разрешить».
Внутри одного ответа ассистент кеширует прочитанное из движка, чтобы не дёргать его повторно одним и тем же запросом. Кеш сбрасывается в начале каждого вопроса и после любого действия, меняющего игру, — на новый вопрос ассистент всегда смотрит свежие данные.
Ассистент видит картинки заданий: уровень отдаёт список изображений, а инструмент просмотра скачивает их под вашей сессией и передаёт модели целиком. Ограничения — 8 МБ на файл и только адреса в пределах домена игры.
В чате есть диктовка: распознавание речи выполняется только на устройстве
(requiresOnDeviceRecognition), звук никуда не отправляется. Если локальная модель
для языка устройства недоступна, кнопка микрофона не показывается. С аппаратной
клавиатурой Enter отправляет сообщение, Shift+Enter переносит строку.
Инструменты движка, политики доступа и MCP-сервер для внешнего PicoClaw описаны в
docs/agent-tools.md
репозитория encx-cli.
| Репозиторий | Содержимое |
|---|---|
| encx-cli | Go-клиент, CLI encli, mobile/encxmobile, сборка xcframework |
| enkapp (этот репозиторий) | Только iOS UI и Xcode-проект |
Изменения API Encounter сначала вносятся в encx-cli (encx + mobile/encxmobile), затем make framework и обновление Swift в этом репозитории.
Apache License 2.0 — см. LICENSE.






