在實(shí)際開(kāi)發(fā)中會(huì)遇見(jiàn)下載比較大的視頻時(shí)喷好。不能在前臺(tái)完成全部下載,需要在后臺(tái)進(jìn)行下載读跷。
ios13以后正常后臺(tái)申請(qǐng)的時(shí)間最多為31秒梗搅,31秒后就會(huì)進(jìn)入休眠狀態(tài)等待用戶再次啟動(dòng)。
為了保證應(yīng)用在后臺(tái)長(zhǎng)時(shí)間正常進(jìn)行運(yùn)行效览,目前是有2種方式
1.申請(qǐng)后臺(tái)播放音樂(lè)功能
2.申請(qǐng)后臺(tái)定位功能
目前主流的項(xiàng)目比如QQ等无切、都是使用無(wú)音樂(lè)播放來(lái)保證后臺(tái)保活丐枉,我們項(xiàng)目也主要介紹該功能的實(shí)現(xiàn)ps:但是假如APP沒(méi)有音樂(lè)播放功能哆键,提交審核會(huì)被拒,慎用
xcode里面需要配置如下:該項(xiàng)目只需要勾選第一個(gè)就可以了
廢話不多說(shuō)直接上代碼:
1.先拿到本地的靜音文件
_queue = dispatch_queue_create("Mp3Play", NULL);
//靜音文件
NSString*filePath = [[NSBundlemainBundle]pathForResource:@"mute"ofType:@"mp3"];
NSURL*fileURL = [[NSURLalloc]initFileURLWithPath:filePath];
self.playerBack = [[AVAudioPlayer alloc] initWithContentsOfURL:fileURL error:nil];
[self.playerBackprepareToPlay];
// 0.0~1.0,默認(rèn)為1.0
self.playerBack.volume=0.01;
// 循環(huán)播放
self.playerBack.numberOfLoops= -1;
2.啟用2個(gè)定時(shí)器來(lái)瘦锹,一個(gè)控制器是控制我們打印來(lái)確認(rèn)確實(shí)奔冢活闪盔、另外一個(gè)控制器是來(lái)監(jiān)聽(tīng)我們后臺(tái)是否需要重新去申請(qǐng)時(shí)間
啟動(dòng)定時(shí)器
dispatch_async(_queue, ^{
//啟動(dòng)2個(gè)定時(shí)器 中間使用了一個(gè)第三方的類來(lái)控制,保證不會(huì)造成引用循環(huán)辱士、后期再優(yōu)化成gcd的定時(shí)器
self.timerLog = [[NSTimer alloc] initWithFireDate:[NSDate date] interval:1 target:self.wgProxy selector:@selector(log) userInfo:nil repeats:YES];
self.timerAD = [[NSTimer alloc] initWithFireDate:[NSDate date] interval:_circulaDuration target:self.wgProxy selector:@selector(startAudioPlay) userInfo:nil repeats:YES];
_runloopRef = CFRunLoopGetCurrent();
[[NSRunLoop currentRunLoop] addTimer:self.timerAD forMode:NSDefaultRunLoopMode];
[[NSRunLoop currentRunLoop] addTimer:self.timerLog forMode:NSDefaultRunLoopMode];
CFRunLoopRun();
});
3.在定時(shí)器將要銷毀的時(shí)候再次去請(qǐng)求后臺(tái)時(shí)間來(lái)保證我們可以一直崩嵯疲活
/**
申請(qǐng)后臺(tái)
*/
- (void)applyforBackgroundTask{
self.task =[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
dispatch_async(dispatch_get_main_queue(), ^{
[[UIApplication sharedApplication] endBackgroundTask:self.task];
self.task = UIBackgroundTaskInvalid;
});
}];
}
獻(xiàn)上具體源碼地址:github地址