最近做的一个项目有这个需求,在某些时候,应用能触发语音,就算在后台,应用也能播放语音。
然而在普通情况下,由于苹果独特的机制,在应用退到后台的时候,程序是不会继续运行的,所以只能另想办法。
配置后台播放语音
选中Targets-->Capabilities-->BackgroundModes-->ON,如图所示
或者在Targets-->info上添加
静默推送
静默推送---这个方法能实现这个需求,就算应用在后台挂起了,但是应用收到通知后还能在后台(background)状态下运行一段代码。
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(nonnull void (^)(UIBackgroundFetchResult))completionHandler {
completionHandler(UIBackgroundFetchResultNewData);
//手机振动起来
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
//后台播放音频设置
AVAudioSession *session = [AVAudioSession sharedInstance];
[session setActive:YES error:nil];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
//播放语音
}
播放语音
AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:@"测试语音"];
utterance.pitchMultiplier=0.8;
//中式发音
AVSpeechSynthesisVoice *voice = [AVSpeechSynthesisVoice voiceWithLanguage:@"zh-CN"];
AVSpeechSynthesizer *synth = [[AVSpeechSynthesizer alloc]init];
[synth speakUtterance:utterance];
经过测试,无论是在前台或者后台被挂起的时候都能播放语音,但是有时候会被系统中断掉,xcode 的打印台会出现下面这些,但是重新进入app的时候,语音又会播放出来,至今还是个坑,不知道怎么搞。(后来提交到appstore的时候,需要演示后台语音播放功能,然后苹果审核说不可以这样用,就去掉了后台播放的功能)
AVSpeechSynthesizer Audio interruption notification: {
AVAudioSessionInterruptionTypeKey = 1;
}
AVSpeechSynthesizer Audio interruption notification: {
AVAudioSessionInterruptionOptionKey = 0;
AVAudioSessionInterruptionTypeKey = 0;
}
调节系统声音
首先在工程引入MediaPlayer.framework在调节音量的地方加入头文件
MPMusicPlayerController *mp=[MPMusicPlayerController applicationMusicPlayer];
mp.volume=1;//0为最小1为最大
网友评论