# Примеры для iOS
Несколько примеров для IDE Xcode при разработке под iOS/iPadOS. Скачать их вы можете на нашем GitHub.
# Пример 1. Демонстрация основных возможностей SDK
Одностраничное приложение, в котором реализованы основные функции TrueConf Mobile SDK:
Инициализация и подключение к серверу.
Отслеживание статусов клиента.
Ручной (по нажатию кнопки) логин пользователем и ручной логаут.
Звонок другому пользователю по его TrueConf ID.
Возможность принимать входящие видеозвонки и приглашения в групповую конференцию.
Сброс состояния SDK до исходного.
Весь SDK по сути состоит из класса TCSDK и необходимых констант. Всё что нужно для начала работы – это импортировать TrueConfSDK.h
:
#import "TrueConfSDK/TrueConfSDK.h"
и объявить где-нибудь объект типа TCSDK
:
TCSDK* tcsdk;
Инициализация TCSDK и настройка обработки необходимых событий в примере находится в методе startSDK
и вызывается из viewDidLoad
класса ViewController.
Инициализация выполняется методом initWithViewController
:
[[TCSDK alloc] initWithViewController:self forServer:@””];
Затем идёт опциональная настройка обработки событий.
И в конце выполняется запуск SDK методом start
:
[self.tcsdk start];
Настраивать обработчики событий можно и после start
и в любой момент менять их.
Часть из доступных обработчиков событий реализованных в примере:
onServerStatus
– метод, который срабатывает при изменении статуса соединения с сервером.onStateChanged
– метод, который срабатывает при каком-либо изменении состояния SDK (состояние подключения к серверу, залогинен ли пользователь, в состоянии звонка или нет). Например, здесь можно сделать проверкуisConnectedToServer
.onLogin
иonLogout
– срабатывают при логине и логауте пользователя соотвественно. А проверить, залогинен ли пользователь, в любой момент времени можно методомisLoggedIn
.onInvite
– срабатывает, когда поступает вызов от другого пользователя или приглашение в групповую конференцию. Используйте методacceptCall
с параметромtrue
илиfalse
для ответа. Причём отвечать не обязательно прямо из этого блока или вообще.
Также в примере используются методы:
loginAs
– метод для логина.logout
– метод для логаута.callTo
– звонок пользователю с известным TrueConf ID.
Сброс состояния SDK осуществляется простым присвоением nil
объекту tcsdk
с предварительным выполнением метода stop
и последующей инициализацией при необходимости. Смотрите (IBAction)doClear:(id)sender
.
# Пример 2. Демонстрация работы с trueconf-ссылками
Пример автоматически подключается к серверу, после чего у вас есть возможность выполнить пакетом любые действия, описанные в trueconf-ссылке:
переподключиться к другому серверу;
залогиниться нужным пользователем;
позвонить другому пользователю по его TrueConf ID или подключиться к групповой конференции по её ID.
Все действия выполняются последовательно автоматически. Вам лишь нужно использовать метод parseProtocolLink
, в качестве параметра которого идет trueconf-ссылка в формате String
.
Подробнее об управляющем протоколе trueconf:
можно почитать в данной статье.
Также в примере продемонстрирована работа метода scheduleLoginAs
, который имеет множество определённых параметров для выполнения последовательных действий, описанных выше.
# Пример 3. Работа со статусами пользователей
В примере представлен работающий образец кода, позволяющий отслеживать статусы пользователей на сервере, с которыми можно установить связь, а также добавлять для отслеживания статусы любых пользователей и следить за их доступностью. Кроме самого статуса пользователя используется стандартный функционал SDK:
автоматическое подключение к серверу;
автоматически логин;
автоматический прием звонка.
Вся работа примера построена на основании единственного блока события onUserStatusUpdate
, который выполняется, когда сервер присылает статус какого-либо пользователя из нашей адресной книги. Для добавления любого пользователя в отслеживаемые используется метод getUserStatus
. При этом реализованный код позволяет беспроблемно отслеживать и отображать в таблице изменения статуса конкретного пользователя, отрабатывать добавку новых пользователей и добавление любого пользователя для отслеживания.
Для упрощения примера мы не использовали общих классов, поэтому работа идет только в ViewController и TableViewController. Основным средством хранения данных является NSMutableSet *userSet
, который при обновлении данных добавляет в set пользователей, т.е. идет просто накопление данных о пользователях.
Обработка накопленных данных идет в TableViewController, который выводит список пользователей. Отсортированный из NSSet
список пользователей (т.к. нам нужно для класса TableView работать именно с массивом) хранится в NSMutableArray *userArray
в виде массива из NSString
. Статуcы пользователей хранятся в NSMutableDictionary *cashStatusDictionary
, где ключем является TrueConf ID из массива, а значением - NSNumber
со значением статуса.
Работа с массивом реализована через метод -(NSArray *) userList
, в котором идет legasyInitialisation массива userArray
. Обратите внимание, что пользователи в отображаемом списке – это сумма списка контактов (постоянный список) со списком тех, за чьим статусом мы просто следим в течение текущей сессии.
# Пример 4. Работа с групповыми конференциями
Одной из важнейших возможностей TrueConf Mobile SDK является возможность создания и участия в видеоконференциях с несколькими пользователями одновременно. На данный момент в SDK возможно подключение только к уже существующим конференциям на сервере.
Подключение возможно 4 способами:
Получение приглашения посредством входящего вызова, т.е. так же, как и обычного вызова
onInvite
c подтверждениемacceptCall
.По ID конференции с использованием метода
joinConf
.По trueconf-ссылке, включающей ID конференции с использованием метода
parseProtocolLink
.Методом
scheduleLoginAs
, передавая в него ID конференции параметромcallToUser
и указываяisPublic=true
. Этот метод аналогичен методуparseProtocolLink
, но не требует знания формата командной строки, предоставляя фиксированный набор параметров.
Также рассмотрена обработка событий:
onAccept
- если вызываемый пользователь принял звонок от вас;onReject
- если вызываемый пользователь отклонил звонок от вас;onConferenceStart
- начало конференции;onConferenceEnd
- конец конференции;onConferencePasswordRequired
- если была неудачная попытка подключиться к конференции, у которой на сервере задан пароль для входа. Чтобы подключиться к такой конференции, нужно использовать методjoinConf
с параметромpassword
.
# Пример 5. Кастомизация интерфейса
Пример показывает, каким образом можно заменить изображения всех кнопок, которые показываются при звонке, добавить свои собственные дополнительные кнопки и открыть своё окно поверх окна конференции.
В примере изменяются картинки стандартных кнопок в панели управления конференцией, а также кнопок на селфвью. Кастомизация производится с помощью добавления в Assets картинок определённых названий.
Ниже представлен список имён для иконок, которые можно заменить:
call_end
- завершение звонка;camera_on_new / camera_off_new
- камера в состоянии вкл/выкл;mic_on_new / mic_off_new
- микрофон в состоянии вкл/выкл;sound_off_new
- устройство вывода звука в состоянии выкл;sound_on_new
- текущее устройство вывода звука - громкий динамик;receiver_sound
- текущее устройство вывода звука - разговорный динамик;airpods_device
- текущее устройство вывода звука - беспроводные наушники AirPods;airpodspro_device
- текущее устройство вывода звука - беспроводные наушники AirPods Pro;bluetooth_device
- текущее устройство вывода звука - bluetooth устройство;wired_device
- текущее устройство вывода звука - проводные наушники;more_new
- кнопка “троеточие”, которая открывает список дополнительных кнопок;camera_swap
- переключение камеры с фронтальной на заднюю и наоборот;more_btn
- выбор камеры и вкл/выкл фонарика;resize_selfview_visible / resize_selfview_small
- вкл/выкл компактного режима селфвью.
Чтобы иконки в Assets применились, нужно указать используемый NSBundle
в свойстве resources
.
self.tcsdk.resources = [NSBundle mainBundle];
В примере также добавляются 3 дополнительные кнопки в методе extraButtons
. Дополнительных кнопок может быть неограниченное количество и они будут добавлены в список, который открывается по тапу на кнопку троеточия в порядке расположения их в переданном массиве. Для дополнительной кнопки TCSDKExtraButton
можно задать текст, картинку и блок с кодом, выполняющийся на нажатие пользователем кнопки.
Дополнительно в этом примере показывается, как можно показать любой другой UIViewController
поверх окна конференции. При нажатии на каждую из 3 дополнительных кнопок создаваемый тут же UIViewController
отображается в разных стилях UIModalPresentationStyle
: pageSheet, formSheet или fullScreen с помощью метода presentViewController
.
# Пример 6. Подключение к серверу из списка
Пример в целом аналогичен Примеру 1. Здесь представлен образец кода, показывающий, как запустить SDK, указав список из возможных серверов для подключения. Пример подключится к первому обнаруженному работающему серверу из списка. В инициализации методом initWithViewController
можно написать произвольную строку для сервера, а потом в методе startWithServersList
передать строку с набором адресов серверов, разделённых запятой. В этом случае SDK будет пытаться подключиться к серверам из списка в порядке их перечисления.
Вы можете подписаться на событие onServerStatus
, чтобы наблюдать процесс перебора адресов. Для «плохих» адресов будет сообщено connected=false
, а для первого «хорошего» будет connected=true
и перебор остановится. Этот процесс может занимать некоторое время - обычно не более 30 секунд на один адрес.
# Пример 7. Кастомизация вывода видеоокон в конференции
В примере реализована возможность размещения собственного изображения и изображения участников конференции в отдельные UIView
. Также показана самостоятельная реализация кнопок управления конференцией на главном окне.
Всё, что нужно для изменения размеров и координат других участников конференции, это реализовать метод протокола TCWindowsDelegate
. Это, а также указание делегата в свойство windowsDelegate
реализовано прямо в ViewController:
self.tcsdk.windowsDelegate = self;
Свойство hideConfControls
используется, чтобы скрыть дефолтные элементы управления конференцией и создать свои собственные в любом месте.
Свойство windowsDelegate
используется, чтобы изменить координаты видео окон каждого участника. Протокол TCWindowsDelegate
имеет только 1 метод tcWindowsGetPlaces
и вызывается автоматически, когда SDK необходимо перестроить полученные видео. В этом примере мы уменьшаем ширину всех видео до половины, изменяя свойства прямоугольника объектов TCSDKWindowRect
. Также в каждом объекте есть свойства userId
и resolution
. Свойство resolution
содержит исходное разрешение декодированного видео.
Чтобы расположить в произвольном месте окно с участниками конференции и собственное изображение, используются свойства xview
и xsview
, которые указываются как родительские элементы для них.
В Storyboard добавлены 3 UIView:
розовый
- содержит кнопки для управления конференцией, которые частично повторяют функции стандартной панели управления: End - завершает звонок с помощью методаhangup
, Mic - изменяет статус микрофона с помощью методаmuteMicrophone
, Cam - изменяет статус камеры с помощью методаmuteCamera
.зелёный
- устанавливается в свойствоxview
и следовательно содержит входящие видео во время конференции. Координаты и размеры могут быть любыми, которые вы укажете.жёлтый
- устанавливается в свойствоxsview
и следовательно содержит собственное изображение во время конференции. Координаты и размеры могут быть любыми, которые вы укажете.
Для управления аудио устройствами вывода звука добавлена кнопка Audio
, которая отображается только во время конференции. По её нажатию появляется UIAlertController
с ячейками, заполненными информацией о доступных аудио устройствах (название и картинка). Чтобы получить список аудио устройств, используется метод getAudioDeviceList
. Нажатие на ячейку этого UIAlertController
выполнит смену текущего аудио устройства на выбранное, указав его в свойстве audioDevice
.
Для смены камеры с передней на заднюю (или наоборот) добавлена кнопка Swap
, которая отображается только во время конференции. По её нажатию выполняется метод swapCamera
, который сменяет текущую камеру.
# Пример 8. Чат
В примере показана возможность отправки текстовых сообщений методом sendChatMessage
и обработки новых входящих сообщений в событии onChatMessageReceived
.
Реализована возможность отправки и получения сообщений из главного ViewController примера, а также в отдельном окне чата ChatViewController, который можно открыть из главного окна по кнопке Open Simple Chat
, а также, находясь в конференции, по кастомной кнопке Chat
, которая создана с помощью метода setNewExtraButtons
(создание дополнительных кнопок управления конференцией подробно рассмотрено в Примере 5).
Если сообщение отправляется пользователю, который оффлайн, то оно ему придёт, как только он станет онлайн. Если сообщение отправляется в момент, когда отсутствует связь с сервером, то оно ставится в очередь и отправится в момент, когда связь с сервером возобновится.