本文csdn地址:http://blog.csdn.net/game3108/article/details/51147931
項(xiàng)目中有需求毛肋,要在后臺監(jiān)控某些參數(shù),進(jìn)行一些邏輯屋剑,(比如有道詞典的后臺復(fù)制就彈出notification進(jìn)行翻譯)那么就涉及到如何讓app可以在后臺更久的運(yùn)行润匙。
在ios7以前,后臺可以用下面的的方式唉匾,去在后臺存活5-10分鐘孕讳,在ios8中,只能存活3分鐘巍膘。
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil]
查詢過一些資料以后厂财,個(gè)人如果要無限的后臺存活的話,可能就要涉及到后臺播放音樂時(shí)最簡單的辦法峡懈。
首先在Required background modes
加上audio
璃饱,然后在applicationDidEnterBackground
中進(jìn)行播放音樂的操作。
寫了個(gè)例子代碼如下:
-(void) applicationDidEnterBackground:(UIApplication *)application{
UIBackgroundTaskIdentifier bgTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
_shouldStopBg = NO;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(){
while ( TRUE ) {
if ( _shouldStopBg ){ break; }
float remainTime = [[UIApplication sharedApplication] backgroundTimeRemaining];
NSLog(@"###!!!BackgroundTimeRemaining: %f",remainTime);
if ( remainTime < 20.0 ){
NSLog(@"start play audio!");
NSError *audioSessionError = nil;
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
if ( [audioSession setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&(audioSessionError)] )
{
NSLog(@"set audio session success!");
}else{
NSLog(@"set audio session fail!");
}
NSURL *musicUrl = [[NSURL alloc]initFileURLWithPath:[[NSBundle mainBundle] pathForResource:@"bgSong" ofType:@"mp3"]];
self.audioPlayer = [[AVAudioPlayer alloc]initWithContentsOfURL:musicUrl error:nil];
self.audioPlayer.numberOfLoops = 0;
self.audioPlayer.volume = 0;
[self.audioPlayer play];
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
}
[NSThread sleepForTimeInterval:1.0];
}
});
}
其中需要關(guān)注的是肪康,audioplayer在arc的環(huán)境中會被release荚恶,所以需要持有,而
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
需要在程序在前臺的時(shí)候去在一次觸發(fā)(如果在后臺無法觸發(fā))磷支,所以使用音樂播放的時(shí)候的前臺觸發(fā)才行谒撼。
最后,這段代碼最后沒敢進(jìn)master雾狈,因?yàn)槲覀兏杏X審核應(yīng)該無法通過廓潜。Orz,但是也記錄一下這個(gè)tricky的辦法吧
如果有人知道有道詞典是如何實(shí)現(xiàn)后臺復(fù)制就處理并彈出notification的善榛,歡迎指點(diǎn)一下辩蛋。