最近客户要求app在后台无限存活,记录用户的位置信息。本人在网上找了两个方法,第一个是无限开启定位,这种方式比较耗电,因为是使用的GPS定位。第二种方式是后台播放无声音乐保持app在后台无限期存活。这种方式相比第一种方式耗电小一点。
- (void)playbackgroud
{
/*
这里是随便添加得一首音乐。
真正的工程应该是添加一个尽可能小的音乐。。。
0~1秒的
没有声音的。
循环播放就行。
这个只是保证后台一直运行该软件。
使得该软件一直处于活跃状态.
你想操作的东西该在哪里操作就在哪里操作。
*/
AVAudioSession *session = [AVAudioSession sharedInstance];
/*打开应用会关闭别的播放器音乐*/
// [session setCategory:AVAudioSessionCategoryPlaybaxck error:nil];
/*打开应用不影响别的播放器音乐*/
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:nil];
[sessionsetActive:YES error:nil];
//设置代理 可以处理电话打进时中断音乐播放
NSString *musicPath = [[NSBundle mainBundle] pathForResource:@"jy" ofType:@"mp3"];
NSURL*URLPath = [NSURLfileURLWithPath:musicPath];
NSError*err=nil;
player = [[AVAudioPlayer alloc] initWithContentsOfURL:URLPath error:&err];
// [player setDelegate:self];
if(err!=nil) {
NSLog(@"move player init error:%@",err);
}else{
if (![player isPlaying]){
player.numberOfLoops = -1;
player.currentTime = 0;
[player setVolume:0.6];
[player prepareToPlay];
[playerplay];
}
}
}
这种方式还有一个弊端就是用户接打电话会中断音乐播放,使得app会刮起,解决这个弊端的原因是:
// 监听事件中断通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionInterruptionNotification:) name:AVAudioSessionInterruptionNotification object:nil];
// 监听中断通知调用的方法
- (void)audioSessionInterruptionNotification:(NSNotification*)notification{
/*
监听到的中断事件通知,AVAudioSessionInterruptionOptionKey
typedef NS_ENUM(NSUInteger, AVAudioSessionInterruptionType)
{
AVAudioSessionInterruptionTypeBegan = 1, 中断开始
AVAudioSessionInterruptionTypeEnded = 0, 中断结束
}
*/
int type = [notification.userInfo[AVAudioSessionInterruptionOptionKey] intValue];
switch(type) {
case AVAudioSessionInterruptionTypeBegan: // 被打断
[player pause]; // 暂停播放
break;
case AVAudioSessionInterruptionTypeEnded: // 中断结束
[playerplay]; // 继续播放
break;
default:
break;
}
}
忘了还有关键的一点
{
AVAudioPlayer *player;//必须设置成全局变量否则不会播报
}
有更好的方法欢迎指教。