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