最近再做一個類似於“駕考寶典”的iOS應用,當然作為考試計時的功能肯定不會少,開發期間也是遇到各種各樣的小問題,本文所講為其中之一:iOS程序進入后台后十分鍾之內就會被系統kill掉,怎么解決呢?我想要程序進入后台后仍然運行計時功能,否則就無法達到考試的目的,之后在網上查閱了相關資料最后終於找到答案,其精髓就是:利用蘋果給出的三種類型的程序可以保持在后台運行:音頻播放類,位置更新類,另外一個記不太清楚了,我利用了蘋果給出的音頻播放類的這個“特權”來滿足我程序上的要求,詳細步驟如下:
1、步驟一:在Info.plist中,添加"Required background modes"鍵,value為:App plays audio
步驟二:
- (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; } }); }); }
完成以上步驟你會發現,程序進入后台后仍可運行定時器!