# Примеры для 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 способами:
Получение приглашения посредством входящего вызова, т.е. так же, как и обычного вызова
onInvitec подтверждением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).
Если сообщение отправляется пользователю, который оффлайн, то оно ему придёт, как только он станет онлайн. Если сообщение отправляется в момент, когда отсутствует связь с сервером, то оно ставится в очередь и отправится в момент, когда связь с сервером возобновится.