在后台运行 VOIP (PJSIP) 服务

Posted

技术标签:

【中文标题】在后台运行 VOIP (PJSIP) 服务【英文标题】:Running a VOIP (PJSIP) service in the background 【发布时间】:2014-02-11 13:41:42 【问题描述】:

我的应用刚刚被 Apple 拒绝,因为它没有正确实现后台运行,而且它是使用 ios 的 VOIP 应用。

我保持运行的奇怪代码是

[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");
    ];

但是我不确定如何配置 PJSIP TCP 端口在后台运行。

APPLE:配置应用程序的一个套接字以供 VoIP 使用。

后台运行良好,只是 Apple 拒绝了它

2.16

我们发现您的应用使用后台模式,但不包含需要该模式持续运行的功能。此行为不符合 App Store 审核指南。

我们注意到您的应用在 Info.plist 的 UIBackgroundModes 键中声明支持 VoIP,但不支持来自连接的 VoIP 服务的来电。

如果您的应用程序不支持来自其连接的 VoIP 服务的来电,则 voip 后台模式不合适。如 iOS 编程指南中所述,此键适用于需要监视套接字以获取传入呼叫的​​应用程序:

“系统不会让 VoIP 应用程序一直处于唤醒状态,而是允许它们暂停并为它们提供监控其套接字的设施。当检测到传入流量时,系统会唤醒 VoIP 应用程序并返回对其套接字的控制权给它。”

请考虑在 Info.plist 文件的 UIBackgroundModes 键中使用“音频”值。使用音频后台模式将在您的应用处于后台时保持当前拨出的 VoIP 呼叫保持打开状态。

添加 VoIP 功能或从 UIBackgroundModes 键中删除“VoIP”设置是合适的。对于离散的代码级问题,您可能希望咨询 Apple 开发人员技术支持。请务必:

更新 2

PJSIP 告诉我套接字标记为 VOIP,所以我不知道为什么会被拒绝

【问题讨论】:

【参考方案1】:

您应该检查“声明您的应用支持的后台任务”中的部分。在链接iOS App Programming Guide

实施 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.

在 UIBackgroundModes 键中包含 voip 值可以让系统知道它应该允许应用根据需要在后台运行以管理其网络套接字。具有此密钥的应用程序也会在系统启动后立即在后台重新启动,以确保 VoIP 服务始终可用。

“Tips for Developing a VoIP App.”

【讨论】:

我刚刚找到了这个指南,令人困惑的是配置你的应用程序套接字,这是一个名为 PJSIP 的库,它可以处理所有事情 如何设置:配置应用程序的一个套接字以供 VoIP 使用。?? |在移动到后台之前,调用 setKeepAliveTimeout:handler: 方法来安装一个要定期执行的处理程序。您的应用可以使用此处理程序来维护其服务连接。配置您的音频会话以处理与活动使用之间的转换。【参考方案2】:

嘿,这对我有帮助: 问题是,通常 SIP 信令使用 UDP 作为传输协议,但 Apple 只允许使用 TCP 协议进行持久连接。 所以,这里是步骤: 1) 弄清楚您的 SIP 服务器是否支持使用 TCP 的 SIP 信令(例如,sip2sip 支持,ekiga 不支持)。 2)摆脱pjsua中的UDP连接,插入某处

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,例如: +a sip:username@sip2sip.info;transport=TCP sip:sip2sip.info;transport=TCP sip2sip.info 用户名密码

希望,这会有所帮助。

【讨论】:

你能帮帮我吗,我无法让套接字保持 10 分钟。 (当应用程序处于睡眠模式时,保持活动停止工作。) 您能否更具体地说明我需要在哪里建立 TCP 连接【参考方案3】:

Apple 非常关心您的应用程序所说的功能和实际功能。尽管您在 plist 中提到它,但您的应用程序似乎实际上并没有处理传入的 VoIP 呼叫。

你可以

a) 从 plist 中删除 VoIP 设置或

b) 为您的应用中的来电添加功能

干杯!!!

【讨论】:

以上是关于在后台运行 VOIP (PJSIP) 服务的主要内容,如果未能解决你的问题,请参考以下文章

ios 使用音频/voip 模式在后台永远运行应用程序

即使应用程序未在后台运行,VoIP 推送通知也会自动打开应用程序,这在 iOS 中是不是可行?

即使应用程序未在后台运行,也可以自动打开应用程序的VoIP推送通知是否可以在iOS中使用?

iOS 13 在后台没有收到 VoIP 推送通知

在 iOS 13 设备中无法在后台/挂起状态下接收 VoIP 消息

快速修复 Appestore 解决 XMPP iOS VoIP 后台执行拒绝