当前位置: 首页 > 知识库问答 >
问题:

iOS pjsip 在应用处于后台时启动 VoIP 呼叫

隆功
2023-03-14

我们正在开发一个使用pjsip进行VoIP通话的iOS应用程序。当应用程序在前台时,或者如果我们在前台开始通话,然后将应用程序放在后台,一切都很好。

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

因此,基本上BLE设备与应用程序对话,并要求它开始通话。这不管用。

血糖中的音频已启用。

这在iOS上可行吗?我在苹果的文档中找不到任何关于这种情况的参考。

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

共有3个答案

东郭翰音
2023-03-14

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

由于当应用程序处于后台时,进程通常会挂起,因此处理 TCP 保持活动状态计时器的工作线程也会挂起。因此,基本上应用程序需要安排定期唤醒以允许库发送TCP保持活动状态。

修改您的AppDelegate。我喜欢这样的东西-

- (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];
    }];
}
许正平
2023-03-14

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

使用CallKit,您可以将应用程序的所有VOIP功能与本机iOS同步。这意味着如果您可以使用BLE设备启动本机呼叫,那么您肯定可以在应用程序处于后台时使用该设备启动呼叫。

您可以在此处阅读更多信息:

INStartAudioCall的 Apple 文档

WWDC视频

编辑:

关于Apple的CallKit文档

拨打电话 用户可以通过以下任一方式使用 VoIP 应用发起传出呼叫:

>

  • 在应用内执行交互

    使用支持的自定义URL方案打开链接

    使用西里发起网络语音呼叫

  • 燕飞文
    2023-03-14

    你必须使用PushKit(VoIP推送通知)才能在后台唤醒你的VoIP应用。苹果强烈建议使用PushKit,pjsip增加了一些修改来支持它。

    IP 语音 (VoIP) 最佳实践 - 苹果

    推工具包,用于在 kCFStream网络服务类型VoIP 被弃用后在后台接受呼叫 (iOS 10/iOS 9) - pjsip

     类似资料:
    • 我正在使用VOIP应用程序,呼叫通知在和中运行良好,但当我的应用程序处于状态时,我没有收到任何呼叫通知。 DidReceiveIncomingPushWith 截图

    • 我正在试验的Android信标库,我能够使其工作与苹果兼容的信标监测和测距添加自定义解析器(请参阅这是正确的布局,以检测iBeacons与AltBeacon的Android信标库?) 现在我正在尝试使用此处显示的示例代码编写一个在后台启动的应用程序: http://altbeacon.github.io/android-beacon-library/samples.html 这是我的代码: 不幸的

    • 我知道如何在Java中实现它,但我不知道如何在Flutter中实现它。我读过类似的问题,但没有一个提供了一个好的答案。 我知道如何发送和接收FCM通知。我知道如何显示一个正常的通知,当一个FCM消息发送,而应用程序是在后台。

    • 问题内容: 我已经在voip应用程序中实现了呼叫工具包,在该工具包中,我为传入或传出的呼叫生成了呼叫日志(在“电话最近使用”标签上可见)。当我单击通话记录时,它将打开我的应用程序。我已经重写了委托方法来获取处理程序。 但是我无法获得有关呼叫日志的信息。如何在我的应用程序中获取通话记录信息? 任何帮助,不胜感激。谢谢! 问题答案: 我们可以从 userActivity* 获取 电话号码 , *

    • 当应用程序在前台时不接收推送通知,但当应用程序在后台时接收我已遵循来自https://medium . com/@ ankushaggarwal/GCM-setup-for-Android-push-notifications-656 cf DD 8 adbd的FCM教程