iOS定時器在后臺保活及擴(kuò)展后臺永久存活

實(shí)戰(zhàn)出真知 ,下面帶大家慢慢玩轉(zhuǎn)后臺存活。

首先新建個項(xiàng)目 ,寫上幾句簡單的代碼

#import "ViewController.h"

@interface ViewController ()
@property (nonatomic , strong) dispatch_source_t timer;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    __block int flag = 0;
    
    _timer = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, dispatch_get_main_queue());
    dispatch_source_set_timer(_timer, DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC, 1 * NSEC_PER_SEC );
    dispatch_source_set_event_handler(_timer, ^{
        flag ++;
        NSLog(@"flag = %d",flag);
    });
    dispatch_resume(_timer);
}

接下來 我們運(yùn)行項(xiàng)目,控制臺能循環(huán)打印信息 并且累加;這時候我們按下Home鍵,切到后臺,這時候控制臺的信息不打印了,這是為什么呢,timer失去作用了。

分析問題

一般來說,沒有進(jìn)行過任何設(shè)置的app,默認(rèn)退到后臺極短的幾秒后就變成掛起狀態(tài)

初步解決

利用 UIBackgroundTaskIdentifier 后臺任務(wù)標(biāo)記時,讓我們來看看后臺程序能撐多久

- (void)applicationDidEnterBackground:(UIApplication *)application {
    [self startBackgroundTask];
    
}

- (void)startBackgroundTask{
    UIApplication* app = [UIApplication sharedApplication];
    __block  UIBackgroundTaskIdentifier  bgTask ;
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        //這里延遲的系統(tǒng)時間結(jié)束
        NSLog(@"%f",app.backgroundTimeRemaining);
    }];
}

在appdelegate中加上上述代碼 ,運(yùn)行程序,再切換至后臺,接著我們再觀察控制臺的打印信息,看看什么時候停止打印。


image.png

我們可以看到 后臺在三分鐘左右的樣子 后臺任務(wù)結(jié)束,并且預(yù)留了4秒左右的緩沖時間。這時候app休眠了。

方法二次改進(jìn)

我們利用定位系統(tǒng)保持后臺永活

首先我們打開應(yīng)用位置更新功能


image.png

然后再plist文件中寫上

 <key>NSLocationAlwaysUsageDescription</key>
    <string>Location is required to find out where you are</string>

繼續(xù)加上如下代碼

- (void)applicationDidEnterBackground:(UIApplication *)application {
    [self startBackgroundTask];
    [self startLocationUpdate];
}
- (void)startLocationUpdate{
    if(!_locationManager){
        _locationManager = [[CLLocationManager alloc] init];
        _locationManager.allowsBackgroundLocationUpdates = YES;
        _locationManager.delegate = self;
        [_locationManager requestAlwaysAuthorization];
        [_locationManager startUpdatingLocation];
    }
}

接下來運(yùn)行再切換后臺
等待三分鐘看看結(jié)果
這時候發(fā)現(xiàn)后臺控制器一直處于打印狀態(tài) ,大功告成。

額外擴(kuò)展

我們也可以用后臺播放視頻的方法來做到后臺永活的功能,做法與后臺定位的方式類似,這里就不多說了

- (void)applicationDidEnterBackground:(UIApplication *)application {
    [self stratBadgeNumberCount];
    [self startBgTask];
    /** 播放聲音 */
    [self.player play];
}

- (AVAudioPlayer *)player{
    if (!_player){
        NSURL *url=[[NSBundle mainBundle]URLForResource:@"work5.mp3" withExtension:nil];
        _player = [[AVAudioPlayer alloc]initWithContentsOfURL:url error:nil];
        [_player prepareToPlay];
        //一直循環(huán)播放
        _player.numberOfLoops = -1;
        AVAudioSession *session = [AVAudioSession sharedInstance];
        [session setCategory:AVAudioSessionCategoryPlayback error:nil];
        
        [session setActive:YES error:nil];
    }
    return _player;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 自從古老的iOS4以來,當(dāng)用戶點(diǎn)擊home建的時候,你可以使你的APP們在內(nèi)存中處于suspended(掛起)狀態(tài)...
    木易林1閱讀 3,347評論 1 4
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,650評論 1 32
  • 對于這個問題,我能斬釘截鐵地說:“不是”!相反,高學(xué)歷女性做全職媽媽會讓孩子得到比較高起點(diǎn)的培育! 我是一個本科畢...
    鎂沁閱讀 304評論 0 2
  • 有朋自遠(yuǎn)方來,不亦說乎,我最好的朋友不來自遠(yuǎn)方,但我依然很開心。之所以是我最好的朋友,不僅僅是因?yàn)閺男⊥娴?..
    格格的檸檬西柚閱讀 211評論 0 0
  • 正文:你要相信自己真的是一株水仙,相信你終于有一天是會開花的。只有這樣堅(jiān)定樂觀的心態(tài)才能支撐你度過最艱難的日子。你...
    臨淄茂業(yè)DDM黃紅閱讀 226評論 5 0

友情鏈接更多精彩內(nèi)容