Files
ios/PLAN.md
T

14 KiB
Raw Blame History

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: верный/чужой/истёкший сертификат, HTTPS и WSS.
  • Интеграционный тест отказа от redirect.
  • Проверить 401 и отзыв устройства, Keychain после переустановки/блокировки.
  • Установить на физический iPhone: пользователь подтвердил установку через iloader 2026-09-12.
  • Первое подключение к настоящему Windows-агенту: пользователь подтвердил рабочий пилот на iPhone 2026-09-12.
  • Полная ручная проверка каждого действия, обложки и устойчивости в Яндекс Музыке и SoundCloud.
  • Камера для QR, запрос доступа, сообщение при отказе, остановка камеры при закрытии/уходе в фон.
  • Bonjour-поиск _musicbridge._tcp, список адресов ПК и восстановление адреса с сохранённым сертификатом.
  • Проверить камеру, открытие QR стандартной камерой, Bonjour и смену IP на физическом iPhone.
  • Улучшить ошибки сопряжения по серверным кодам; повтор загрузки обложки после 404.
  • Иконка приложения, визуальная проверка разных размеров экрана и Dynamic Type.
  • Live Activities / Dynamic Island / App Intents — отдельный последующий этап.

Ограничения: хранится один доверенный ПК; адрес при смене IP восстанавливается через Bonjour, если доступны объявления того же агента. Новый адрес сохраняется только после успешного HTTPS-запроса с прежним отпечатком и токеном. Нет фонового воспроизведения, App Store/TestFlight и подписанной IPA. Потеря ответа на успешное сопряжение может оставить устройство на ПК: удалить его в окне агента перед повтором. Облачный runner не имеет доступа к домашней LAN.

Проверка на iPhone 2026-09-12

  • Windows GUI запущен с --tray --lan, порт TCP 8765 слушает.
  • На iPhone первая попытка сопряжения завершилась ошибкой недействительного сертификата сервера. Установка приложения уже работает; это отдельная TLS-проблема.
  • Ошибка воспроизведена настоящим HTTPS-запросом в iOS Simulator: старый код возвращает NSURLErrorDomain -1202 даже с верным отпечатком. Одни ATS-исключения её не устранили. Исправление: обрабатывать server trust также в URLSessionTaskDelegate.didReceive, направляя его в общую проверку отпечатка и срока сертификата. После этого HTTPS и WSS проходят.
  • Подготовлены 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 и не включаются в приложение или артефакты.
  • Сообщение «непригодные данные» при импорте приглашения пока не разобрано: пользователь попросил отложить его. Следующий этап — исправить импорт и добавить сканер QR, затем поиск ПК и проверки устойчивости.
  • 93f7c9c: Actions 34694138394 — 10 XCTest, 0 отказов, успешный Release archive. Версия 0.1.1 (build 2), IPA скачана в build/iPhone-0.1.1/MusicBridge-iPhone.ipa; локально проверены ZIP, iPhoneOS ARM64, версия и ATS-настройки внутри готовой IPA. После обновления пользователь подтвердил: «всё работает в пилотном режиме». Это подтверждает первую рабочую связку iPhone ↔ Windows; полная матрица ручных проверок и длительная работа пока не подтверждены.

Карта

  • MusicBridge/Models.swift: контракт и проверка входных данных.
  • BridgeClient.swift: сертификат, HTTPS, WSS, ограничения ответов.
  • KeychainStore.swift: хранение сопряжения.
  • PlayerStore.swift: состояние, команды, жизненный цикл и восстановление.
  • ContentView.swift: подключение и плеер.
  • QRScanner.swift: камера AVFoundation, доступ, сканирование и жизненный цикл.
  • DiscoveryStore.swift: Bonjour, разрешение адресов, TXT и безопасный выбор адреса.
  • 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).

QR и поиск ПК — 0.2.0 (build 3)

  • Добавлен сканер внутри приложения; после сканирования заполняются адрес, отпечаток и код, подключение запускает пользователь. Также зарегистрирована схема musicbridge://, приглашения принимаются через onOpenURL. Посторонний QR, повреждённый JSON и истёкший код дают понятную ошибку.
  • Регистрация URL-схемы устраняет отсутствие обработчика ссылки при чтении QR стандартной камерой. Исходное сообщение «непригодные данные» ещё нужно перепроверить на телефоне, точный источник той ошибки не был установлен.
  • Поиск использует NSBonjourServices и NetServiceBrowser. Объявления версии 1 принимаются только с допустимым SHA-256 и частным IPv4. При первом выборе найденного ПК пользователь сверяет полный отпечаток с его экраном.
  • При восстановлении адреса TXT служит только подсказкой: сертификат из сети не заменяет сохранённый. Чужой fingerprint не используется; токен отправляется только через соединение с прежним TLS pin. После успеха адрес обновляется в Keychain.
  • Поиск приостанавливается в фоне; адреса повторно разрешаются раз в 15 секунд, список ограничен 64 сервисами и 16 адресами на сервис. Есть повторный поиск и переход в настройки разрешений.
  • 397caf2: Actions 34694893204 — 14 XCTest, 0 отказов, Release archive успешен. Проверены формат объявления Windows, разбор sockaddr, отказы чужим данным, сохранение pin/token при смене адреса и .NET timestamp с семью дробными цифрами. Камера и реальный multicast iPhone ↔ Windows не эмулируются этими тестами.

Результаты 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-подпись и управление настоящим ПК ещё не проверены.