我目前正在尝试的是在应用程序在后台(或可能从挂起状态唤醒)收到远程通知时播放消息。
应用程序从挂起模式唤醒后根本不播放声音。
didReceiveRemoteNotification:
当应用程序在前台时,调用方法后立即播放声音。
didReceiveRemoteNotification:
当应用程序从挂起模式唤醒时调用方法时立即播放声音的合适方法是什么?
这是一些代码(语音管理器类):
-(void)textToSpeechWithMessage:(NSString*)message andLanguageCode:(NSString*)languageCode{
AVAudioSession *audioSession = [AVAudioSession sharedInstance];
NSError *error = nil;
DLog(@"Activating audio session");
if (![audioSession setCategory:AVAudioSessionCategoryPlayAndRecord withOptions:AVAudioSessionCategoryOptionDefaultToSpeaker | AVAudioSessionCategoryOptionMixWithOthers error:&error]) {
DLog(@"Unable to set audio session category: %@", error);
}
BOOL result = [audioSession setActive:YES error:&error];
if (!result) {
DLog(@"Error activating audio session: %@", error);
}else{
AVSpeechUtterance *utterance = [AVSpeechUtterance speechUtteranceWithString:message];
[utterance setRate:0.5f];
[utterance setVolume:0.8f];
utterance.voice = [AVSpeechSynthesisVoice voiceWithLanguage:languageCode];
[self.synthesizer speakUtterance:utterance];
}
}
-(void)textToSpeechWithMessage:(NSString*)message{
[self textToSpeechWithMessage:message andLanguageCode:[[NSLocale preferredLanguages] objectAtIndex:0]];
}
后来在AppDelegate
:
[[MCSpeechManager sharedInstance] textToSpeechWithMessage:messageText];
我在 Capabilities->Background Modes 部分启用了音频、AirPlay 和画中画选项。
编辑:
如果需要,也许我应该启动一个后台任务并运行过期处理程序?我想这可能有效,但我也想听听解决这种情况的常用方法。
同样使用此代码,当我在后台收到通知时,我会收到下一个错误:
激活音频会话时出错:Error Domain=NSOSStatusErrorDomain Code=561015905 "(null)"
代码 561015905 适用于:
AVAudioSessionErrorCodeCannotStartPlaying = '!pla', /* 0x21706C61, 561015905
它被描述为:
如果应用程序的信息属性列表不允许使用音频,或者应用程序在后台并使用不允许背景音频的类别,则可能会出现此错误类型。
但我在其他类别(AVAudioSessionCategoryAmbient
和AVAudioSessionCategorySoloAmbient
)中遇到同样的错误