在后台运行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活着。

我该怎么做呢?

UPDATE

我看过Apple指南,看来这是正确的

 [application setKeepAliveTimeout:KEEP_ALIVE_INTERVAL handler: ^{ [self performSelectorOnMainThread:@selector(keepAlive) withObject:nil waitUntilDone:YES]; NSLog(@"Fire"); }]; 

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

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

在背景中运行良好,只是苹果拒绝它

2.16

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

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

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

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

请查看使用Info.plist文件的UIBackgroundModes键中的“audio”值。 使用音频后台模式可以在应用程序处于后台时保持当前正在进行的VoIP呼叫打开。

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

更新2

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

您应该查看“声明应用程序支持的后台任务”部分。 在链接iOS应用程序编程指南中

实施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服务始终可用。

“开发VoIP应用程序的提示。”

嘿,这对我有所帮助:事实是,通常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)如果您使用出站代理,请在URL的末尾加上“; transport = TCP”

 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 username password

希望,这有帮助。

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

你也可以

a)从plist OR中删除VoIP设置

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

干杯!!!