在XXAppDelegate中增加:UIBackgroundTaskIdentifier bgTask;
- (void)applicationDidEnterBackground:(UIApplication *)application
{
bgTask = [applicationbeginBackgroundTaskWithExpirationHandler:^{
// 10分钟后执行这里,应该进行一些清理工作,如断开和服务器的连接等
// ...
//stopped or ending the task outright.
[application endBackgroundTask:bgTask];
bgTask =UIBackgroundTaskInvalid;
}];
if (bgTask ==UIBackgroundTaskInvalid) {
NSLog(@"failedto start background task!");
}
// Start the long-runningtask 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 = [applicationbackgroundTimeRemaining];
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.
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;
}
});
});
}
- (void)applicationWillEnterForeground:(UIApplication *)application
{
// 如果没到10分钟又打开了app,结束后台任务
if (bgTask!=UIBackgroundTaskInvalid) {
[applicationendBackgroundTask:bgTask];
bgTask =UIBackgroundTaskInvalid;
}
}
后台时,如果某些代码你不希望执行,可以加以下条件:
UIApplication *application = [UIApplicationsharedApplication];
if( application.applicationState==UIApplicationStateBackground) {
return;
}
有的app虽然我们不允许通知,但还是会弹出消息,应该是设置了定时器,到某一时间就让程序后台运行一会,从服务器更新数据,然后显示出来。