Перейти к содержанию

Звонки с использованием iOS SDK

Описание

SIP звонки на устройствах iOS возможны как из браузера, так и с использованием [iOS SDK.

Схема работы

1. SIP-сервер как прокси-сервер для передачи вызовов и RTP медиа

  1. Устройство iOS начинает звонок
  2. WCS соединяется с SIP-сервером
  3. SIP-сервер соединяется с SIP-устройством, принимающим звонок
  4. Устройство iOS и SIP-устройство обмениваются аудио- и видеопотоками

2. SIP-сервер только как сервер для передачи вызовов

  1. Устройство iOS начинает звонок
  2. WCS соединяется с SIP-сервером
  3. SIP-сервер соединяется с SIP-устройством, принимающим звонок
  4. Устройство iOS и SIP-устройство обмениваются аудио- и видеопотоками

Тестирование

Исходящий звонок с iOS на SIP-устройство

  1. Для тестирования используем:
  2. два SIP-аккаунта;
  3. приложение Phone для совершения звонка;
  4. программный телефон для ответа на звонок.

  5. Соберите и установите на iOS-устройство приложение Phone. Запустите приложение, введите URL WCS-сервера для подключения к нему по Websocket и данные звонящего SIP-аккаунта:

  6. Запустите программный телефон, введите данные SIP-аккаунта, принимающего звонок:

  7. Нажмите в приложении кнопку Connect, будет установлено соединение с сервером. Затем введите идентификатор SIP-аккаунта, принимающего звонок, и нажмите кнопку Call:

  8. Примите звонок в программном телефоне, нажав кнопку ответа на звонок:

  9. Для завершения звонка нажмите кнопку Hangup в приложении, либо кнопку завершения звонка в программном телефоне.

Прием входящего звонка с SIP-устройства на iOS

  1. Для тестирования используем:
  2. два SIP-аккаунта;
  3. программный телефон для совершения звонка;
  4. приложение Phone для ответа на звонок.

  5. Соберите и установите на iOS-устройство приложение Phone. Запустите приложение, введите URL WCS-сервера для подключения к нему по Websocket и данные SIP-аккаунта, принимающего звонок:

    Нажмите в приложении кнопку Connect, будет установлено соединение с сервером

  6. Запустите программный телефон, введите данные звонящего SIP-аккаунта:

  7. В программном телефоне введите идентификатор SIP-аккаунта, принимающего звонок, и нажмите кнопку вызова:

  8. Примите звонок в приложении, нажав Answer:

  9. В программном телефоне убедитесь, что звонок начался:

  10. Для завершения звонка нажмите кнопку Hangup в приложении, либо кнопку завершения звонка в программном телефоне.

Последовательность выполнения операций

Ниже описана последовательность вызовов при использовании примера Phone-min для создания звонка

Класс для основного вида приложения: ViewController (заголовочный файл ViewController.h; файл имплементации ViewController.m)

  1. Создание звонка:
    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;
    }
    

  2. Отправка SIP INVITE на SIP сервер

  3. Отправка SIP INVITE на SIP устройство

  4. Получение подтверждения от SIP-устройства

  5. Получение подтверждения от SIP-сервера

  6. Получение от сервера события, подтверждающего успешное соединение

  7. Стороны звонка обмениваются аудио- и видеопотоками

  8. Завершение звонка
    FPWCSApi2Call.hangup() code

    - (void)callButton:(UIButton *)button {
        [self changeViewState:button enabled:NO];
        if ([button.titleLabel.text isEqualToString:@"HANGUP"]) {
            if ([FPWCSApi2 getSessions].count) {
                [call hangup];
            } else {
                [self toCallState];
            }
            ...
        }
    }
    

  9. Отправка SIP BYE на SIP-сервер

  10. Отправка SIP BYE на SIP-устройство

  11. Получение подтверждения от SIP-устройства

  12. Получение подтверждения от 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'

а такое соответствует

sipLogin='Ralf_C12441'
sipAuthenticationName='Ralf_C'
sipPassword='demo'
sipVisibleName='Ralf C'