本文csdn地址:http://blog.csdn.net/game3108/article/details/51147931
項目中有需求,要在后臺監控某些參數,進行一些邏輯,(比如有道詞典的后臺復制就彈出notification進行翻譯)那么就涉及到如何讓app可以在后臺更久的運行。
在ios7以前,后臺可以用下面的的方式,去在后臺存活5-10分鐘,在ios8中,只能存活3分鐘。
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil]
查詢過一些資料以后,個人如果要無限的后臺存活的話,可能就要涉及到后臺播放音樂時最簡單的辦法。
首先在Required background modes
加上audio
,然后在applicationDidEnterBackground
中進行播放音樂的操作。
寫了個例子代碼如下:
-(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];
}
});
}
其中需要關注的是,audioplayer在arc的環境中會被release,所以需要持有,而
[[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
需要在程序在前臺的時候去在一次觸發(如果在后臺無法觸發),所以使用音樂播放的時候的前臺觸發才行。
最后,這段代碼最后沒敢進master,因為我們感覺審核應該無法通過。Orz,但是也記錄一下這個tricky的辦法吧
如果有人知道有道詞典是如何實現后臺復制就處理并彈出notification的,歡迎指點一下。