在XXAppDelegate中增加:UIBackgroundTaskIdentifierbgTask;
-(void)applicationDidEnterBackground:(UIApplication*)application
{
bgTask= [application beginBackgroundTaskWithExpirationHandler:^{
//10分钟后执行这里,应该进行一些清理工作,如断开和服务器的连接等
//...
//stopped or ending the task outright.
[applicationendBackgroundTask:bgTask];
bgTask= UIBackgroundTaskInvalid;
}];
if(bgTask== UIBackgroundTaskInvalid){
NSLog(@"failedto start background task!");
}
//Start the long-running task and return immediately.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{
//Do the work associated with the task, preferably in chunks.
NSTimeIntervaltimeRemain = 0;
do{
[NSThreadsleepForTimeInterval:5];
if(bgTask!=UIBackgroundTaskInvalid){
timeRemain= [application backgroundTimeRemaining];
NSLog(@"Timeremaining: %f",timeRemain);
}
}while(bgTask!=UIBackgroundTaskInvalid&& timeRemain > 0);//如果改为timeRemain> 5*60,表示后台运行5分钟
//done!
//如果没到10分钟,也可以主动关闭后台任务,但这需要在主线程中执行,否则会出错
dispatch_async(dispatch_get_main_queue(),^{
if(bgTask!= UIBackgroundTaskInvalid)
{
//和上面10分钟后执行的代码一样
//...
//if you don't call endBackgroundTask, the OS will exit your app.
[applicationendBackgroundTask:bgTask];
bgTask= UIBackgroundTaskInvalid;
}
});
});
}
-(void)applicationWillEnterForeground:(UIApplication*)application
{
//如果没到10分钟又打开了app,结束后台任务
if(bgTask!=UIBackgroundTaskInvalid){
[applicationendBackgroundTask:bgTask];
bgTask= UIBackgroundTaskInvalid;
}
}
后台时,如果某些代码你不希望执行,可以加以下条件:
UIApplication*application = [UIApplicationsharedApplication];
if(application.applicationState== UIApplicationStateBackground){
return;
}
本文详细介绍了如何在iOS应用的AppDelegate中实现后台定时任务管理,包括如何开始、停止、检查和处理后台任务,确保应用在后台运行时能够执行必要的清理工作并避免资源浪费。
1372

被折叠的 条评论
为什么被折叠?



