|
1 | | -# livedigital-ios-sdk-binary |
2 | | -LiveDigitalSDK public builds (binary XCFramework) |
| 1 | +# livedigital SDK |
| 2 | + |
| 3 | +Этот репозиторий содержит сборки нативной реализации livedigital SDK для iOS в формате толстого бинарного XCFramework. |
| 4 | + |
| 5 | +livedigital SDK — клиент сервиса livedigital (https://docs.livedigital.space). SDK реализует |
| 6 | + * сигналинг (подключение, обмен командами с медиа-сервером) |
| 7 | + * логику восстановления соединения при реконнекте |
| 8 | + * анализ качества соединения |
| 9 | + * работу с входящими и исходящими медиа-треками |
| 10 | + * работу с видео-слоями |
| 11 | + * размытие и замену фона для исходящего видео |
| 12 | + * логику выделения активного спикера |
| 13 | + * транспорт для передачи команд и мета-данных специфичных для приложения |
| 14 | + |
| 15 | +## Совместимость |
| 16 | + |
| 17 | +* устройства iOS / iPadOS 16+ |
| 18 | +* симуляторы iOS / iPadOS 16+ |
| 19 | + |
| 20 | +Поддержка iOS 15 есть, но находится в стадии deprecated. Стабильность работы на ней не тестируется и не гарантируется. Поддержка может быть прекращена в скором времени. |
| 21 | + |
| 22 | +SDK поддерживает работу на симуляторах, однако полноценное тестирование должно проводиться на реальном устройстве, т.к. имплементация работы с камерой, размытие фона, набор поддерживаемых кодеков и видео-форматов могут отличаться. |
| 23 | + |
| 24 | +## Подключение |
| 25 | + |
| 26 | +Доступны два способа подключения через менеджеры зависимостей — CocoaPods и SwiftPM. Мы рекомендуем использовать SwiftPM как более актуальное и современное решение. |
| 27 | + |
| 28 | +Мы рекомендуем фиксировать точную версию зависимости (SPM: `Exact Version: 2.12.3` / CP: `:tag => '2.12.3'`) и обновлять любые зависимости по мере необходимости только вручную. Как минимум необходимо зафиксировать мажорную версию (SPM: `Up to Next Major Version: 2.12.0 < 3.0.0` / CP: `~> 2.12`), т.к. выпуск мажорного релиза обычно связан с необходимостью изменений в коде приложения. |
| 29 | + |
| 30 | +Подключать зависимость нужно в таргет приложения, а также в таргеты расширений которые могут использовать SDK (например Broadcast Upload Extension для демонстрации экрана, если оно реулизуется). |
| 31 | + |
| 32 | +### Swift Package Manager |
| 33 | + |
| 34 | +* Подключить пакет `LiveDigitalSDK` из репозитория `https://github.com/VLprojects/livedigital-ios-sdk-binary.git`. |
| 35 | +* Из пакета добавить единственную публичную библиотеку `LiveDigitalSDK` в необходимые таргеты. |
| 36 | + |
| 37 | +### CocoaPods |
| 38 | + |
| 39 | +*Несмотря на то что livedigital SDK публикуется в CocoaPods Trunk репозиторий, мы рекомендуем подключать нашу и все остальные зависимости не из Trunk, а напрямую указывая репозиторий и конкретную версию или тег. CocoaPods Trunk будет закрыт в 2026 году, после чего там не будут публиковаться новые версии.* |
| 40 | + |
| 41 | +* Добавить под `LiveDigitalSDK` в необходимые таргеты |
| 42 | + ```Ruby |
| 43 | + pod 'LiveDigitalSDK', |
| 44 | + :git => 'https://github.com/VLprojects/livedigital-ios-sdk-binary', |
| 45 | + :tag => '2.12.3' |
| 46 | + ``` |
| 47 | +* Установить зависимости командой `pod install --repo-update`. |
| 48 | + |
| 49 | +## Пример интеграции и демо |
| 50 | + |
| 51 | +Этот репозиторий содержит папку Example с проектом демонстрирующим интеграцию и использование livedigital SDK. Example проект выполнен в минималистичном духе и не должен рассматриваться с точки зрения удобства UX, красоты кода и архитектуры, надёжности решений и т.д. |
| 52 | + |
| 53 | +Исходный код общий, но проектных файла два: |
| 54 | + |
| 55 | +* SPM_Example.xcodeproj — SDK подключено через SwiftPM. Для начала работы можно просто открыть проект. |
| 56 | +* CP_Example.xcworkspace — SDK подключено через CocoaPods. Перед открытием проекта (воркспейса) нужно установить зависимости выполнив команду `pod install --repo-update`. |
| 57 | + |
| 58 | +Для запуска на реальном устройстве нужно предварительно настроить подписывание приложения на вкладке Signing & Capabilities в настройках таргета `LiveDigitalSDKExample` используя свой Apple Developer Account. |
| 59 | + |
| 60 | +При запуске приложения показывается экран `StartVC` содержащий поля для ввода идентификатора спейса(группы) и комнаты. |
| 61 | + |
| 62 | +Основная работа сосредоточена в классе `SessionVC`, который отвечает за сессию "звонка" или "конференции". При первом запуске будут запрошены доступы к камере и микрофону. Для сохранения простоты Example проекта, он не реализует полноценной обработки ситуации когда разрешения не выданы. После выдачи разрешений происходит подключение к комнате. В верхней части экрана отображается локальный участник с кнопками включения микрофона и камеры. Основную часть экрана занимает сетка участников с горизонтальной прокруткой. |
| 63 | + |
| 64 | +Для простоты проверки работы SDK, в Example проекте в комнате участники видят не только друг друга, но и себя (с аудио и видео прошедшими до медиа-сервера и обратно). Таким образом можно протестировать работу SDK используюя всего одно устройство. При подключении нескольких участников к одной комнате это может мешать тестированию звука, так что можно отключить получение медиа-треков собственного участника удалив строку `channelSession.shouldShowLocalPeer = true`. Для удобства тестирования можно зайти в ту же комнату через веб-приложение livedigital. Сссылку на тестовую комнату можно получить у нашей команды. |
| 65 | + |
| 66 | +Горизонтальный свайп по своему превью переключает камеру между фронтальной и основной. Долгое нажатие на кнопку микрофона показывает меню выбора звукового устройства. |
| 67 | + |
| 68 | +Example приложение кроме базовой работы с SDK реализует две часто востребованные механики: |
| 69 | + |
| 70 | +* Обмен мета-данными участников. При старте сессии (`engine.connectToChannel(...)`) передаётся параметр `peerPayload: ["name": UIDevice.current.name]`. Передаваемое значение (словарь) может содержать набор произвольных ключей и значений, с которыми работает приложение — имя пользователя, userId в терминах приложения, версия приложения, статус пользователя и т.д.. Во время сессии пользователь может обновлять свои мета-данные через метод `self.channelSession?.updatePeerPayload(...)`. Другие участники находящиеся в комнате могут прочитать метаданные друг друга через свойство `peer.payload`, а также могут получать обновления метаданных в режиме реального времени в callback метод `gotPeerAppDataUpdates(_ updates:)`. |
| 71 | + |
| 72 | +* Пауза невидимых входящих видео-потоков. SDK позволяет сократить нагрзку на сеть и батарею пользователя ставя ненужные в данный момент входяшие медиа-потоки на паузу. Например если приложение свёрнуто — достаточно получать только аудио, а видео поток остановить. Если в комнате находятся 12 участников, но на экране видны только 2 — остальные 10 потоков можно поставить на паузу. Пример реализации этой механики находится в методе `updateVisiblePeersVideos`. |
0 commit comments