iOS 后台播放语音

最近做的一个项目有这个需求,在某些时候,应用能触发语音,就算在后台,应用也能播放语音。

然而在普通情况下,由于苹果独特的机制,在应用退到后台的时候,程序是不会继续运行的,所以只能另想办法。

配置后台播放语音

选中Targets-->Capabilities-->BackgroundModes-->ON,如图所示

iOS 后台播放语音_第1张图片

或者在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为最大

你可能感兴趣的:(iOS 后台播放语音)