当应用程序转到后台时重置backgroundTimeRemaining

时间:2015-03-02 10:53:39

标签: ios

使用以下代码,我可以运行我的后台应用程序大约180秒。我的最终目标是让它永远运行。电池/处理器过度使用对我来说不是一个问题,因为我正在为自己制作这个。

这是我用来在后台运行我的应用程序的代码。

UIApplication * application = [UIApplication sharedApplication];

if([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)])
{
    NSLog(@"Multitasking Supported");

    __block UIBackgroundTaskIdentifier background_task;
    background_task = [application beginBackgroundTaskWithExpirationHandler:^ {

        //Clean up code. Tell the system that we are done.
        [application endBackgroundTask: background_task];
        background_task = UIBackgroundTaskInvalid;
    }];

    //To make the code block asynchronous
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        //### background task starts
        NSLog(@"Running in the background\n");
        while(TRUE)
        {
            NSLog(@"Background time Remaining: %f",[[UIApplication sharedApplication] backgroundTimeRemaining]);
            [NSThread sleepForTimeInterval:1]; //wait for 1 sec
        }
        //#### background task ends

        //Clean up code. Tell the system that we are done.
        [application endBackgroundTask: background_task];
        background_task = UIBackgroundTaskInvalid; 
    });
}
else
{
    NSLog(@"Multitasking Not Supported");
}

Background time remaining:从大约180秒开始,当它降到5时,应用程序将被暂停。无论我尝试什么,都无法避免。

我的设备运行的是iOS 8.1,这是我到目前为止尝试过的方法:

方法1:

我将背景模式设置为info.plist中的位置,并使用以下代码,如this tutorial所示。

CLLocationManager * manager = [CLLocationManager new]; __block UIBackgroundTaskIdentifier background_task;

然后

[manager startUpdatingLocation];

方法2:

在应用进入后台状态之前使用以下代码行。

CLLocationManager* locationManager = [[CLLocationManager alloc] init]; [locationManager startUpdatingLocation];

我只需要重置backgroundTimeRemaining,任何黑客都可以。谢谢大家。

2 个答案:

答案 0 :(得分:1)

除非您启用了“后台应用刷新”功能,否则您无法在后台运行它。在您设备的设置中。 beginBackgroundTaskWithExpirationHandler用于清理目的:

  

此方法可让您的应用继续运行一段时间   它过渡到背景。您有时应该调用此方法   离开任务未完成的地方可能对您的应用程序有害   用户体验。例如,您的应用可以调用此方法   确保有足够的时间将重要文件传输到远程   服务器或至少尝试进行转移并记录任何错误。   您不应该仅仅使用此方法来保持您的应用程序运行   它移动到后台。

答案 1 :(得分:1)

我解决此问题的方法是遵循this tutorial.

的更新部分