MPMoviePlayerController 在后台播放airPlay,双击主页按钮时崩溃

Posted

技术标签:

【中文标题】MPMoviePlayerController 在后台播放airPlay,双击主页按钮时崩溃【英文标题】:MPMoviePlayerController playing airPlay in background, crash when double tap home button 【发布时间】:2012-01-27 11:17:31 【问题描述】:

当我转到主屏幕并且应用程序在后台时,MPMoviePlayerController 成功播放 airPlay。但是当我双击主页按钮时,应用程序崩溃了。这发生在 ios 5 上,但不是在 4.3 上。

为了排除其他代码,我创建了一个新的空项目,仅在按下按钮时执行下面的代码。

moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL URLWithString:@"http://devimages.apple.com/iphone/samples/bipbop/gear1/prog_index.m3u8"]];

NSError *setCategoryError = nil; 
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &setCategoryError]; 

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(moviePlaybackComplete:)
                                             name:MPMoviePlayerPlaybackDidFinishNotification
                                           object:moviePlayerController];

[moviePlayerController setMovieSourceType:MPMovieSourceTypeStreaming];
[self addObservers];
[self.delegate addSubview:moviePlayerController.view];
if([moviePlayerController respondsToSelector:@selector(setAllowsAirPlay:)])

    [moviePlayerController setAllowsAirPlay:YES];


moviePlayerController.fullscreen = YES;

moviePlayerController.scalingMode = MPMovieScalingModeAspectFit;
[moviePlayerController prepareToPlay];
[moviePlayerController play];

在控制台中,我在崩溃时得到以下输出:

Jan 27 12:08:01 unknown mediaserverd[295] <Error>: <<<< FIGSERVER >>>> FigPlayerRemoteServer_KillAndForceCrashReport: RPCTimeout message received to terminate [295] with reason 'fig rpc timeout -- FigSharedRemote_VolumeCategoryForAudioCategory'
Jan 27 12:08:01 unknown ReportCrash[308] <Notice>: MS:Notice: Installing: (null) [ReportCrash] (675.00)
Jan 27 12:08:01 unknown ReportCrash[308] <Error>: Saved crashreport to /Library/Logs/CrashReporter/mediaserverd-2012-01-27-120801.plist using uid: 0 gid: 0, synthetic_euid: 0 egid: 0
Jan 27 12:08:01 unknown mediaserverd[295] <Error>: <<<< FIGSERVER >>>> FigPlayerRemoteServer_KillAndForceCrashReport: RPCTimeout message received; stackshot generated
Jan 27 12:08:01 unknown mediaserverd[295] <Error>: <<<< FIGSERVER >>>> FigPlayerRemoteServer_KillAndForceCrashReport: TERMINATING our process [295]
Jan 27 12:08:02 unknown com.apple.launchd[1] <Notice>: (com.apple.mediaserverd) Exited: Killed: 9
Jan 27 12:08:02 unknown mediaserverd[310] <Notice>: MS:Notice: Installing: com.apple.mediaserverd [mediaserverd] (675.00)
Jan 27 12:08:02 unknown kernel[0] <Debug>: Sandbox: ignoring builtin profile for platform app: /usr/sbin/mediaserverd
Jan 27 12:08:02 unknown kernel[0] <Debug>: Sandbox: ignoring builtin profile for platform app: /usr/sbin/mediaserverd
Jan 27 12:08:03 unknown mediaserverd[310] <Error>: 12:08:03.383370 com.apple.AVConference: /SourceCache/GameKitServices/GameKitServices-344.3/AVConference.subproj/Sources/AVConferenceServer.m:1862: AVConferenceServerStart aborting - device doesn't support conferencing

在崩溃报告中:

Exception Type:  EXC_CRASH (SIGABRT)
Exception Codes: 0x00000000, 0x00000000
Crashed Thread:  0

Last Exception Backtrace:
0   CoreFoundation                  0x33bab8bf 0x33af2000 + 759999
1   libobjc.A.dylib                 0x31bcd1e5 0x31bc4000 + 37349
2   AVFoundation                    0x374f6cb5 -[AVPlayerItem _attachToPlayer:forImmediateEnqueueing:shouldAppendItem:] + 341
3   AVFoundation                    0x374e71f7 -[AVPlayer _insertPlaybackItemOfItem:inPlayerQueueAfterPlaybackItemOfItem:] + 43
4   AVFoundation                    0x374eebf3 __-[AVPlayer _attachItem:andPerformOperation:withObject:]_block_invoke_2 + 1099
5   libdispatch.dylib               0x3641cd55 0x3641c000 + 3413
6   libdispatch.dylib               0x36427e8d 0x3641c000 + 48781
7   CoreFoundation                  0x33b7e2dd 0x33af2000 + 574173
8   CoreFoundation                  0x33b014dd 0x33af2000 + 62685
9   CoreFoundation                  0x33b013a5 0x33af2000 + 62373
10  GraphicsServices                0x31f56fcd 0x31f53000 + 16333
11  UIKit                           0x36d57743 0x36d26000 + 202563
12  AirplayTest                     0x00002e45 main (main.m:16)
13  AirplayTest                     0x00002dd4 start + 40

有什么可能是错的线索吗?

【问题讨论】:

我遇到了同样的问题。并非每次都发生这种情况,通常是在我同时启动其他应用程序时。我认为这是由于 MPMoviePlayerController 的视图的父视图在设备需要更多资源时被错误卸载造成的 进入后台时有代码运行吗? 也有这个崩溃,你修复了吗? 请提供答案,方便大家使用 但在我的 iPad 中,我无法看到特定应用程序的单个崩溃报告。这个 iPad 之前有 5.1 版本。现在我已经将版本更新到 iOS 6.0。 【参考方案1】:

您是否尝试过仅针对 iOS 5 将电影播放器​​控制器的 useApplicationAudioSession 属性设置为 NO(即模拟 iOS 3.1 默认行为)? iOS 5 中的音频会话处理似乎存在一些错误,当您在应用程序之间切换、处理中断等时,这些错误可能会导致音频服务器死机。

如果这修复了它,请向 Apple 提交错误报告,因为它更像是一个 hack 而不是修复!

【讨论】:

【参考方案2】:

这似乎是 iOS 5.0 版中的一个错误。随着 iOS 5.1 的发布,它似乎已得到修复。

感谢@Cyril 对此的确认。

【讨论】:

以上是关于MPMoviePlayerController 在后台播放airPlay,双击主页按钮时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MPMoviePlayerController 上处理多个 SRT 文件

在 MPMoviePlayerController 上执行捏合手势时屏幕黑屏

在 UITableViewCell 中嵌入 MPMoviePlayerController

MPMoviePlayerController 在影片结尾更改控件样式

后台的 MPMoviePlayerController / AVAudioSession 在来电后不会重新开始播放

MPMoviePlayerController 在启动前显示空白屏幕?