Swift iOS - 当应用程序从后台返回时,AVPlayer 视频冻结暂停

作者:编程家 分类: swift 时间:2025-06-11

在Swift iOS开发中,当我们的应用程序从后台返回到前台时,经常会遇到AVPlayer视频冻结或暂停的问题。这个问题可能会对用户体验产生负面影响,因此我们需要找到解决办法来确保视频在返回到前台时能够继续播放。

问题的原因

AVPlayer视频冻结或暂停的问题通常是由于应用程序在返回到前台时被系统挂起导致的。当应用程序被挂起时,系统会停止所有正在进行的任务,包括视频播放。因此,当应用程序重新激活时,AVPlayer会停止播放视频并显示冻结画面。

解决方案

为了解决AVPlayer视频冻结或暂停的问题,我们可以通过监听应用程序从后台返回的通知来重新启动视频播放。具体步骤如下:

1. 首先,在需要播放视频的ViewController中,添加以下代码来注册通知:

swift

override func viewDidLoad() {

super.viewDidLoad()

NotificationCenter.default.addObserver(self, selector: #selector(appDidBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil)

}

2. 然后,在ViewController中添加以下方法来处理应用程序从后台返回的逻辑:

swift

@objc func appDidBecomeActive() {

// 判断当前是否正在播放视频

if player.rate == 0 {

// 如果视频已经暂停,则重新播放

player.play()

}

}

3. 最后,在ViewController的deinit方法中,记得移除通知的观察者:

swift

deinit {

NotificationCenter.default.removeObserver(self)

}

案例代码

下面是一个简单的示例代码,演示了如何使用以上解决方案来解决AVPlayer视频冻结或暂停的问题:

swift

import UIKit

import AVFoundation

class ViewController: UIViewController {

var player: AVPlayer!

override func viewDidLoad() {

super.viewDidLoad()

// 初始化AVPlayer

let videoURL = Bundle.main.url(forResource: "video", withExtension: "mp4")

player = AVPlayer(url: videoURL!)

// 创建AVPlayerLayer来显示视频

let playerLayer = AVPlayerLayer(player: player)

playerLayer.frame = view.bounds

view.layer.addSublayer(playerLayer)

// 注册通知

NotificationCenter.default.addObserver(self, selector: #selector(appDidBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil)

}

override func viewDidAppear(_ animated: Bool) {

super.viewDidAppear(animated)

// 开始播放视频

player.play()

}

@objc func appDidBecomeActive() {

// 判断当前是否正在播放视频

if player.rate == 0 {

// 如果视频已经暂停,则重新播放

player.play()

}

}

deinit {

// 移除通知的观察者

NotificationCenter.default.removeObserver(self)

}

}

通过以上的解决方案,我们可以确保当应用程序从后台返回到前台时,AVPlayer视频能够继续播放,从而提升用户体验。希望本文对解决AVPlayer视频冻结或暂停的问题有所帮助。