SwiftUI中VideoPlayer搭配播放控制器实现自动播放的问题求助
问题核心原因
- 你在自定义的
VideoPlayer(UIViewControllerRepresentable实现)的makeUIViewController方法中创建了局部AVPlayer实例,没有将这个实例赋值给外部传入的@Binding类型的player变量,导致父视图VideoView中@State定义的player始终是初始的空实例,onAppear里调用的player.play()根本没有作用在实际播放视频的实例上。 - 自定义结构体和SwiftUI原生的
VideoPlayer重名,容易产生命名冲突,建议重命名避免后续问题。
修复后的代码
第一步:修改自定义视频控制器实现
import AVKit import AVFoundation // 改名避免和SwiftUI原生VideoPlayer冲突 struct CustomAVPlayerViewController : UIViewControllerRepresentable { var wrkflw: Wrkflw @Binding var player : AVPlayer func makeUIViewController(context: Context) -> UIViewController { // 直接给绑定的player赋值,不要创建局部实例 player = AVPlayer(url: wrkflw.wrkvideo) let controller = AVPlayerViewController() controller.player = player controller.showsPlaybackControls = true controller.exitsFullScreenWhenPlaybackEnds = true controller.allowsPictureInPicturePlayback = true return controller } func updateUIViewController(_ uiViewController: UIViewController, context: Context) { // 如果后续需要支持wrkflw变化更新视频,可以在这里加更新逻辑 guard let controller = uiViewController as? AVPlayerViewController else { return } if controller.player?.currentItem?.asset as? AVURLAsset != AVURLAsset(url: wrkflw.wrkvideo) { player = AVPlayer(url: wrkflw.wrkvideo) controller.player = player } } }
第二步:修改父视图调用部分
struct VideoView: View { // MARK: - PROPERTIES @Binding var videoView: Bool @State var player = AVPlayer() @State var isplaying = true @State var showcontrols = true var allowsPictureInPicturePlayback : Bool = true var wrkflw: Wrkflw // MARK: - BODY var body: some View { // 使用改名后的自定义控制器 CustomAVPlayerViewController(wrkflw: wrkflw, player: $player) .edgesIgnoringSafeArea(.all) .onAppear { // 此时player已经是实际绑定的播放实例,调用play生效 player.play() } } }
额外注意事项
- 确保你的
Wrkflw结构体中的wrkvideo属性是有效的URL类型,本地视频要确认路径正确,网络视频要确认App已配置网络权限。 - 如果需要支持后台播放、音频静音时仍能播放视频声音,需要在项目的
Signing & Capabilities中添加Background Modes权限,勾选Audio, AirPlay, and Picture in Picture。
内容的提问来源于stack exchange,提问作者Antonioknoxx
相关产品推荐
相关产品推荐

