iOS开发:解决'seek(to:)'已弃用及SIGTERM报错问题
解决iOS背景视频循环播放的两个问题:弃用API与SIGTERM错误
先帮你解决第一个弃用API的问题:
你看到的seek(to:)在iOS 11.0后弃用的提示完全正确,针对AVPlayerItem,你需要改用带回调的seek(to:completionHandler:)方法——哪怕不需要处理完成后的逻辑,也要传nil作为回调参数。修改你的videoDidPlayToEnd方法:
@objc func videoDidPlayToEnd(_ notification: Notification) { guard let playerItem = notification.object as? AVPlayerItem else { return } playerItem.seek(to: CMTime.zero, completionHandler: nil) }
这里我加了guard let做安全解包,比你原来的as!强制转换更稳妥,能避免因类型不匹配导致的崩溃。
接下来是Thread 1: signal SIGTERM和白屏问题:
重启没用其实很正常,这个问题和你代码里的两个关键疏漏有关:
- 你完全没调用
setupView()方法!viewDidLoad里没有触发视频初始化逻辑,模拟器白屏是因为视频根本没被加载。 AVPlayer是setupView()里的局部变量,方法执行完后会被ARC自动释放,视频刚要播放就被销毁,这直接引发了异常错误。
你需要做这两个核心修改:
- 把
AVPlayer声明为ViewController的类属性,让它能被长期持有:
class ViewController: UIViewController { @IBOutlet weak var videoView: UIView! // 新增类属性持有player,避免被自动释放 private var player: AVPlayer? // ... 其他原有代码 }
- 修改
setupView()方法,把player赋值给类属性,并且在viewDidLoad里调用初始化方法:
override func viewDidLoad() { super.viewDidLoad() setupView() // 调用视频初始化逻辑 } private func setupView() { guard let path = Bundle.main.path(forResource: "Cafe Video", ofType: "mov") else { print("视频文件找不到,请检查文件名和格式!") return } let url = URL(fileURLWithPath: path) player = AVPlayer(url: url) // 赋值给类属性 guard let player = player else { return } let newLayer = AVPlayerLayer(player: player) newLayer.frame = videoView.bounds // 用bounds替代frame,适配视图大小变化 newLayer.videoGravity = .resizeAspectFill videoView.layer.addSublayer(newLayer) player.play() player.actionAtItemEnd = .none // 用系统常量注册通知,避免手动写字符串出现拼写错误 NotificationCenter.default.addObserver(self, selector: #selector(videoDidPlayToEnd(_:)), name: .AVPlayerItemDidPlayToEndTime, object: player.currentItem) }
另外还有个小优化:建议在控制器销毁时移除通知观察者,避免内存泄漏:
deinit { NotificationCenter.default.removeObserver(self) }
把这些修改整合后,你的视频就能正常循环播放,SIGTERM错误和白屏问题也会随之解决。
内容的提问来源于stack exchange,提问作者Peter H
相关产品推荐
相关产品推荐

