NStimer 後臺掛起

weixin_33935777發表於2018-04-30

iOS為了讓裝置儘量省電,減少不必要的開銷,保持系統流暢,因而對後臺機制採用墓碑式的“假後臺”。除了系統官方極少數程式可以真後臺,一般開發者開發出來的應用程式後臺受到以下限制:

1.使用者按Home之後,App轉入後臺進行執行,此時擁有180s後臺時間(iOS7)或者600s(iOS6)執行時間可以處理後臺操作

2.當180S或者600S時間過去之後,可以告知系統未完成任務,需要申請繼續完成,系統批准申請之後,可以繼續執行,但總時間不會超過10分鐘。

3.當10分鐘時間到之後,無論怎麼向系統申請繼續後臺,系統會強制掛起App,掛起所有後臺操作、執行緒,直到使用者再次點選App之後才會繼續執行。

專案中我們需要定時器在後臺持續執行一段時間,以保證我們的app正確執行,我們需要如下步驟

步驟一:

將plist檔案中加入Required background modes 

App registers for location updates 


5542265-0146b368ef24639a.png

步驟二:

- (void)applicationDidEnterBackground:(UIApplication *)application {

    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.

    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.


    UIApplication*  app = [UIApplication sharedApplication];

    __block    UIBackgroundTaskIdentifier bgTask;

    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{

        dispatch_async(dispatch_get_main_queue(), ^{

            if (bgTask != UIBackgroundTaskInvalid)

            {

                bgTask = UIBackgroundTaskInvalid;

            }

        });

    }];

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        dispatch_async(dispatch_get_main_queue(), ^{

            if (bgTask != UIBackgroundTaskInvalid)

            {

                bgTask = UIBackgroundTaskInvalid;

            }

        });

    });

}

相關文章