应用程序进入后台时如何保留NSTimer?

时间:2012-03-23 14:25:12

标签: ios background scheduling nstimer foreground

我在这里是因为找不到任何解决方案:(

我正在做一个简单的应用程序,我必须将(通过套接字)一些信息发送到服务器(如GPS l / L,精度,电池电量等)。

当应用程序在前台时,当前代码工作正常。

myTimer = [NSTimer scheduledTimerWithTimeInterval: 2.0 target:self
                                                  selector: @selector(sendPosToServer:) userInfo:nil repeats: YES];
myTimer2 = [NSTimer scheduledTimerWithTimeInterval: 3.0 target:self
                                                  selector: @selector(sendBatteryToServer:) userInfo:nil repeats: YES];
myTimer3 = [NSTimer scheduledTimerWithTimeInterval: 5.0 target:self
                                                  selector: @selector(sendResToServer:) userInfo:nil repeats: YES];
myTimer4 = [NSTimer scheduledTimerWithTimeInterval: 5.0 target:self
                                                  selector: @selector(sendQResToServer:) userInfo:nil repeats: YES];
myTimer5 = [NSTimer scheduledTimerWithTimeInterval: 3.0 target:self
                                                   selector: @selector(sendPrecisionToServer:) userInfo:nil repeats: YES];

所有thoses方法都被调用。

但是当应用程序进入后台时,所有计时器都无效...我已经读过iOS会自动停止计时器.. 我正在寻找一种在应用程序处于后台时调用方法和发送数据的方法..

我需要你的帮助:)。

感谢大家!!

3 个答案:

答案 0 :(得分:11)

您需要阅读有关如何在后台运行任务的指南:

Background Execution and Multitasking

这是我的一个应用程序的applicationDidEnterBackground。当我把它放到后台时,它会进行一些磁盘缓存维护:

- (void)applicationDidEnterBackground:(UIApplication *)application {

//As we are going into the background, I want to start a background task to clean up the disk caches
if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) { //Check if our iOS version supports multitasking I.E iOS 4
    if ([[UIDevice currentDevice] isMultitaskingSupported]) { //Check if device supports mulitasking
        UIApplication *application = [UIApplication sharedApplication]; //Get the shared application instance

        __block UIBackgroundTaskIdentifier background_task; //Create a task object

        background_task = [application beginBackgroundTaskWithExpirationHandler: ^{
            [application endBackgroundTask:background_task]; //Tell the system that we are done with the tasks
            background_task = UIBackgroundTaskInvalid; //Set the task to be invalid
            //System will be shutting down the app at any point in time now
        }];

        //Background tasks require you to use asyncrous tasks
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            //Perform your tasks that your application requires                

            //I do what i need to do here.... synchronously...                

            [application endBackgroundTask: background_task]; //End the task so the system knows that you are done with what you need to perform
            background_task = UIBackgroundTaskInvalid; //Invalidate the background_task
        });
    }
}

}

答案 1 :(得分:5)

来自Apple文档:

  

实现长时间运行的后台任务适用于需要更多任务的任务   要执行的执行时间,您必须请求特定的权限   在后台运行它们而不会被暂停。仅在iOS中   允许特定的应用类型在后台运行:

     
      
  • 在后台播放用户可听内容的应用,例如音乐播放器应用
  •   
  • 随时向用户通知其位置信息的应用,例如导航应用
  •   
  • 支持互联网协议语音(VoIP)的应用
  •   
  • 需要下载和处理新内容的报亭应用
  •   
  • 从外部附件接收定期更新的应用
  •   

除非您的应用属于其中一个类别(听起来并非如此),否则它无法在后台运行。

答案 2 :(得分:4)

iOS App Programming Guide列出了允许您的应用在后台保持活动状态的活动。如果您计划通过应用商店分发应用,则您的应用必须执行列出的活动之一。如果你只是为自己写一些东西,你可以在一个允许的活动上搭载你的功能。