在iOS中後臺執行程序

iOS默認是不支持程序的後臺運行的,可是也提供了一些途徑來使得程序能後在切入後臺時也正常工做。git

其中拋開常見的後臺音樂等擦邊球手段,比較正規的就是聲請一個後臺任務,可是任務的執行時間被限制爲10分鐘,而且在10分鐘以後再次聲請也不會成功。github

本文采用的手段就是在聲請10分鐘的任務時間到達時利用一個while(true)將當次runloop掛起等待程序切回時再跳出。app

核心代碼以下oop

聲請後臺任務spa

1 UIApplication *application = [UIApplication sharedApplication];
2     __block UIBackgroundTaskIdentifier background_task;
3     //Create a task object
4     background_task = [application beginBackgroundTaskWithExpirationHandler: ^ {
5         [self hold];
6         [application endBackgroundTask: background_task];
7         background_task = UIBackgroundTaskInvalid;
8     }];

hold住限時任務結束時的runloopcode

1 - (void)hold
2 {
3     _holding = YES;
4     while (_holding) {
5         [NSThread sleepForTimeInterval:1];
6         /** clean the runloop for other source */
7         CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0, TRUE);
8     }
9 }

 

以後做者發現不須要先聲請10分鐘限時後臺任務,直接在程序切出後臺時掛起一個while(true)就能夠達到相同的效果。blog

 實驗證實不申請後臺task程序雖然會執行,可是切出去後返回沒法正常顯示UI。get

源碼參見https://github.com/joexi/BackgroundRunner源碼

相關文章
相關標籤/搜索