在iOS中处理后台任务的正确方法是什么?

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

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

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

//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); } }); 

情况:

我使用第三方库处理与我们的web服务的通信。 该服务是一个CommuniGate专业服务器。 我通过库接收在线状态更新(在线/离线)和来自联系人的即时消息。 该库是CommuniGate的ximss库,它是一个与xmpp类似的协议,用于基于xml的sip请求,以及IM和状态。 当用户login到应用程序,他看到他的联系人(CmmuniGate朋友列表),他可以select呼叫一个。 当一个ximssvalidation信息被发送后,另一方接受了这个呼叫,它就会logging这个呼叫的开始时间并开始一个facetime呼叫。

问题:

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

为了正确处理这两种情况,我需要做些什么? 我甚至不明白为什么会有差异。

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

一旦你设置了voip plist条目,iOS就会尽可能的保持你的应用程序的活跃状态,如果它终止的话,重新启动它。 从实施VoIP应用程序 :

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

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

另请参阅开发VoIP应用程序的技巧 :

实施VoIP应用有几个要求:

  1. 将UIBackgroundModes键添加到您应用程序的Info.plist文件中。 将此密钥的值设置为包含voipstring的数组。

  2. 为VoIP使用configuration一个应用套接字。

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

  4. configuration您的audio会话以处理转入和转出活动使用。

  5. 为确保在iPhone上获得更好的用户体验,请使用核心电话框架来调整与基于蜂窝电话呼叫相关的行为; 请参阅核心电话框架参考。

  6. 为了确保VoIP应用程序的良好性能,请使用“系统configuration”框架来检测networking更改,并尽可能让您的应用程序进入睡眠状态。

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

Interesting Posts