9.1 KiB
9.1 KiB
MusicBridge iOS — план
Обновлено: 2026-09-12. Пользователь разрешил начать нативное iOS-приложение.
Репозиторий: 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.
- После этапа обновлять этот файл: реализация, проверки, ограничения, следующий шаг.
Реализовано в исходниках
- Проект Xcode, shared scheme, iOS 17+, SwiftUI, без внешних зависимостей.
- Модели состояния и команд v1; валидация HTTPS IPv4 домашней сети и QR-строки.
- Ручное сопряжение, импорт приглашения, проверка SHA-256 DER-сертификата.
- Keychain: адрес, отпечаток и bearer-токен; удаление локального сопряжения.
- HTTPS-команды, обложка до 2 МиБ, поток WSS с ограничением размера сообщения.
- Экран трека, возможности кнопок, прогресс, перемотка, громкость, mute.
- Переподключение 1…16 секунд, watchdog потока, отключение в фоне, возврат.
- XCTest исходники: диапазоны адресов, отказ опасным URL, отпечатки, QR/срок/коды, JSON Windows, расчёт позиции, формат команд.
- GitHub Actions: сборка/тесты симулятора, логи, xcresult и артефакт приложения.
Проверки и следующие шаги
- Первый успешный xcodebuild + XCTest на macOS: 7 тестов, 0 отказов.
- Подключён GitHub remote polskikh13/musicbridgeios; Actions и чтение логов через gh работают.
- Интеграционные тесты TLS: верный/чужой/истёкший сертификат, redirect, WSS.
- Проверить 401 и отзыв устройства, Keychain после переустановки/блокировки.
- Установить на физический iPhone: пользователь подтвердил установку через iloader 2026-09-12.
- Проверить LAN/плеер/команды/обложку с настоящим Windows-агентом.
- Камера для QR, системные разрешения и обработка отказа.
- Bonjour-поиск
_musicbridge._tcp, список ПК и обновление адреса при смене IP. - Улучшить ошибки сопряжения по серверным кодам; повтор загрузки обложки после 404.
- Иконка приложения, визуальная проверка разных размеров экрана и Dynamic Type.
- Live Activities / Dynamic Island / App Intents — отдельный последующий этап.
Ограничения: хранится один ПК; при смене его IP пока нужно повторное сопряжение. Нет фонового воспроизведения, App Store/TestFlight и подписанной IPA. Потеря ответа на успешное сопряжение может оставить устройство на ПК: удалить его в окне агента перед повтором. Облачный runner не имеет доступа к домашней LAN.
Проверка на 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, затем проверить команды, прогресс и обложку.
Карта
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.tools/package_ipa.sh: Release archive для настоящего iPhone и упаковка Payload.tools/verify_ipa.py: проверка ZIP, Info.plist, ARM64 и платформы Mach-O (iOS, не Simulator).
Результаты 2026-09-10
07322c2: успешный Actions run 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.a761431: успешный Actions run 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-подпись и управление настоящим ПК ещё не проверены.