当app在后台时,iOS pjsip启动VoIP呼叫

时间:2018-03-20 12:09:08

标签: ios iphone voip pjsip

我们正在开发一款使用pjsip进行VoIP通话的iOS应用。 当应用程序在前台或者我们在前台启动呼叫然后将应用程序放在后台时,一切正常。

但当应用程序处于后台时,我们需要在从BLE设备建立某个连接时启动VoIP呼叫。

所以基本上BLE设备会与应用程序通话,并要求它启动呼叫。 这不起作用。

bg中的音频已启用。

这在iOS上是否可行? 我在Apple的文档中找不到任何关于这种情况的参考

我们正在使用TCP进行VoIP连接。

3 个答案:

答案 0 :(得分:0)

您必须使用PushKit(VoIP Push Notification)在后台唤醒您的VoIP应用。 Apple强烈建议使用PushKit,并且pjsip添加了一些修改来支持它。

Voice Over IP (VoIP) Best Practices - Apple

PushKit guide, to accept calls in the background after kCFStreamNetworkServiceTypeVoIP is deprecated (iOS 10/iOS 9) - pjsip

答案 1 :(得分:0)

我不确定在具体情况下如何做到这一点,但我认为像CallKit之类的东西可以帮助你。

使用CallKit,您可以将应用的所有VOIP功能与本机iOS同步。这意味着如果您可以使用BLE设备启动本机通话,那么您可以使用该设备从应用程序启动呼叫,而它在后台运行。

您可以在此处详细了解:

Apple Documentation for an INStartAudioCallIntent

WWDC Video

编辑:

Apple's Documentation for CallKit

  

拨打电话   用户可以通过以下任何一种方式使用VoIP应用程序发起拨出电话:

     
      
  1. 在应用内执行互动

  2.   
  3. 使用支持的自定义网址方案打开链接

  4.   
  5. 使用Siri发起VoIP通话

  6.   

答案 2 :(得分:0)

这是来自官方文档,可能会帮助你。 https://trac.pjsip.org/repos/wiki/Getting-Started/iPhone#keepalive

  

由于该过程通常在应用程序处于暂停状态时暂停   后台,处理TCP keepalive计时器的工作线程也是   暂停。所以基本上应用程序需要安排定期唤醒   允许库发送TCP keep-alive。

将AppDelegate.m修改为类似的内容 -

- (void)keepAlive {
    /* Register this thread if not yet */
    if (!pj_thread_is_registered()) {
        static pj_thread_desc   thread_desc;
        static pj_thread_t     *thread;
    pj_thread_register("mainthread", thread_desc, &thread);
    }

    /* Simply sleep for 5s, give the time for library to send transport
     * keepalive packet, and wait for server response if any. Don't sleep
     * too short, to avoid too many wakeups, because when there is any
     * response from server, app will be woken up again (see also #1482).
     */
    pj_thread_sleep(5000);
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    /* Send keep alive manually at the beginning of background */
    pjsip_endpt_send_raw*(...);

    /* iOS requires that the minimum keep alive interval is 600s */
    [application setKeepAliveTimeout:600 handler: ^{
    [self performSelectorOnMainThread:@selector(keepAlive)
              withObject:nil waitUntilDone:YES];
    }];
}