SHD Desktop
Исходный код настольных приложений SHD для macOS и Windows. Оба приложения открывают веб-версию SHD в отдельном окне и поддерживают работу с DEV и PROD.
Возможности и ограничения
- macOS: Swift, AppKit и WKWebView; вкладки и окна, печать, масштабирование, камера и микрофон. Сборка рассчитана на Apple Silicon и macOS 14 или новее.
- Windows: WPF и WebView2; окна и вкладки, загрузки, печать, масштабирование, системные диалоги сайта, камера и микрофон. Сборка рассчитана на Windows x64.
- Passkey: на странице входа приложение использует ту же кнопку passkey, что и сайт, и открывает вход в браузерной сессии. После входа ответ возвращается в приложение по
shd-auth://callback. - Ограничение входа: серверный поток настольной авторизации подключён только на DEV. В PROD вход по passkey в приложении пока не работает.
Сборка macOS
Нужен Mac с Xcode Command Line Tools и Swift 6. Из корня репозитория выполните:
./Apple/Scripts/build-app.sh
Скрипт создаёт Apple/dist/SHD-macOS-arm64.zip. Внутри будет SHD.app; распакуйте архив и перенесите приложение в /Applications. Архив подписан локальной ad-hoc подписью и не нотарифицирован Apple.
Сборка Windows
Для сборки нужны Windows x64 и .NET 10 SDK. В PowerShell из корня репозитория выполните:
./Windows/Scripts/build.ps1
Скрипт создаёт Windows/dist/SHD-Windows-x64.zip, включающий приложение и сценарии установки. На компьютере пользователя .NET устанавливать не нужно; требуется Microsoft Edge WebView2 Runtime. Подробности установки и удаления описаны в Windows/README.md.
GitHub Actions запускает Windows-сборку при изменениях в Windows/ и вручную через workflow Windows desktop build. ZIP появляется в артефактах только после успешной сборки.
Вход по passkey
Нажатие существующей кнопки passkey на сайте запускает поток настольной авторизации:
- Приложение открывает
/desktop-auth/authorizeв браузере сclient_id=shd-desktop,redirect_uri=shd-auth://callback, случайнымиstateи PKCE challenge (S256). - После обычного входа сервер возвращает одноразовый код и
stateприложению черезshd-auth://callback. - Приложение отправляет код и PKCE verifier в теле POST-запроса на
/desktop-auth/completeиз своего WebView. Сервер создаёт обычную веб-сессию, поэтому cookie остаётся в профиле приложения.
Код одноразовый и ограничен по времени. В приложениях нельзя включить PROD-вход одной настройкой: сервер должен отдельно разрешить и развернуть поток на PROD.