ios - 在后台运行 VOIP (PJSIP) 服务

标签 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 的事件。

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

更新

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

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

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

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

后台运行良好,只是苹果拒绝了

2.16

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

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

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

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

请考虑使用 Info.plist 文件的 UIBackgroundModes 键中的“audio”值。当您的应用程序处于后台时,使用音频后台模式将使当前的拨出 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 值可以让系统知道它应该允许应用程序根据需要在后台运行以管理其网络套接字。系统启动后,带有此键的应用程序也会立即在后台重新启动,以确保 VoIP 服务始终可用。

“Tips for Developing a VoIP App.”

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

相关文章:

ios - 恢复购买功能 - Swift

ios - 如何在iOS Phonegap应用中压缩WAV文件

ios - 在 Swift 4 中检查本地文件大小

ios - 在 iOS 中从后台启动 UIViewController

c - 在 Ubuntu 上编译 PJSIP 时出错

ios - 使用 Box2D、cocos2d 和物理编辑器在视网膜显示中的 PTM_RATIO

c# - 在 C# 中监听端口(不是 TCP 端口)

ssl - 如何在 Elastix 上运行 Web-RTC?

iphone - 如何在 iOS 上的 PJSIP 通话中实现静音功能

c - 如何在icedemo中设置stunserver和turnserver?