AVPlayer 从 iOS 7 后台通知播放音频
Posted
技术标签:
【中文标题】AVPlayer 从 iOS 7 后台通知播放音频【英文标题】:AVPlayer play audio from iOS 7 background notification 【发布时间】:2014-01-07 00:47:12 【问题描述】:我在UIBackgroundModes
中设置了audio
、fetch
和remote-notification
,并且我的应用在后台(未激活)通过以下方式成功接收了远程通知:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
我有以下内容:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
:
self.audioPlayer = [[AVPlayer alloc] init];
NSError *sessionError = nil;
NSError *activationError = nil;
[[AVAudiosession sharedInstance] setActive:YES error:&activationError];
if (![[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback withOptions:AVAudioSessionCategoryOptionMixWithOthers error:&sessionError])
NSLog(@"[AppDelegate] Failed to setup audio session: %@", sessionError);
在- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
我有以下内容:
NSLog(@"Playing url: %@", filePath);
AVPlayerItem * currentItem = [AVPlayerItem playerItemWithURL:[NSURL fileURLWithPath:filePath]];
[self.audioPlayer replaceCurrentItemWithPlayerItem:currentItem];
[self.audioPlayer play];
我看到这段代码通过 NSLog 执行,但没有发出声音。实际上,如果应用程序在进入后台的几秒钟内收到通知,音频确实会播放,即。第一次收到通知时会播放音频,但之后就不会播放了。
iOS 7 中的应用程序能否像这样从后台异步启动音频输出,即。在它已经睡着并且一段时间没有产生任何音频之后?
【问题讨论】:
【参考方案1】:您不能在后台启动音频。 audio
后台模式允许您做的唯一一件事就是在应用程序从前台转到后台时继续产生声音。
这是一个完全合理的规则。如果碰巧在后台运行的任何应用程序可能突然开始在设备中随时发出声音,这将是可怕的,这会让用户感到困惑和烦恼!
但是,如果您的应用程序能够接收远程事件,并且如果它产生了声音使其成为远程事件目标,那么在 audio
后台模式下,它可以继续成为远程事件目标,因此只要在此期间没有其他应用成为远程事件目标,就可以在后台发出声音。
在后台产生声音的最可靠方法是将声音附加到本地通知。
【讨论】:
谢谢。本地通知可以播放来自应用的NSDocumentDirectory
的声音资源还是只播放内置资源?
必须在 app bundle 中,你可以看到原因:本地通知可能会在几天后触发,所以我们需要保证声音文件仍然存在。此外,它必须是系统警报类型的声音(即 aiff/wav),因为不会为您使用声音解码资源。当然,声音必须很短。以上是关于AVPlayer 从 iOS 7 后台通知播放音频的主要内容,如果未能解决你的问题,请参考以下文章
iOS AvPlayer AvAudioPlayer音频的后台播放问题