【问题标题】:SIP app with Background Mode and Incoming Call notification具有后台模式和来电通知的 SIP 应用程序
【发布时间】:2014-04-23 13:39:31
【问题描述】:

我正在开发一个 SIP 呼叫应用程序。我使用了实现开源pjsip librarysiphon app project。我能够在前台模式下成功地为设备和模拟器运行应用程序。

为了在 VOIP 的后台模式下运行应用程序,我关注了这个RayWenderlich Tutorial。 根据Apple Documentation,我们必须遵循以下 4 个步骤:

  1. 在 Xcode 项目的 Capabilities 选项卡的 Background mode 部分启用对 IP 语音的支持。 (您还可以通过在应用的 Info.plist 文件中包含带有 voip 值的 UIBackgroundModes 键来启用此支持。)
  2. 配置应用的一个套接字以供 VoIP 使用。
  3. 在移动到后台之前,调用-setKeepAliveTimeout:handler: 方法来安装一个要定期执行的处理程序。您的应用可以使用此处理程序来维持其服务连接。
  4. 配置您的音频会话以处理与活动使用之间的转换。

我已经实现了这第一步:

但我不知道如何实施接下来的三个步骤以在后台模式下接收 SIP 呼叫。了解了这三个步骤背后的逻辑,但没有找到任何实现的源代码。

以前有人做过这个吗?

【问题讨论】:

    标签: ios objective-c sip voip


    【解决方案1】:

    这里我也使用了虹吸项目的 keepAlive 示例。 如果你修改这个项目,你可以在- (void)processCallState:(NSNotification *)notification回调中做所有你想做的事情。

    - (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("ipjsua", thread_desc, &thread);
        }
        pjsua_acc_set_registration(0, PJ_TRUE);
        NSLog(@"Keep Alive");
    }
    
    - (void)applicationDidEnterBackground:(UIApplication *)application
    {
        /* Send keep alive manually at the beginning of background */
        [self performSelectorOnMainThread:@selector(keepAlive) withObject:nil waitUntilDone:YES];
    
        /* iOS requires that the minimum keep alive interval is 600s */
        [application setKeepAliveTimeout:600 handler: ^{
            [self performSelectorOnMainThread:@selector(keepAlive)
                                   withObject:nil waitUntilDone:YES];
        }];
    }
    

    不要忘记将虹吸设置中的 keepAlive 间隔设置为 600。

    【讨论】:

    • setKeepAliveTimeout 已弃用,适用于 Xcode 7.3,如果应用程序是针对 iOS9 SDK 编译的。如果您在最新的 Xcode(目前为 8.3.3)上编译应用程序,它将无法正常工作。我尝试在 Xcode 7.3(针对 iOS9 SDK)上使用 setKeepAliveTimeout 创建框架,并在 Xcode 8.3(iOS10 SDK)上的应用程序中使用它 - 它也没有用。
    【解决方案2】:

    第 2 步和第 4 步已在 pjsip 本身中为您完成,因此您无需执行任何操作。

    第 3 步是您唯一需要实施的步骤。第 3 步是必需的,因为在后台模式下,不会触发任何 IOS 计时器,因此不会发生 sip 重新注册。所以你需要设置 ios “特殊”后台计时器来回调 pjsip 说请注册 sip ragistar。因此,您将保持活动超时设置为小于重新注册时间的时间。

    步骤 3 的示例可以在 pjsip 示例 pjsua 应用程序中找到,您也应该能够在 siphon 应用程序中找到它。

    因此,通常您在 applicationDidEnterBackground 回调中为您的应用委托类添加支持。请参阅 pjsua 获取 example

    确保您使用的是 tcp 连接,因为 udp 在后台不起作用。

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2017-12-06
      • 2022-01-26
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多