1

我有一个 voip 应用程序,它需要在后台运行。据我了解,这些是我需要做的事情:

  1. 将应用程序标记为 voip。
  2. 将“应用程序不在后台运行”标志设置为 NO。
  3. 设置一个过期处理程序,一段代码可以延长您获得的标准 10 分钟执行时间。
  4. 更多的?

我在 info.plist 文件中设置了两个标志,我得到了 10 分钟。我尝试了这篇文章中的建议。这是我的代码:

//in didFinishLaunchingWithOptions:
expirationHandler = ^{
    NSLog(@"ending background task");
    [[UIApplication sharedApplication] endBackgroundTask:bgTask];

    NSLog(@"restarting background task");
    bgTask = UIBackgroundTaskInvalid;
    bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:expirationHandler];

    NSLog(@"finished running background task");
};

//in applicationDidEnterBackground
NSLog(@"entering background mode");
bgTask = UIBackgroundTaskInvalid;
bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:expirationHandler];

// Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    // inform others to stop tasks, if you like
    [[NSNotificationCenter defaultCenter] postNotificationName:@"MyApplicationEntersBackground" object:self];

    //this while loop is just here for testing
    inBackground = true;
    while (inBackground) {
        NSLog(@"stayin alive!!"); //this keeps going forever
        sleep(10);
    }
});

情况:

我使用第三方库来处理与我们的网络服务的通信。该服务是 CommuniGate 专业服务器。我通过库接收来自联系人的状态更新(在线/离线)和即时消息。该库是 CommuniGate 的 ximss 库,他们制作的协议类似于 xmpp,用于基于 xml 的 sip 请求,以及 IM 和在线状态。当用户登录到应用程序时,他会看到他的联系人(CmmuniGate 好友列表)并且他可以选择呼叫其中一个。在发送了 xmss 验证消息并且对方接受了呼叫后,它会记录呼叫的开始时间并启动 facetime 呼叫。

问题:

当应用程序通过按主页按钮进入后台时,我开始在日志中看到“保持活动状态”消息,并且每隔十分钟我就会看到它重新启动后台任务。
当应用程序通过按下电源按钮进入后台时,“保持活跃”消息开始显示十分钟,之后它重新启动后台任务并开始每隔 50-100 毫秒重新启动一次。
我现在可以接受这个,即使它会消耗电池,因为我有时间进行更新,而且我们的用户不拥有 ipad,我们拥有。我现在的问题是 ximss 库失去了它的连接(它是基于会话的)。我可以在库中重新启动会话,但这意味着需要大量数据传输来获取联系人列表,并且一些用户使用 3g。
我无法编辑库的源代码,也看不到它,所以我不知道它是否以正确的方式创建了套接字。

我该怎么做才能正确处理这两种情况?我什至不明白为什么会有差异。

4

1 回答 1

-1

你不能像这样重新扩展后台任务;您的应用程序可能会被终止。如果这有效,那是因为您voip启用了后台模式,而不是因为您正在重新启动后台任务。

一旦您设置了voipplist 条目,iOS 将尝试让您的应用程序尽可能长时间地保持活动状态,并在它终止时重新启动它。从实施 VoIP 应用程序

在 UIBackgroundModes 键中包含 voip 值可以让系统知道它应该允许应用程序根据需要在后台运行以管理其网络套接字。具有此密钥的应用程序也会在系统启动后立即在后台重新启动,以确保 VoIP 服务始终可用。

除了设置此键之外,如果您需要定期运行代码以保持您的 voip 连接处于活动状态,您可以使用setKeepAliveTimeout:handler:方法 on UIApplication

另请参阅开发 VoIP 应用程序的提示

实施 VoIP 应用程序有几个要求:

  1. 将 UIBackgroundModes 键添加到应用的 Info.plist 文件中。将此键的值设置为包含 voip 字符串的数组。

  2. 为 VoIP 使用配置应用程序的其中一个套接字。

  3. 在移动到后台之前,调用 setKeepAliveTimeout:handler: 方法来安装一个要定期执行的处理程序。您的应用可以使用此处理程序来维护其服务连接。

  4. 配置您的音频会话以处理与活动使用之间的转换。

  5. 为确保在 iPhone 上获得更好的用户体验,请使用 Core Telephony 框架来调整您与手机通话相关的行为;请参阅核心电话框架参考。

  6. 为确保您的 VoIP 应用程序具有良好的性能,请使用系统配置框架来检测网络变化并让您的应用程序尽可能地休眠。

您需要的几乎所有文档都在 Apple 开发者网站上。

于 2013-08-15T07:23:34.660 回答