AppDelegate

一、基础知识

  1) main.m指定了程序的入口点

UIApplicationMain(argc, argv,nil,NSStringFromClass([StartingPointAppDelegateclass]));

  2) AppDelegate的入口点

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {}

  3) 前台和后台程序切换执行方法

- (void)applicationWillEnterForeground:(UIApplication *)application {}
程序将置于前台,程序启动的时候不会相应此方法,而是按下home以后再次回复程序的时候响应。
- (void)applicationDidBecomeActive:(UIApplication *)application {} 程序已经置于前台,程序刚启动也会响应此方法。按下home以后再次回来也会响应。
- (void)applicationWillResignActive:(UIApplication *)application {} 程序将要退出后台,按下home以后,程序不会立即消失,系统会先调用此方法。
- (void)applicationDidEnterBackground:(UIApplication *)application {} 程序已经置于后台了,按home以后,程序完全消失会调用。

二、程序后台运行

  1)在没有使用GCD时,当app被按home键退出后,app仅有最多5秒钟的时候做一些保存或清理资源的工作。但是在使用GCD后,app最多有10分钟的时间在后台长久运行。这个时间可以用来做清理本地缓存,发送统计数据等工作。

  注意:
      当多程序切换的时候,程序不会被关闭,在系统规定的一段时间内可以正常执行。
      当一个程序使用的内存太大,而导致系统内存不足的时候,程序会被关闭,任务会终止,直到下次启动程序,并退到后台的时候,后台任务才会重新执行。
      运行的条件必须在软件不被关闭的情况下可用。

// AppDelegate.h
 @property (assign, nonatomic) UIBackgroundTaskIdentifier* backgroundTaskIdentifier;

// AppDelegate.m

- (void)applicationDidEnterBackground:(UIApplication *)application {
    [self beingBackgroundUpdateTask];
    NSLog(@"加上你需要多久运行的代码"); 
    NSLog(@"剩余执行时间: %f", [[UIApplication sharedApplication] backgroundTimeRemaining]);
    [self endBackgroundUpdateTask];
}


-(void) beingBackgroundUpdateTask {
    self.backgroundTaskIdentifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundUpdateTask];
    }];
}

-(void) endBackgroundUpdateTask {
    [[UIApplication sharedApplication] endBackgroundTask: self.backgroundTaskIdentifier];
    self.backgroundTaskIdentifier = UIBackgroundTaskInvalid;

}

  2) 每隔一段时间,系统自动执行的任务(设置的值必须大于等于600)

    注意:
       当多程序切换的时候,此任务也会被关闭。
         运行的条件必须在软件不被关闭的情况下可用

    执行的必要条件:
        找到程序的 plist 配置文件,增加:
        键:UIBackgroundModes 类型:Array
        在 Item0 里面设置类型:String,值:voip

[[UIApplication sharedApplication] setKeepAliveTimeout:600 handler:^{
        //执行你想要执行的任务,同时可以配合第一种任务,以增加某些同步方法的执行时间,比如说下载数据等
    }];

 

 

原文地址:https://www.cnblogs.com/eileenleung/p/3505413.html