iOS 8在10分钟后停止后台音频流

iOS 8在10分钟后停止后台音频流,ios,cocoa-touch,audio,ios8,avfoundation,Ios,Cocoa Touch,Audio,Ios8,Avfoundation,我有一个从SHOUTcast服务器播放流式音频的应用程序。当应用程序位于前台且自动锁定被禁用时,一切正常。不过,该应用程序也可以在后台播放音频,该功能在iOS 6和iOS 7上一直运行良好。但现在我的用户报告说,在升级到iOS 8大约10分钟后,背景音频停止 我可以通过在iOS 8上运行应用程序来重现这个问题。由于应用程序本身相当复杂,我制作了一个简单的演示来说明这个问题。我使用的是Xcode 6,基本SDK设置为iOS 8。我已在我的Info.plist中将音频添加到UIBackgroundM

我有一个从SHOUTcast服务器播放流式音频的应用程序。当应用程序位于前台且自动锁定被禁用时,一切正常。不过,该应用程序也可以在后台播放音频,该功能在iOS 6和iOS 7上一直运行良好。但现在我的用户报告说,在升级到iOS 8大约10分钟后,背景音频停止

我可以通过在iOS 8上运行应用程序来重现这个问题。由于应用程序本身相当复杂,我制作了一个简单的演示来说明这个问题。我使用的是Xcode 6,基本SDK设置为iOS 8。我已在我的Info.plist中将音频添加到UIBackgroundModes。有人知道下面的代码有什么问题吗

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    NSURL *streamingURL = [NSURL URLWithString:@"http://www.radiofmgold.be/stream.php?ext=pls"];

    AVPlayerItem *playerItem = [AVPlayerItem playerItemWithURL:streamingURL];
    [self setPlayerItem:playerItem];

    AVPlayer *player = [AVPlayer playerWithPlayerItem:playerItem];
    [player setAllowsExternalPlayback:NO];

    [self setPlayer:player];
    [player play];

    [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil];
    [[AVAudioSession sharedInstance] setActive: YES error: nil];

    return YES;
}

我在iOS 8.0.2下也遇到了同样的问题。我的远程音频源以mp3播放。 似乎是内部错误导致AVAudioSession重新启动。您可以用不同的方式处理此问题:

您可以观察AVPlayerItem的状态

void* YourAudioControllerItemStatusContext = "YourAudioControllerItemStatusContext";
...
@implementation YourAudioController
...
- (void)playStream {
    ...
    AVPlayerItem *item = [[AVPlayerItem alloc] initWithURL:streamUrl];
    [item addObserver:self forKeyPath:@"status" options:0 context:MJAudioControllerItemStatusContext];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
    if (context == YourAudioControllerItemStatusContext) {
        AVPlayerItem *item = object;
        if (item.status == AVPlayerItemStatusFailed) {
            [self recoverFromError];
        }
    }
这种方法似乎不可靠,因为在AVPlayerItem的状态发生变化之前可能会有巨大的时间延迟——如果它发生变化的话

我通过observeValueForKeyPath进行调试,发现AVPlayerItem的状态更改为AVErrorMediaServicesWereReset,并设置了错误代码-11819

因为我经历了AVErrorMediaServicesWereReset错误,所以我研究了导致此错误的原因-这是AVAudioSession变得疯狂。参考Apple提供的,您应该注册AVAudioSessionMediaServicesWereResetNotifications。把它放在代码中的某个地方:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioSessionWasReset:) name:AVAudioSessionMediaServicesWereResetNotification object:nil];
然后添加此方法:

- (void)audioSessionWasReset:(NSNotification *)notification {
    [self recoverFromError];
}
在recoverFromError方法中,尝试以下操作之一:

  • 显示一个警报,说明iOS 8下存在问题,需要重新启动流
  • 通过再次将AVAudioSession设置为活动状态并使用新的AVPlayerItem实例化新的AVPlayer实例来重新启动流
目前,这是我唯一知道如何处理它的方法。问题是为什么音频会话要重新启动

更新
iOS 8.1的发布似乎解决了这个问题。

我也遇到过同样的问题,并在运行iOS 8.0.2的iPhone 5s和运行iOS 8.1 beta 2的iPad Mini Retina上进行了测试,这意味着在即将到来的beta中这一问题不会得到解决。大约30分钟后,两人都停止播放音频

当AVPlayer.status==avplayerItemStatus失败时,您可以注销AVPlayer.status以了解有关错误的更多详细信息。我收到:

Error Domain=AVFoundationErrorDomain code=-11819“无法完成操作”UserInfo=0x178a75bc0{NSLocalizedDescription=无法完成操作,nsLocalizedRecoverysSuggestion=稍后重试。}

即使当我试图捕捉到这一点,并停止和启动我的播放器,然后我收到一个致命的错误,告诉我,AVPlayer已被解除分配。此时,按照Hendrik的建议,尝试重新初始化一个新的AVPlayer实例可能是值得的。这仍然不能解决当您尝试重新初始化时音频将临时中断的问题。您的AVPlayer也可能在重新初始化之前收到通知,这意味着您将收到致命错误;这远不是永久性的解决办法

也许其他人在这方面运气更好,可以提供更具体的解决方案。同时,我也向苹果公司报告了这个错误


2014年10月15日更新:苹果已关闭我的错误报告,状态为:18152675(已关闭)的副本。

看起来它在iOS 8.1中已修复。

此问题似乎已通过iOS 8.1更新得到修复。我昨天更新了它,可以流45分钟,而在更新之前,它会在10-15分钟内崩溃

如果您找到了修复程序,请与他人共享。我的用户也报告了这个问题。我无法重现它。起初我也无法重现该问题,因为问题并非发生在所有流媒体链接上。然而,我的代码中的流总是在10分钟后停止,而它在iOS 7上运行良好。这真的很烦人,因为流媒体是我应用程序的主要功能,我现在被一星评论和用户的抱怨弄得不知所措。我会尽快就这个问题悬赏,但恐怕这是苹果方面的一个错误。不过我真的希望我能自己修好。。我的应用程序基本上依赖于这个功能。嗨,伙计们,我也遇到了同样的问题。在我看来,苹果把事情搞砸了。在我的例子中,流停止播放的时间变化很大(5分钟到12分钟)。流似乎突然失去连接,然后播放,直到缓冲数据用完为止。当应用程序位于前台和后台时发生。处理它的唯一方法是观察AVPlayerItem的状态。是的,我运行了问题中的示例代码,流媒体持续了30分钟(之后我手动停止了它)。我想知道为什么这个iOS 8.0错误没有影响潘多拉和Spotify。