Запуск службы VOIP (PJSIP) в фоновом режиме

Мое приложение было только что отклонено Apple, поскольку оно не реализует должным образом фоновый запуск и является приложением VOIP на iOS.

Мой странный код, который заставлял его работать, был

[self performSelectorOnMainThread:@selector(keepAlive) withObject:nil waitUntilDone:YES];
[application setKeepAliveTimeout:KEEP_ALIVE_INTERVAL handler: ^{
  [self performSelectorOnMainThread:@selector(keepAlive) withObject:nil waitUntilDone:YES];
}];

Я знаю, что это неправильно

Затем я последовал

http://blog.dkaminsky.info/2013/01/27/keep-your-ios-app-running-in-background-forever/, который позволяет использовать VOIP для постоянной работы. Опять же, я считаю, что это неправильно.

Мне просто нужно вызвать один метод, чтобы поддерживать PJSIP.

Как мне это сделать правильно?

ОБНОВЛЕНИЕ

Я посмотрел руководство Apple, похоже, это правильно

[application setKeepAliveTimeout:KEEP_ALIVE_INTERVAL handler: ^{
        [self performSelectorOnMainThread:@selector(keepAlive) withObject:nil waitUntilDone:YES];
        NSLog(@"Fire");
    }];

Однако я не уверен, как настроить порт TCP PJSIP для работы в фоновом режиме.

APPLE: настройте один из сокетов приложения для использования VoIP.

Работает нормально в фоновом режиме, это просто Apple отклоняет

2.16

Мы обнаружили, что ваше приложение использует фоновый режим, но не включает функциональные возможности, требующие постоянной работы этого режима. Такое поведение не соответствует рекомендациям по обзору в App Store.

Мы заметили, что ваше приложение объявляет о поддержке VoIP в ключе UIBackgroundModes в вашем Info.plist, но не поддерживает входящие вызовы от подключенной службы VoIP.

Если ваше приложение не поддерживает входящие вызовы от подключенной к нему службы VoIP, фоновый режим VoIP не подходит. Как указано в Руководстве по программированию iOS, этот ключ предназначен для приложений, которым необходимо отслеживать сокеты для входящих вызовов:

«Вместо того, чтобы постоянно держать приложения VoIP в активном состоянии, система позволяет им приостанавливать работу и предоставляет средства для мониторинга их сокетов. При обнаружении входящего трафика система пробуждает приложение VoIP и возвращает ему управление своими сокетами. "

Пожалуйста, обратите внимание на использование значения «audio» в ключе UIBackgroundModes вашего файла Info.plist. Использование фонового режима аудио будет держать текущие исходящие вызовы VoIP открытыми, пока ваше приложение работает в фоновом режиме.

Было бы уместно добавить функции VoIP или удалить параметр «VoIP» из ключа UIBackgroundModes. По дискретным вопросам на уровне кода вы можете обратиться в службу технической поддержки разработчиков Apple. Обязательно:

Обновление 2

PJSIP сказал мне, что сокеты помечены для VOIP, поэтому я понятия не имею, почему это отклоняется


person Burf2000    schedule 11.02.2014    source источник


Ответы (3)


вам следует проверить раздел «Объявление поддерживаемой фоновой задачи вашего приложения». в ссылке Руководство по программированию приложений для iOS

Внедрение приложения VoIP

Приложение для передачи голоса по Интернет-протоколу (VoIP) позволяет пользователю совершать телефонные звонки, используя подключение к Интернету, а не сотовую связь устройства. Такому приложению необходимо поддерживать постоянное сетевое подключение к связанной с ним службе, чтобы оно могло принимать входящие вызовы и другие соответствующие данные. Вместо того, чтобы постоянно держать приложения VoIP в активном состоянии, система позволяет им приостанавливать работу и предоставляет им средства для мониторинга их сокетов. При обнаружении входящего трафика система пробуждает приложение VoIP и возвращает ему управление своими сокетами.

Чтобы настроить приложение VoIP, вы должны сделать следующее:

Enable support for Voice over IP from the Background modes section of the Capabilities tab in your Xcode project. (You can also enable this support by including the UIBackgroundModes key with the voip value in your app’s Info.plist file.)

Configure one of the app’s sockets for VoIP usage.

Before moving to the background, call the setKeepAliveTimeout:handler: method to install a handler to be executed periodically. Your app can use this handler to maintain its service connection.

Configure your audio session to handle transitions to and from active use.

Включение значения voip в ключ UIBackgroundModes позволяет системе знать, что она должна позволить приложению работать в фоновом режиме по мере необходимости для управления его сетевыми сокетами. Приложение с этим ключом также перезапускается в фоновом режиме сразу после загрузки системы, чтобы обеспечить постоянную доступность служб VoIP.

« Советы по разработке приложения VoIP »

person Pawan Rai    schedule 11.02.2014
comment
Я только что нашел это руководство, запутанный бит - это настройка сокетов ваших приложений, это библиотека под названием PJSIP, которая обрабатывает все - person Burf2000; 11.02.2014
comment
Как установить: настроить один из сокетов приложения для использования VoIP. ?? | Перед переходом в фоновый режим вызовите метод setKeepAliveTimeout: handler:, чтобы установить обработчик, который будет выполняться периодически. Ваше приложение может использовать этот обработчик для поддержания подключения к службе. Настройте аудиосеанс для обработки переходов к активному использованию и обратно. - person Eesha; 17.01.2017

Привет, это мне помогло: дело в том, что обычно сигнализация SIP использует UDP в качестве протокола передачи, но Apple разрешает постоянные соединения только с протоколом TCP. Итак, вот шаги:
1) Выясните, поддерживает ли ваш SIP-сервер сигнализацию SIP с TCP (например, sip2sip поддерживает, а ekiga нет).
2) Избавьтесь от UDP-соединения в pjsua, вставить где-нибудь

app_config.no_udp = PJ_TRUE;
app_config.no_tcp = PJ_FALSE;

3) Если вы используете исходящий прокси, укажите "; transport = TCP" в конце URL-адреса.

cfg->cfg.outbound_proxy_cnt = 1;
cfg->cfg.outbound_proxy[0] = pj_str("sip:proxy.sipthor.net;transport=tcp");

4) Добавьте "; transport = TCP" все учетные записи и зарегистрируйте URL-адрес сервера, например: + sip: [email protected]; transport = TCP sip: sip2sip.info; transport = TCP sip2sip.info имя пользователя пароль

Надеюсь, это поможет.

person user3489820    schedule 10.04.2014
comment
Не могли бы вы помочь мне, я не могу поддерживать розетку в течение 10 минут. (Keep alive перестает работать, пока приложение находится в спящем режиме.) - person Uttam Kadam; 23.05.2015
comment
Не могли бы вы уточнить, где мне нужно установить соединение как TCP - person Kannan Prasad; 04.04.2016

Apple очень обеспокоена тем, что написано в вашем приложении и что оно делает на самом деле. Похоже, что ваше приложение на самом деле не обрабатывает входящие вызовы VoIP, хотя вы упомянули об этом в своем списке.

Вы также можете

а) Удалите настройку VoIP из списка ИЛИ

б) Добавьте функциональность для входящих звонков в вашем приложении

Ваше здоровье !!!

person Ruchira Randana    schedule 31.03.2015