我的应用程序刚刚被苹果拒绝,因为它没有正确实现后台运行,它是一个使用 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 保持事件状态。

我应该如何正确地做到这一点?

更新

我看过苹果指南,看来这是正确的
[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,所以我不知道为什么会被拒绝

最佳答案

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

实现 VoIP 应用程序

互联网协议(protocol)语音 (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 值让系统知道它应该允许应用程序根据需要在后台运行以管理其网络套接字。系统启动后,带有此 key 的应用程序也会立即在后台重新启动,以确保 VoIP 服务始终可用。

“Tips for Developing a VoIP App.”

关于ios - 在后台运行 VOIP (PJSIP) 服务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21703522/

10-12 23:54