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

iOS 17.4真机使用AVPlayer时主线程阻塞问题求助

问题:SwiftUI VideoPlayer加载网络视频触发主线程阻塞警告

环境

  • iOS 17.4
  • iPhone 14 Pro 真机

错误信息

Main thread blocked by synchronous property query on not-yet-loaded property (PreferredTransform) for HTTP(S) asset. This could have been a problem if this asset were being read from a slow network.

触发问题的代码

struct ContentView: View {
    @State var player: AVPlayer = AVPlayer(url: URL(string: "https://video.twimg.com/amplify_video/1760315643142750208/vid/avc1/640x360/-1etorSK7w2g9Nlc.mp4?tag=16")!)

    var body: some View {
        VideoPlayer(player: player)
    }
}

对比情况

使用本地Bundle中的视频初始化AVPlayer不会触发该错误:

AVPlayer(url: Bundle.main.url(forResource: "video", withExtension: "mp4")!)

已尝试的无效方案

在通过AVPlayerItem将资源交给AVPlayer前,使用try await AVAsset.load(_:)加载元数据,问题未解决。

疑问

是否有人遇到同样错误?这是SDK的bug吗?


解决方案与分析

这个警告在iOS 17.x的网络视频加载场景中不少开发者都遇到过,大概率是AVFoundation框架处理网络Asset元数据时的同步查询逻辑问题,属于SDK层面的小瑕疵。

可以试试以下几种规避方法:

  1. 延迟异步初始化AVPlayer
    不要在@State里直接同步初始化网络AVPlayer,改为在视图出现后异步加载元数据再创建:
struct ContentView: View {
    @State private var player: AVPlayer?

    var body: some View {
        if let player {
            VideoPlayer(player: player)
        } else {
            ProgressView()
                .task {
                    let url = URL(string: "https://video.twimg.com/amplify_video/1760315643142750208/vid/avc1/640x360/-1etorSK7w2g9Nlc.mp4?tag=16")!
                    let asset = AVAsset(url: url)
                    do {
                        // 异步加载触发警告的属性
                        let _ = try await asset.load(.preferredTransform)
                        let playerItem = AVPlayerItem(asset: asset)
                        player = AVPlayer(playerItem: playerItem)
                    } catch {
                        print("加载失败:\(error)")
                    }
                }
        }
    }
}
  1. 改用AVPlayerViewController包装
    暂时用UIKit的AVPlayerViewController包装到SwiftUI中,部分开发者反馈这种方式不会触发该警告:
struct VideoPlayerWrapper: UIViewControllerRepresentable {
    let url: URL

    func makeUIViewController(context: Context) -> AVPlayerViewController {
        let player = AVPlayer(url: url)
        let vc = AVPlayerViewController()
        vc.player = player
        return vc
    }

    func updateUIViewController(_ uiViewController: AVPlayerViewController, context: Context) {}
}

// 使用方式
struct ContentView: View {
    var body: some View {
        VideoPlayerWrapper(url: URL(string: "https://video.twimg.com/amplify_video/1760315643142750208/vid/avc1/640x360/-1etorSK7w2g9Nlc.mp4?tag=16")!)
    }
}

目前这个警告不会导致崩溃,但会影响主线程性能(弱网环境下更明显)。苹果大概率会在后续iOS版本中修复该问题,暂时可以用上述方法规避。

内容的提问来源于stack exchange,提问作者mbc

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 19:52:17