# Примеры для iOS

Несколько примеров для IDE Xcode при разработке под iOS/iPadOS. Скачать их вы можете на нашем GitHub.

# Пример 1. Демонстрация основных возможностей SDK

Одностраничное приложение, в котором реализованы основные функции TrueConf Mobile SDK:

  1. Инициализация и подключение к серверу.

  2. Отслеживание статусов клиента.

  3. Ручной (по нажатию кнопки) логин пользователем и ручной логаут.

  4. Звонок другому пользователю по его TrueConf ID.

  5. Возможность принимать входящие видеозвонки и приглашения в групповую конференцию.

  6. Сброс состояния 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 способами:

  1. Получение приглашения посредством входящего вызова, т.е. так же, как и обычного вызова onInvite c подтверждением acceptCall.

  2. По ID конференции с использованием метода joinConf.

  3. По trueconf-ссылке, включающей ID конференции с использованием метода parseProtocolLink.

  4. Методом 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).

Если сообщение отправляется пользователю, который оффлайн, то оно ему придёт, как только он станет онлайн. Если сообщение отправляется в момент, когда отсутствует связь с сервером, то оно ставится в очередь и отправится в момент, когда связь с сервером возобновится.

Обновлено: 21.04.2025