iOS 如何讓一個程序在后臺運行不被掛起,不死掉
轉載http://blog.csdn.net/u010818357/article/details/51221002
支持原創,轉載就注明出處。
蘋果后臺運行的原理如何解決代碼實現
蘋果后臺運行的原理
大家都知道,當一個程序進入后臺時,除了一些特定的操作比如用戶的音頻,定位等能夠在info.plist里修改設置進行后臺操作以外,其他的很難能夠進行獲取,比如下載一個東西,就比如我們知道的某視頻播放器(這里為了排除廣告嫌疑,不進行提名)也不能完成后臺掛起狀態的緩存,我個人覺得這點優化的不是很好。有的人應該知道蘋果哪怕后臺掛起一個東西,在appdelegate 里進入后臺執行的方法,也只能存活600s。 進入后臺執行的代理方法是
- (void)applicationDidEnterBackground:(UIApplication *)application{}1234512345我們可以在這個代理方法里進行一些后臺執行的操作,但是只有600s 的存活時間。
如何解決
假如在appdelegate的代理方法里開啟一個后臺任務
- (void)applicationDidEnterBackground:(UIApplication *)application{    //開啟一個后臺任務    taskId = [application beginBackgroundTaskWithExpirationHandler:^{    }];  }//下面是聲明的任務IDUIBackgroundTaskIdentifier taskId;1234567891012345678910在任務結束的時候會回調block,所以也就是說600s 以后會回調。我們需要做的就是在程序還未進行到600s 還未死掉的時候進行一個結束程序,新建一個后臺程序的操作,這樣以來程序就能無止境的在后臺進行運行,你可以做一系列的操作。下面廢話不多說,我把寫的一個Demo的例子粘在下面,請大家參考,有不懂得可以提問。
//進入后臺模式的代理
UIBackgroundTaskIdentifier taskId;- (void)applicationDidEnterBackground:(UIApplication *)application{    //開啟一個后臺任務    taskId = [application beginBackgroundTaskWithExpirationHandler:^{        //結束指定的任務        [application endBackgroundTask:taskId];    }];    [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerAction:) userInfo:nil repeats:YES];    }1234567891011121312345678910111213//定時器的方法
- (void)timerAction:(NSTimer *)timer {    count++;    if (count % 500 == 0) {        UIApplication *application = [UIApplication sharedApplication];        //結束舊的后臺任務        [application endBackgroundTask:taskId];        //開啟一個新的后臺        taskId = [application beginBackgroundTaskWithExpirationHandler:NULL];    }    NSLog(@"%d",count);}12345678910111213141234567891011121314其實很簡單,這個demo就是給一個定時器讓它一直打印,如果不來回關閉任務創建任務程序會在600s 以后死掉,但是做此操作之后程序就會一直在后臺執行。 PS:寫在Appdelegate里面不要忘了給self.window 一個rootViewController.
希望可以幫到需要的人,第一次寫博客,有什么不足的地方希望大家及時指出,也希望大家多多支持。