NSTimer在后臺(tái)運(yùn)行

在iOS中應(yīng)用進(jìn)入后臺(tái),系統(tǒng)會(huì)將整個(gè)應(yīng)用當(dāng)前的狀態(tài)以快照的形式保存起來,也就是常說的"墓碑"機(jī)制疙剑。此時(shí)對(duì)應(yīng)的定時(shí)器也就直接被關(guān)閉了戒突,如果我們需要在后臺(tái)保持一段時(shí)間運(yùn)行屯碴,我們就需要做對(duì)應(yīng)的處理。
在iOS中應(yīng)用進(jìn)入后臺(tái)膊存,app都有3分鐘左右的后臺(tái)任務(wù)執(zhí)行時(shí)間导而。 3分鐘后,app會(huì)被iOS強(qiáng)行掛起隔崎。

除了

  • 音樂應(yīng)用
  • 電話之類
  • GPS定位

的app可以保持一個(gè)長久的后臺(tái)運(yùn)行今艺。當(dāng)你提交app到App Store時(shí),蘋果會(huì)審查你的app爵卒,一旦發(fā)現(xiàn)你“濫用”了后臺(tái)API虚缎,你的app將被拒絕。也即是說你在info.plist 設(shè)置這幾種backgroundmode,你的程序必須含有這些功能技潘,你的程序才會(huì)有審核通過遥巴。

一般情況下千康,3分鐘的后臺(tái)時(shí)間足夠我們處理我們的應(yīng)用數(shù)據(jù)了。
定時(shí)器在這3分鐘的時(shí)間內(nèi)保持不間斷的運(yùn)行铲掐。

方法1

在app的代理中添加如下代碼

- (void)applicationDidEnterBackground:(UIApplication *)application {
    if ( [self isMutiltaskingSupported] == NO) {
        NSLog(@"---> 不支持后臺(tái)多任務(wù)");
        return;
    }
    
    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;
            }
        });
    });
}

當(dāng)然你需要判斷你的設(shè)備是否支持后臺(tái)(不支持多任務(wù)情況現(xiàn)在基本可以忽略)

// 判斷當(dāng)前設(shè)備是否支持 后臺(tái)多任務(wù)
- (BOOL)isMutiltaskingSupported{
    BOOL result = NO;
    if ( [[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) {
        result = [[UIDevice currentDevice] isMultitaskingSupported];
    }
    return result;
}
方法2

在網(wǎng)上搜索了下拾弃,基本上實(shí)現(xiàn)方式都差不多。這里直接代碼貼出摆霉,以備以后查閱

#import "AppDelegate.h"

@interface AppDelegate ()
@property (nonatomic, unsafe_unretained) UIBackgroundTaskIdentifier backgroundTaskIdentifier;
@property (nonatomic, strong) NSTimer * myTimer;

@end

@implementation AppDelegate

// 判斷當(dāng)前設(shè)備是否支持 后臺(tái)多任務(wù)
- (BOOL)isMutiltaskingSupported{
    BOOL result = NO;
    if ( [[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) {
        result = [[UIDevice currentDevice] isMultitaskingSupported];
    }
    return result;
}
// 定時(shí)器調(diào)用方法
- (void)timerMethod:(NSTimer *)paramSender{
    NSTimeInterval backgroundTimeRemanging = [[UIApplication sharedApplication] backgroundTimeRemaining];
    if ( backgroundTimeRemanging == DBL_MAX) {
        NSLog(@"Background Time Remaining = Undeterminded");
    }
    //--顯示后臺(tái)任務(wù)還剩余的時(shí)間
    NSLog(@"Background Timer Remaining = %.02f Seconds", backgroundTimeRemanging);
}

- (void)applicationDidEnterBackground:(UIApplication *)application {
    NSTimeInterval backgroundTimeRemanging = [[UIApplication sharedApplication] backgroundTimeRemaining];
    NSLog(@"backgroundTimeRemanging = %.02f", backgroundTimeRemanging);
    
    if ( [self isMutiltaskingSupported] == NO) {
        NSLog(@"---> 不支持后臺(tái)多任務(wù)");
        return;
    }
    
    self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{
        [self endBackgroundTask];
    }];
    self.myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timerMethod:) userInfo:nil repeats:YES];
}

// 任務(wù)完成豪椿,處理釋放對(duì)象
- (void)endBackgroundTask{
    dispatch_queue_t mainQueue = dispatch_get_main_queue();
    __weak AppDelegate *weakSelf = self;
    dispatch_async(mainQueue, ^{
        AppDelegate * strongSelf = weakSelf;
        if (strongSelf != nil) {
            [strongSelf.myTimer invalidate];
            [[UIApplication sharedApplication] endBackgroundTask:self.backgroundTaskIdentifier];
            strongSelf.backgroundTaskIdentifier = UIBackgroundTaskInvalid;
        }
    });
}

// 進(jìn)入前臺(tái),停止任務(wù)
- (void)applicationDidBecomeActive:(UIApplication *)application {
    if (self.backgroundTaskIdentifier != UIBackgroundTaskInvalid){
        [self endBackgroundTask];
    }
}
@end

參考鏈接
參考1

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末携栋,一起剝皮案震驚了整個(gè)濱河市搭盾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌婉支,老刑警劉巖鸯隅,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異向挖,居然都是意外死亡蝌以,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門何之,熙熙樓的掌柜王于貴愁眉苦臉地迎上來跟畅,“玉大人,你說我怎么就攤上這事溶推』布” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵蒜危,是天一觀的道長虱痕。 經(jīng)常有香客問我,道長舰褪,這世上最難降的妖魔是什么皆疹? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮占拍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捎迫。我一直安慰自己晃酒,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布窄绒。 她就那樣靜靜地躺著贝次,像睡著了一般。 火紅的嫁衣襯著肌膚如雪彰导。 梳的紋絲不亂的頭發(fā)上蛔翅,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天敲茄,我揣著相機(jī)與錄音,去河邊找鬼山析。 笑死堰燎,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的笋轨。 我是一名探鬼主播秆剪,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼爵政!你這毒婦竟也來了仅讽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤钾挟,失蹤者是張志新(化名)和其女友劉穎洁灵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掺出,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡处渣,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛛砰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罐栈。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖泥畅,靈堂內(nèi)的尸體忽然破棺而出荠诬,到底是詐尸還是另有隱情,我是刑警寧澤位仁,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布柑贞,位于F島的核電站,受9級(jí)特大地震影響聂抢,放射性物質(zhì)發(fā)生泄漏钧嘶。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一琳疏、第九天 我趴在偏房一處隱蔽的房頂上張望有决。 院中可真熱鬧,春花似錦空盼、人聲如沸书幕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽台汇。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間苟呐,已是汗流浹背痒芝。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牵素,地道東北人严衬。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像两波,于是被迫代替她去往敵國和親瞳步。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,782評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫腰奋、插件单起、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,065評(píng)論 4 62
  • 人性之所以復(fù)雜就在于 每個(gè)人都極度希望成全“本我” 然后有意無意的強(qiáng)求別人之于自己是“超我” 殊不知 人心都是肉長...
    寫夏閱讀 179評(píng)論 0 0
  • 1、概述 閉包 = 一個(gè)函數(shù)「或指向函數(shù)的指針」+ 該函數(shù)執(zhí)行的外部的上下文變量「也就是自由變量」劣坊;Block 是...
    DeerRun閱讀 660評(píng)論 0 0
  • PART 1 這兩天扁桃體發(fā)炎局冰,感冒测蘑,咳嗽。于是康二,收起了自己穿碎花長裙在風(fēng)中歡騰跳躍的高I特質(zhì)碳胳,換上了粗苯的大棉襖...
    徐婧如閱讀 1,082評(píng)論 2 3