Звонки с использованием iOS SDK¶
Описание¶
SIP звонки на устройствах iOS возможны как из браузера, так и с использованием [iOS SDK.
Схема работы¶
1. SIP-сервер как прокси-сервер для передачи вызовов и RTP медиа¶
- Устройство iOS начинает звонок
- WCS соединяется с SIP-сервером
- SIP-сервер соединяется с SIP-устройством, принимающим звонок
- Устройство iOS и SIP-устройство обмениваются аудио- и видеопотоками
2. SIP-сервер только как сервер для передачи вызовов¶
- Устройство iOS начинает звонок
- WCS соединяется с SIP-сервером
- SIP-сервер соединяется с SIP-устройством, принимающим звонок
- Устройство iOS и SIP-устройство обмениваются аудио- и видеопотоками
Тестирование¶
Исходящий звонок с iOS на SIP-устройство¶
- Для тестирования используем:
- два SIP-аккаунта;
- приложение Phone для совершения звонка;
-
программный телефон для ответа на звонок.
-
Соберите и установите на iOS-устройство приложение Phone. Запустите приложение, введите URL WCS-сервера для подключения к нему по Websocket и данные звонящего SIP-аккаунта:
-
Запустите программный телефон, введите данные SIP-аккаунта, принимающего звонок:
-
Нажмите в приложении кнопку
Connect
, будет установлено соединение с сервером. Затем введите идентификатор SIP-аккаунта, принимающего звонок, и нажмите кнопкуCall
:
-
Примите звонок в программном телефоне, нажав кнопку ответа на звонок:
-
Для завершения звонка нажмите кнопку
Hangup
в приложении, либо кнопку завершения звонка в программном телефоне.
Прием входящего звонка с SIP-устройства на iOS¶
- Для тестирования используем:
- два SIP-аккаунта;
- программный телефон для совершения звонка;
-
приложение Phone для ответа на звонок.
-
Соберите и установите на iOS-устройство приложение Phone. Запустите приложение, введите URL WCS-сервера для подключения к нему по Websocket и данные SIP-аккаунта, принимающего звонок:
Нажмите в приложении кнопкуConnect
, будет установлено соединение с сервером -
Запустите программный телефон, введите данные звонящего SIP-аккаунта:
-
В программном телефоне введите идентификатор SIP-аккаунта, принимающего звонок, и нажмите кнопку вызова:
-
Примите звонок в приложении, нажав
Answer
:
-
В программном телефоне убедитесь, что звонок начался:
-
Для завершения звонка нажмите кнопку
Hangup
в приложении, либо кнопку завершения звонка в программном телефоне.
Последовательность выполнения операций¶
Ниже описана последовательность вызовов при использовании примера Phone-min для создания звонка
Класс для основного вида приложения: ViewController (заголовочный файл ViewController.h; файл имплементации ViewController.m)
-
Создание звонка:
FPWCSApi2Session.createCall()
,FPWCSApi2Call.call()
code
- (FPWCSApi2Call *)call { FPWCSApi2Session *session = [FPWCSApi2 getSessions][0]; FPWCSApi2CallOptions *options = [[FPWCSApi2CallOptions alloc] init]; NSString *parameters = _inviteParameters.input.text; if (parameters && [parameters length] > 0) { NSError* err = nil; parameters = [parameters stringByReplacingOccurrencesOfString:@""" withString:@"\""]; NSMutableDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:[parameters dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&err]; if (err) { NSLog(@"Error converting JSON Invite parameters to dictionary %@, JSON %@", err, parameters); } else { options.inviteParameters = dictionary; } } options.callee = _callee.input.text; ... NSError *error; call = [session createCall:options error:&error]; ... [call call]; return call; }
-
Отправка
SIP INVITE
на SIP сервер -
Отправка
SIP INVITE
на SIP устройство -
Получение подтверждения от SIP-устройства
-
Получение подтверждения от SIP-сервера
-
Получение от сервера события, подтверждающего успешное соединение
-
Стороны звонка обмениваются аудио- и видеопотоками
-
Завершение звонка
FPWCSApi2Call.hangup()
code
-
Отправка
SIP BYE
на SIP-сервер -
Отправка
SIP BYE
на SIP-устройство -
Получение подтверждения от SIP-устройства
-
Получение подтверждения от SIP-сервера
Известные проблемы¶
1. Невозможно совершить SIP-звонок, если поля SIP Login
, SIP Authentification name
содержат недопустимые символы¶
Симптомы
Звонок не совершается, зависает в статусе PENDING
Решение
Согласно RFC3261, SIP Login
и SIP Authentification name
не должны содержать неэкранированных пробелов, спецсимволов и не должны заключаться в угловые скобки <>
.
Например, такое заполнение полей не соответствует стандарту
sipLogin='Ralf C12441@host.com'
sipAuthenticationName='Ralf C'
sipPassword='demo'
sipVisibleName='null'
а такое соответствует