2014-02-11 165 views
3

我的应用刚刚被Apple拒绝,因为它没有正确实现后台运行,并且它是使用iOS的VOIP应用。在后台运行VOIP(PJSIP)服务

我认为保持它运行奇数码是

[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

我已经看过了苹果直营店,看来这是正确的

​​

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

APPLE:为VoIP使用配置一个应用套接字。

的背景它只是苹果运行正常拒绝它

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.”

+1

我刚刚发现本指南,令人困惑的是配置您的应用套接字,这是一个名为PJSIP的库,它处理所有内容。 – Burf2000

+0

如何设置:为VoIP使用配置一个应用套接字。 | 在转到后台之前,请调用setKeepAliveTimeout:handler:方法来安装要定期执行的处理程序。您的应用可以使用此处理程序来维护其服务连接。 配置您的音频会话以处理转入和转出活动状态。 – Eesha

1

喜,这是帮助我: 的事情是,通常SIP信令采用UDP作为传输协议,但苹果只允许TCP协议持久连接。 所以,这里是步骤:
1)弄清楚,如果你的SIP服务器支持SIP信令与TCP(例如,sip2sip,ekiga不)。在URL

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

4月底, “运输= TCP”)
2)摆脱pjsua UDP连接,插入的地方

app_config.no_udp = PJ_TRUE; 
app_config.no_tcp = PJ_FALSE; 

3)如果您使用外部代理,把添加“; transport = TCP”所有帐户和注册服务器url,即例如: + sip:[email protected]; transport = TCP sip:sip2sip.info; transport = TCP sip2sip.info用户名密码

希望,这有帮助。

+0

你能帮我吗,我不能保持插槽活着10分钟。 (保持活着停止工作,而应用程序处于睡眠模式。) –

+0

你可以更具体地说,我需要将连接作为TCP –

0

苹果非常关心你的应用程序说它做了什么以及它的实际功能。看起来你的应用程序实际上不处理传入的VoIP电话,尽管你在plist中提到它。

您可以

一)从plist中的VoIP设置或

b)增加的功能,来电在您的应用程序

干杯!