iOS程序進入后台后仍運行定時器NSTimer


最近再做一個類似於“駕考寶典”的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;
            }
        });
    });
}

完成以上步驟你會發現,程序進入后台后仍可運行定時器!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM