首先感謝你與AirFlow RAOP的驚人的作品是相當困難的事情!
所以你可以做的是
1.創建一個後臺任務處理爲dispatch_block_t,讓我們說
dispatch_block_t myDummyBackgroundTaskBlock = {
[[UIApplication sharedApplication] endBackgroundTask:myDummyBackgroundTask];
myDummyBackgroundTask = UIBackgroundTaskInvalid;
myDummyBackgroundTask = [app beginBackgroundTaskWithExpirationHandler:myDummyBackgroundTask];
};
2.定義這個地方後臺和前臺任務的處理程序
// foreground
-(void)handleTasksForApplicationInForeground {
if(myDummyBackgroundTask) { // reset that task
[[UIApplication sharedApplication] endBackgroundTask: myDummyBackgroundTask];
myDummyBackgroundTask = UIBackgroundTaskInvalid;
}
}
// background
-(void) handleTasksForApplicationInBackground {
UIDevice *device = [UIDevice currentDevice];
BOOL backgroundSupported = NO;
if ([device respondsToSelector:@selector(isMultitaskingSupported)])
backgroundSupported = device.multitaskingSupported;
if(backgroundSupported && backgroundEnabled) { // perform a background task
myDummyBackgroundTaskBlock = ^{
[[UIApplication sharedApplication] endBackgroundTask: myDummyBackgroundTaskBlock];
myDummyBackgroundTaskBlock = UIBackgroundTaskInvalid;
};
SEL sel = @selector(doDummyBackgroundTask);
[self doBackgroundTaskAsync:sel];
[self performSelector:@selector(doBackgroundTaskAsync:) withObject:nil afterDelay:500.0f]; /// LP: this is the funny part since iOS will kill the task after 500 sec.
}
}
3.現在讓我們來看看h andle在應用程序委託的背景模式(定義之前,你可以在應用的.plist激活與不同選項的背景模式):
-(void)applicationDidEnterBackground:(UIApplication *)application {
[self handleTasksForApplicationInBackground];
}
-(void)applicationWillEnterForeground:(UIApplication *)application {
[self handleTasksForApplicationInForeground];
}
4。讓我們來看看背景的異步任務選擇做什麼
-(void) doBackgroundTaskAsync:(SEL)selector {
@try {
if([[UIApplication sharedApplication] backgroundTimeRemaining] < 5) {
return;
}
if(!myDummyBackgroundTaskBlock) { // need to create again on-the-fly
myDummyBackgroundTaskBlock = ^{
[[UIApplication sharedApplication] endBackgroundTask:myDummyBackgroundTask];
myDummyBackgroundTask = UIBackgroundTaskInvalid;
};
}
myDummyBackgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:myDummyBackgroundTaskBlock];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
while ([[UIApplication sharedApplication] backgroundTimeRemaining] > 5.0) {
int delta = 5.0;
[self performSelector: selector ];
sleep(delta);
}
});
}
@catch (...) {
}
}
我知道,這個解決方案的工作很好,但我知道,有時它發生,iOS將反正殺應用程序的後臺任務。無論如何,如果用戶突然在前臺和後臺之間切換應用程序,它將無限期地工作。
非常感謝!我將用即將發佈的版本對此進行測試。謝謝! – Trenskow 2013-04-20 10:36:49
從iOS7起,背景活動從600秒縮短。 (5分鐘)至180秒。 (3分鐘),所以調用doBackgroundTaskAsync(延遲*)的選擇器必須在大於等於180.0f後被調用 – loretoparisi 2014-09-28 22:48:17