バックグラウンドで継続して処理を実行する

フォアグランドでダウンロードなどの処理をおこなっている最中に、バックグラウンドに回ってしまうと、通常は処理が中断してしまう。中断しないようにするにはどうすればいいか?

10分程度、処理の継続を許可してもらうような趣旨の実装。

@implementation ViewController
{
    UIBackgroundTaskIdentifier bgid;
}

/*********************************************************
 ロード後
 *********************************************************/
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    /*--------------------------------------------
     AppDelegeteに通知されるイベントを、
     このオブジェクトでも通知を受信するように追加する
     ダウンロード中にバッググラウンドに移行すると処理が止まってしまう。
     これを防ぐ為にバッグに移行したとき、バッグから復帰した時の処理を追加する
     *--------------------------------------------*/
    [NSNotificationCenter.defaultCenter addObserver:self
                                           selector:@selector(willResignActive:)
                                               name:UIApplicationWillResignActiveNotification
                                             object:nil];
    
    [NSNotificationCenter.defaultCenter addObserver:self
                                           selector:@selector(didBecomeActive:)
                                               name:UIApplicationDidBecomeActiveNotification
                                             object:nil];
   
     
}

/*********************************************************
 アプリケーションがフォアグランドからバッググラウンドになる直前
 *********************************************************/
- (void)willResignActive:(NSNotification *)notification
{
    NSLog(@"resign");
    
    UIApplication *app = UIApplication.sharedApplication;
    
    bgid = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgid];
        bgid = UIBackgroundTaskInvalid;
    }];
}

/*********************************************************
 アプリケーションがバッググラウンドからフォアグランドに復帰した直後
 *********************************************************/
- (void)didBecomeActive:(NSNotification *)notification
{
    NSLog(@"become");
    
    [UIApplication.sharedApplication endBackgroundTask:bgid];
}

willResignActive、didBecomeActive の処理を、AppDelegate.m上で実装すれば、全てのView上の処理が、バックグランドに回っても中断されないようになるのかなぁ...?

 

参考

[Objective-C] バックグラウンドで継続して処理を実行する - Qiita