这是挺早之前碰到的一个问题,记在Evernote没写出来,今天空了出来闲翻之前笔记时看到了就写到这里。
播放相册视频崩溃
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'An AVPlayerItem cannot be associated with more than one instance of AVPlayer'
场景是这样:当前列表页展示相册里的照片和视频,tap列表里的某个视频进入下一级详情页,详情页面用AVPlayerItem创建一个AVPlayer对象,用AVPlayerViewControler播放相册视频,开始播放后点击返回上一级列表页,再点击这个视频进入详情页播放,闪退;假如我返回列表页换一个视频进入详情页播放,正常播放。AVPlayerItem对象是在列表页创建然后属性传进详情页,AVPlayer对象是在详情页创建的。崩溃信息就是上面的
'*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'An AVPlayerItem cannot be associated with more than one instance of AVPlayer'。
看崩溃信息字面意思就是一个AVPlayerItem对象不能被放在不同的AVPlayer对象上播放。对应我的场景也确实是这样,一个AVPlayerItem对象被不同的AVPlayer对象持有了。问题来了,AVPlayerItem对象是在列表页创建的,在这个场景下始终没有被释放,AVPlayer对象是在详情页创建的,每次返回列表页AVPlayer对象都已经被释放了,却依然出现崩溃,猜测是AVPlayerItem对象依然被隐性持有着。这个问题在iOS 11.0以后的设备上没有复现(我测试了2台11.0以后的设备),在11.0之前的系统必现(测试了3台11.0之前的设备),所以苹果可能在11.0系统修复了这个bug。
我搜了下这个bug,回复基本上都是套用这个提问的回答,大致都是MPMoviePlayerViewController的使用场景,我的问题是AVPlayerViewControler(iOS 8.0之后available)的使用场景。
我解决这个问题的办法是把AVPlayer对象的创建也放在列表页,通过属性传进详情页,利用改变业务逻辑的方式替代。