2026-09-10 09:11:55 +03:00
|
|
|
|
# MusicBridge iOS — план
|
|
|
|
|
|
|
2026-09-12 15:33:17 +03:00
|
|
|
|
Обновлено: 2026-09-12. Пользователь разрешил начать нативное iOS-приложение.
|
2026-09-10 09:11:55 +03:00
|
|
|
|
Репозиторий: `C:/Users/areso/iOS MusicBridge`; origin — dev.yukinoki.ru/musicbridge/ios.
|
|
|
|
|
|
Windows-агент — соседний проект `C:/Users/areso/MusicBridge/MusicBridge.Agent`.
|
|
|
|
|
|
|
|
|
|
|
|
## Правила проекта
|
|
|
|
|
|
|
|
|
|
|
|
- SwiftUI, без веб-клиента. Музыка играет на Windows.
|
|
|
|
|
|
- Сверять контракт с Windows PROTOCOL.md; не менять серверный протокол молча.
|
|
|
|
|
|
- Токены только в Keychain, проверка сертификата до сопряжения, запрет redirect.
|
|
|
|
|
|
- Не повторять команды автоматически после потери ответа.
|
|
|
|
|
|
- Не называть проверки Python сборкой Swift или запуском XCTest.
|
|
|
|
|
|
- После этапа обновлять этот файл: реализация, проверки, ограничения, следующий шаг.
|
|
|
|
|
|
|
2026-09-10 09:22:14 +03:00
|
|
|
|
## Реализовано в исходниках
|
2026-09-10 09:11:55 +03:00
|
|
|
|
|
|
|
|
|
|
- [x] Проект Xcode, shared scheme, iOS 17+, SwiftUI, без внешних зависимостей.
|
|
|
|
|
|
- [x] Модели состояния и команд v1; валидация HTTPS IPv4 домашней сети и QR-строки.
|
|
|
|
|
|
- [x] Ручное сопряжение, импорт приглашения, проверка SHA-256 DER-сертификата.
|
|
|
|
|
|
- [x] Keychain: адрес, отпечаток и bearer-токен; удаление локального сопряжения.
|
|
|
|
|
|
- [x] HTTPS-команды, обложка до 2 МиБ, поток WSS с ограничением размера сообщения.
|
|
|
|
|
|
- [x] Экран трека, возможности кнопок, прогресс, перемотка, громкость, mute.
|
|
|
|
|
|
- [x] Переподключение 1…16 секунд, watchdog потока, отключение в фоне, возврат.
|
|
|
|
|
|
- [x] XCTest исходники: диапазоны адресов, отказ опасным URL, отпечатки,
|
|
|
|
|
|
QR/срок/коды, JSON Windows, расчёт позиции, формат команд.
|
|
|
|
|
|
- [x] GitHub Actions: сборка/тесты симулятора, логи, xcresult и артефакт приложения.
|
|
|
|
|
|
|
|
|
|
|
|
## Проверки и следующие шаги
|
|
|
|
|
|
|
2026-09-10 09:22:14 +03:00
|
|
|
|
- [x] Первый успешный xcodebuild + XCTest на macOS: 7 тестов, 0 отказов.
|
|
|
|
|
|
- [x] Подключён GitHub remote polskikh13/musicbridgeios; Actions и чтение логов через gh работают.
|
2026-09-10 09:11:55 +03:00
|
|
|
|
- [ ] Интеграционные тесты TLS: верный/чужой/истёкший сертификат, redirect, WSS.
|
|
|
|
|
|
- [ ] Проверить 401 и отзыв устройства, Keychain после переустановки/блокировки.
|
2026-09-12 15:33:17 +03:00
|
|
|
|
- [x] Установить на физический iPhone: пользователь подтвердил установку через iloader 2026-09-12.
|
2026-09-10 09:11:55 +03:00
|
|
|
|
- [ ] Проверить LAN/плеер/команды/обложку с настоящим Windows-агентом.
|
|
|
|
|
|
- [ ] Камера для QR, системные разрешения и обработка отказа.
|
|
|
|
|
|
- [ ] Bonjour-поиск `_musicbridge._tcp`, список ПК и обновление адреса при смене IP.
|
|
|
|
|
|
- [ ] Улучшить ошибки сопряжения по серверным кодам; повтор загрузки обложки после 404.
|
|
|
|
|
|
- [ ] Иконка приложения, визуальная проверка разных размеров экрана и Dynamic Type.
|
|
|
|
|
|
- [ ] Live Activities / Dynamic Island / App Intents — отдельный последующий этап.
|
|
|
|
|
|
|
|
|
|
|
|
Ограничения: хранится один ПК; при смене его IP пока нужно повторное сопряжение.
|
|
|
|
|
|
Нет фонового воспроизведения, App Store/TestFlight и подписанной IPA.
|
|
|
|
|
|
Потеря ответа на успешное сопряжение может оставить устройство на ПК: удалить его
|
|
|
|
|
|
в окне агента перед повтором. Облачный runner не имеет доступа к домашней LAN.
|
|
|
|
|
|
|
2026-09-12 15:33:17 +03:00
|
|
|
|
## Проверка на iPhone 2026-09-12
|
|
|
|
|
|
|
|
|
|
|
|
- Windows GUI запущен с `--tray --lan`, порт TCP 8765 слушает.
|
|
|
|
|
|
- На iPhone первая попытка сопряжения завершилась ошибкой недействительного
|
|
|
|
|
|
сертификата сервера. Установка приложения уже работает; это отдельная TLS-проблема.
|
|
|
|
|
|
- Подготовлены ATS-исключения только для RFC1918 CIDR: `10.0.0.0/8`,
|
|
|
|
|
|
`172.16.0.0/12`, `192.168.0.0/16`. Начиная с iOS 17, для IP нужны явные
|
|
|
|
|
|
исключения. Клиент продолжает требовать HTTPS, точный SHA-256 отпечаток,
|
|
|
|
|
|
действующий сертификат и запрещает redirect. Глобального отключения ATS нет.
|
|
|
|
|
|
- Добавлены настоящие HTTPS/WSS проверки в симуляторе с сертификатом того же
|
|
|
|
|
|
типа, что у агента: RSA 2048, самоподписанный, CA:FALSE, SAN localhost/127.0.0.1,
|
|
|
|
|
|
срок пять лет. Отдельно проверяются чужой отпечаток и истёкший сертификат.
|
|
|
|
|
|
`tools/tls_fixture.py` запускается в CI перед сборкой тестов; закрытые ключи
|
|
|
|
|
|
создаются временно на runner и не включаются в приложение или артефакты.
|
|
|
|
|
|
- Сообщение «непригодные данные» при импорте приглашения пока не разобрано:
|
|
|
|
|
|
пользователь попросил отложить его. Следующий ручной шаг — повторить сопряжение
|
|
|
|
|
|
после установки новой IPA, затем проверить команды, прогресс и обложку.
|
|
|
|
|
|
|
2026-09-10 09:11:55 +03:00
|
|
|
|
## Карта
|
|
|
|
|
|
|
|
|
|
|
|
- `MusicBridge/Models.swift`: контракт и проверка входных данных.
|
|
|
|
|
|
- `BridgeClient.swift`: сертификат, HTTPS, WSS, ограничения ответов.
|
|
|
|
|
|
- `KeychainStore.swift`: хранение сопряжения.
|
|
|
|
|
|
- `PlayerStore.swift`: состояние, команды, жизненный цикл и восстановление.
|
|
|
|
|
|
- `ContentView.swift`: подключение и плеер.
|
|
|
|
|
|
- `MusicBridgeTests/`: XCTest и пример Windows JSON.
|
|
|
|
|
|
- `tools/`: генератор проекта, структурные проверки, выбор симулятора для CI.
|
|
|
|
|
|
- `.github/workflows/ios.yml`: CI на macOS.
|
2026-09-10 20:09:18 +03:00
|
|
|
|
- `tools/package_ipa.sh`: Release archive для настоящего iPhone и упаковка Payload.
|
|
|
|
|
|
- `tools/verify_ipa.py`: проверка ZIP, Info.plist, ARM64 и платформы Mach-O (iOS, не Simulator).
|
2026-09-10 09:22:14 +03:00
|
|
|
|
|
|
|
|
|
|
## Результаты 2026-09-10
|
|
|
|
|
|
|
2026-09-10 20:09:18 +03:00
|
|
|
|
- `07322c2`: успешный [Actions run 34445566212](https://github.com/polskikh13/musicbridgeios/actions/runs/34445566212).
|
|
|
|
|
|
Добавлен Release archive и неподписанный IPA для Sideloadly. Скачан в
|
|
|
|
|
|
`build/Sideloadly/MusicBridge-iPhone.ipa` (112334 байта). Локальная проверка ZIP,
|
|
|
|
|
|
Info.plist и Mach-O подтвердила iPhoneOS ARM64, минимум iOS 17.0.
|
|
|
|
|
|
Подпись и установка выполняются пользователем в Sideloadly; на физическом
|
|
|
|
|
|
iPhone ещё не проверено. Инструкция добавлена в README.md.
|
2026-09-10 09:22:14 +03:00
|
|
|
|
- `a761431`: успешный [Actions run 34444563869](https://github.com/polskikh13/musicbridgeios/actions/runs/34444563869),
|
|
|
|
|
|
macos-15, Xcode 16.4, Swift 6.1.2, симулятор iOS 18.5; 7 XCTest прошли.
|
|
|
|
|
|
Артефакты: MusicBridge-simulator и ios-test-results (лог и xcresult), хранение 7 дней.
|
|
|
|
|
|
- Первый CI-прогон не дошёл до компиляции: исправлены регистр UDID и выбор runtime
|
|
|
|
|
|
по версии активного SDK. Две регрессионные Python-проверки прошли локально.
|
|
|
|
|
|
- Структурная проверка Python прошла: генератор детерминирован, ссылки проекта,
|
|
|
|
|
|
состав исходников, Info.plist, схема и JSON согласованы.
|
|
|
|
|
|
- В CI есть предупреждения инструментов о подписанных библиотеках XCTest,
|
|
|
|
|
|
отсутствии AppIntents и Node 20 в checkout/upload-artifact v4; тесты прошли.
|
|
|
|
|
|
Миграция Actions на актуальные версии — отдельное небольшое обновление.
|
|
|
|
|
|
- Следующий шаг: интеграционные проверки TLS/WSS и UI, затем сканер QR/Bonjour.
|
|
|
|
|
|
Физический iPhone, Apple-подпись и управление настоящим ПК ещё не проверены.
|