最近再做一個iOS應用,擁有考試計時的功能,開發期間也是遇到各種各樣的小問題,本文所講爲其中之一:iOS程序進入後臺後十分鐘之內就會被系統kill掉,怎麼解決呢?我想要程序進入後臺後仍然運行計時功能,否則就無法達到考試的目的,之後在網上查閱了相關資料最後終於找到答案,其精髓就是:利用蘋果給出的三種類型的程序可以保持在後臺運行:音頻播放類,位置更新類,另外一個記不太清楚了,我利用了蘋果給出的音頻播放類的這個“特權”來滿足我程序上的要求,詳細步驟如下:
1、步驟一:在Info.plist中,添加"Required background modes"鍵,value爲:App plays audio
步驟二:找到appDelegate.m中的方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
在裏面添加音頻的相應代碼
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
NSError *setCategoryErr = nil;
NSError *activationErr = nil;
[[AVAudioSession sharedInstance]
setCategory: AVAudioSessionCategoryPlayback
error: &setCategoryErr];
[[AVAudioSession sharedInstance]
setActive: YES
error: &activationErr];
self.window.backgroundColor = [UIColor whiteColor];
[self.window makeKeyAndVisible];
return YES;
}
步驟三:將以下代碼添加到appDelegate文件中的- (void)applicationDidEnterBackground:(UIApplication *)application函數,也可添加到在具體類中註冊的應用進入後臺後的通知方法
- (void)applicationDidEnterBackground:(UIApplication *)application{
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;
}
});
});
}
大功工程,現在即使程序進入後臺,定時器依舊會走,不會停止。
原文地址:http://www.cnblogs.com/zzltjnh/archive/2013/05/15/3080058.html