You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 10:09:03