我有一个 voip 应用程序,它需要在后台运行。据我了解,这些是我需要做的事情:
- 将应用程序标记为 voip。
- 将“应用程序不在后台运行”标志设置为 NO。
- 设置一个过期处理程序,一段代码可以延长您获得的标准 10 分钟执行时间。
- 更多的?
我在 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。
我无法编辑库的源代码,也看不到它,所以我不知道它是否以正确的方式创建了套接字。
我该怎么做才能正确处理这两种情况?我什至不明白为什么会有差异。