在后台运行VOIP(PJSIP)服务

时间:2014-02-11 13:41:42

标签: ios voip pjsip

我的应用程序刚被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键中的“audio”值。使用音频后台模式可以在应用程序处于后台时保持当前正在进行的VoIP呼叫打开。

添加VoIP功能或从UIBackgroundModes键中删除“VoIP”设置是适当的。对于离散的代码级问题,您可以咨询Apple Developer Technical Support。请务必:

更新2

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

3 个答案:

答案 0 :(得分: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.”

答案 1 :(得分:1)

是的,他帮助了我: 问题是,通常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)如果您使用出站代理,请输入&#34 ;; transport = TCP"在网址的末尾

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

4)添加&#34 ;; transport = TCP"所有帐户和注册服务器URL,例如: + a sip:username@sip2sip.info; transport = TCP sip:sip2sip.info; transport = TCP sip2sip.info username password

希望,这有帮助。

答案 2 :(得分:0)

Apple非常关注您的应用所说的内容及其实际功能。看起来您的应用程序实际上并不处理传入的VoIP呼叫,尽管您在plist中提到它。

你可以

a)从plist OR

中删除VoIP设置

b)将功能添加到应用中的来电

干杯!!!