iOS - 无法在后台播放声音
Posted
技术标签:
【中文标题】iOS - 无法在后台播放声音【英文标题】:iOS - Unable to play a sound in background 【发布时间】:2014-03-05 09:21:32 【问题描述】:我目前正在尝试实现一个像警报系统这样的系统,以便在发生事件时提醒手机(在我的例子中是蓝牙事件)。即使手机处于静音和后台,我也希望出现此警报。
我创建了一个本地通知,但如果手机处于静音模式,我无法播放声音(这似乎很正常,因为我们将手机设为静音)。
所以我尝试自己管理声音,但在后台播放声音时遇到了困难。到目前为止,我在我的 plist 中实现了“应用程序播放音频或使用 AirPlay 流式传输音频/视频”键,并且我正在使用此代码。
AVAudiosession *audioSession = [AVAudioSession sharedInstance];
NSError *error = nil;
BOOL result = [audioSession setActive:YES error:&error];
if ( ! result && error)
NSLog(@"Error For AudioSession Activation: %@", error);
error = nil;
result = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&error];
if ( ! result && error)
NSLog(@"Error For AudioSession Category: %@", error);
if (player == nil)
NSString *path = [[NSBundle mainBundle] pathForResource:@"bell" ofType:@"wav"];
NSURL *url = [NSURL fileURLWithPath:path];
NSError *err = nil;
player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&err];
if(err)
NSLog(@"Error Player == %@", err);
else
NSLog(@"Play ready");
[player prepareToPlay];
[player setVolume:1.0];
if([player play])
NSLog(@"YAY sound");
else
NSLog(@"Error sound");
即使在静音模式下,前台的声音也很好,但我在后台根本没有声音。有什么想法吗?
谢谢
编辑: 最后我得到了它与上面的代码一起工作。唯一缺少的一点是,当我在蓝牙事件中正确播放声音而不是我的函数调用它正在工作时,我试图在某种程度上播放声音似乎是不同的线程。
【问题讨论】:
你试过使用applicationDidEnterBackground:
方法吗?
当应用程序进入后台执行一些长时间的操作(如保存)时调用此方法。在我的情况下,通知可能会在此之后很长时间(但我的应用程序可以执行一些操作,因为它是一个蓝牙事件)
【参考方案1】:
连续播放音频的应用程序(即使应用程序在后台运行时)可以通过在其 Info.plist 文件中包含 UIBackgroundModes 键(带有值音频)注册为后台音频应用程序。包含此键的应用必须在后台向用户播放有声内容。
Apple reference "Playing Background Audio"
Ensuring That Audio Continues When the Screen Locks
找到here
【讨论】:
我是否说过“我在我的 plist 中实现了“应用程序使用 AirPlay 播放音频或流式传输音频/视频”键”【参考方案2】:我不确定您的问题是否是您没有正确配置音频会话输出。在我的应用程序中播放 .wav 时,我遇到了类似的问题。我只用耳机听。这个方法帮助了我:
- (void) configureAVAudioSession
//get your app's audioSession singleton object
AVAudioSession *session = [AVAudioSession sharedInstance];
//error handling
BOOL success;
NSError* error;
//set the audioSession category.
//Needs to be Record or PlayAndRecord to use audioRouteOverride:
success = [session setCategory:AVAudioSessionCategoryPlayAndRecord
error:&error];
if (!success) NSLog(@"AVAudioSession error setting category:%@",error);
//set the audioSession override
success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker
error:&error];
if (!success) NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error);
//activate the audio session
success = [session setActive:YES error:&error];
if (!success) NSLog(@"AVAudioSession error activating: %@",error);
else NSLog(@"audioSession active");
试试看!
【讨论】:
感谢您的帮助,我尝试添加 overrideOutputAudioPort 方法,但仍然无法正常工作...【参考方案3】:您需要在 plist 文件中进行一些更改。
用于在应用进入背景时启用声音。
1) 将必需的后台模式设置为应用播放音频
2) 设置应用程序不在后台运行为YES。
NSError *setCategoryErr = nil;
NSError *activationErr = nil;
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr];
[[AVAudioSession sharedInstance] setActive:YES error:&activationErr];
那么,你需要在 AppDelegate 中写这么多代码
现在,您可以在手机屏幕锁定或在后台轻松播放音频。
它对我来说很好用。 :)
更多信息请参考Playing Audio in background mode和Audio Session Programming Guide
【讨论】:
以上是关于iOS - 无法在后台播放声音的主要内容,如果未能解决你的问题,请参考以下文章