Files
OpenFlux/ios-app/DISTRIBUTION.ru.md
Alexander4151andClaude Opus 5 89fcbe6100 iOS app: add MAX transport, configurable port, crash hardening
- UI: transport picker (Yandex Docs / MAX) with the right fields per
  backend (URL vs token + user id); previously only a Yandex URL was
  exposed even though the MAX (oneme) transport is supported.
- UI: editable local SOCKS5 port with an uncommon default (10808) to
  avoid clashing with other local proxies; the running address is shown.
- Fix crash on start when the SOCKS5 port is in use: the port is now
  bound synchronously and "address already in use" is reported to the UI
  (start code 4) instead of failing in a background goroutine. The start
  path and the serve goroutine are wrapped in recover() so no panic can
  unwind into the Swift caller and kill the app.
- oneme: remove os.Exit(1) on receiver connection loss — a library must
  never terminate the host process; it now signals reconnect instead.
- socks5: split Bind() from Start() to support the pre-bind check.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GqZJxeewiSYYTHLG4z5Fdt
2026-09-10 16:36:45 +03:00

5.1 KiB
Raw Permalink Blame History

OpenFlux iOS — распространение (TestFlight / App Store Connect)

Документ фиксирует, что вопрос сборки и распространения iOS-приложения OpenFlux был проработан: приложение собрано с нуля, подписано и загружено в App Store Connect.

Что сделано

  1. Go-ядро → статическая библиотека. Добавлен cgo-слой экспортов (../export_ios.go, сборка по тегу ios): OpenFluxStartClient, OpenFluxStop, OpenFluxIsRunning, OpenFluxIsConnected, OpenFluxStatsJSON, OpenFluxReadLog, OpenFluxFreeString. Сборка: ../build_ios.sh → ../output/ios/liboflux.a (+ авто-заголовок liboflux.h).
  2. iOS-приложение (SwiftUI, XcodeGen). Экран с полем Yandex.Docs URL, Start/Stop, индикатор состояния, живой лог и кнопка Test (проверяет тоннель запросом через локальный SOCKS5 127.0.0.1:1080). Линкует liboflux.a.
  3. Иконка 1024×1024 в asset-каталоге (обязательна для загрузки).
  4. Подпись и архив. Automatic signing, team 8GQH8GQ252, Cloud Managed Apple Distribution. Экспортирован App Store .ipa.
  5. Загрузка в App Store Connect через ASC API-ключ (см. ниже). Флаг ITSAppUsesNonExemptEncryption = false — экспортная документация по шифрованию не требуется (используется только стандартный HTTPS/TLS).

Параметры

Параметр Значение
Bundle ID com.p1neapplexpress-saharev.openflux
Team ID 8GQH8GQ252 (Alexandr Revin, Individual)
Marketing version 1.0.0
Deployment target iOS 15.0
Architecture arm64 (device)
ASC API Key ID <KEY_ID>
ASC Issuer ID <ISSUER_ID>
Приватный ключ ~/.appstoreconnect/private_keys/AuthKey_<KEY_ID>.p8 (НЕ коммитить)

Полная сборка одной командой

Из корня репозитория:

./build_ios_app.sh

Результат: ios-app/build/export/OpenFlux.ipa (подписан для App Store).

Загрузка в TestFlight

xcrun altool --upload-app -f ios-app/build/export/OpenFlux.ipa -t ios \
  --apiKey <KEY_ID> --apiIssuer <ISSUER_ID>

Билд появляется в TestFlight через несколько минут после обработки Apple.

Новый билд

Перед каждой новой загрузкой поднять номер сборки в ios-app/project.yml:

settings:
  base:
    CURRENT_PROJECT_VERSION: "3"   # +1

Apple не принимает повторно тот же номер сборки.

История загрузок

Дата Build Delivery UUID Примечание
2026-09-10 1 <uuid-1> первый билд
2026-09-10 2 <uuid-2> + флаг шифрования, без экспортной документации
2026-09-10 3 <uuid-3> + транспорт MAX в UI, настраиваемый порт, no-crash bind

Ограничения и риски распространения

  • Приложение — инструмент обхода блокировок. Для публичного распространения в App Store действуют Guideline 5.4 (VPN): требуется NetworkExtension и аккаунт-организация (не Individual); текущий вид почти наверняка получит reject на ревью.
  • TestFlight Internal Testing (разработчик + внутренние пользователи) Beta App Review не проходит — работает уже сейчас. External Testing и релиз — проходят.
  • Возможно региональное снятие (Apple удаляла обходные приложения из ряда сторов по требованию регуляторов).
  • Тоннелирование через Яндекс.Документы / MAX вероятно нарушает их ToS.
  • Приложение поднимает локальный SOCKS5; системное туннелирование всего устройства потребует отдельного таргета NEPacketTunnelProvider — в этот билд не входит.

Безопасность

  • AuthKey_*.p8 — секрет, даёт доступ к App Store Connect. Не коммитить в git, хранить только в ~/.appstoreconnect/private_keys/. Компрометацию — отзывать в App Store Connect → Users and Access → Integrations.
  • Key ID и Issuer ID сами по себе не секретны, но без .p8 бесполезны.