iOS向后台申请一段时间

时间:2021-09-06 15:55:03

今天在整理项目的时候看到这样一个问题:如何在app进入后台处理事件.也就是说,如何在app按home退出前台后向系统申请一段时间.点击home退出app会经历以下阶段:

(1) Active->Inactive 调用 applicationWillResignActive: 方法,app从前台活动状态进入非运行状态

(2) Inactive->Background 应用从非活动状态进入后台状态

(3) Background->Suspended 调用 applicationDidEnterBackground: 方法,app从后台状态进入挂起状态

(4) Suspended->Not running 调用 applicationWillTerminate: 方法,app被系统终止

在应用未进入挂起状态前,都可以进行后台时间的申请,调用方法可以像我这样在AppDelegate中写:

 1 @interface AppDelegate ()
2 {
3 UIBackgroundTaskIdentifier _backgroundTaskIdentifier;
4 }
5 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
6 _backgroundTaskIdentifier = UIBackgroundTaskInvalid;
7 return YES;
8 }
9 - (void)applicationWillResignActive:(UIApplication *)application {
10 if (_backgroundTaskIdentifier == UIBackgroundTaskInvalid)
11 {
12 _backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^(void)
13 {
14 dispatch_async(dispatch_get_main_queue(), ^
15 {
16 [application endBackgroundTask:_backgroundTaskIdentifier];
17 _backgroundTaskIdentifier = UIBackgroundTaskInvalid;20 });
21 }];
22 }
23 }

当然,可以在后台任务完成后主动结束后台运行来节省系统资源与减少耗电量

在完成后台任务后可以调用下面的方法提前结束后台运行:

1 if (_backgroundTaskIdentifier != UIBackgroundTaskInvalid)
2 {
3 [[UIApplication sharedApplication] endBackgroundTask:_backgroundTaskIdentifier];
4 _backgroundTaskIdentifier = UIBackgroundTaskInvalid;
5 }