使用以下代码,我可以运行我的后台应用程序大约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,任何黑客都可以。谢谢大家。
答案 0 :(得分:1)
除非您启用了“后台应用刷新”功能,否则您无法在后台运行它。在您设备的设置中。 beginBackgroundTaskWithExpirationHandler
用于清理目的:
此方法可让您的应用继续运行一段时间 它过渡到背景。您有时应该调用此方法 离开任务未完成的地方可能对您的应用程序有害 用户体验。例如,您的应用可以调用此方法 确保有足够的时间将重要文件传输到远程 服务器或至少尝试进行转移并记录任何错误。 您不应该仅仅使用此方法来保持您的应用程序运行 它移动到后台。
答案 1 :(得分:1)
我解决此问题的方法是遵循this tutorial.
的更新部分