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

如何在Swift中使用AVPlayer播放带令牌的重定向视频链接

处理AVPlayer中带302重定向的视频链接播放问题

针对AVPlayer无法正确处理带身份令牌的302重定向问题,有两种可行的解决思路:

方法一:提前手动获取重定向后的最终URL

直接用URLSession发起请求,手动跟进重定向流程,拿到附带令牌的最终播放链接,再传给AVPlayer初始化。

示例代码:

func getFinalPlayURL(originalURL: URL, completion: @escaping (URL?) -> Void) {
    let session = URLSession(configuration: .default)
    let task = session.dataTask(with: originalURL) { _, response, error in
        guard let httpResp = response as? HTTPURLResponse,
              let finalURL = httpResp.url else {
            completion(nil)
            return
        }
        completion(finalURL)
    }
    task.resume()
}

// 使用方式
let originalVideoURL = URL(string: "http://video.vod.testing.ts")!
getFinalPlayURL(originalURL: originalVideoURL) { finalURL in
    guard let url = finalURL else { return }
    let player = AVPlayer(url: url)
    // 后续播放逻辑
}

方法二:用AVAssetResourceLoader拦截处理重定向

如果需要持续处理重定向(比如令牌可能过期需要重新获取),可以通过自定义资源加载代理,拦截AVPlayer的请求并手动处理重定向逻辑。

示例代码:

class VideoResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate {
    func resourceLoader(_ resourceLoader: AVAssetResourceLoader, shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -> Bool {
        guard let requestURL = loadingRequest.request.url else { return false }
        
        let session = URLSession(configuration: .default)
        let task = session.dataTask(with: requestURL) { data, response, error in
            defer { loadingRequest.finishLoading() }
            
            guard let httpResp = response as? HTTPURLResponse,
                  let finalURL = httpResp.url,
                  let responseData = data else {
                loadingRequest.finishLoading(with: error, data: nil)
                return
            }
            
            // 更新请求为重定向后的URL
            let redirectedRequest = URLRequest(url: finalURL)
            loadingRequest.redirect = redirectedRequest
            loadingRequest.dataRequest?.respond(with: responseData)
        }
        task.resume()
        return true
    }
}

// 使用方式
let originalVideoURL = URL(string: "http://video.vod.testing.ts")!
let resourceDelegate = VideoResourceLoaderDelegate()
let videoAsset = AVURLAsset(url: originalVideoURL)
videoAsset.resourceLoader.setDelegate(resourceDelegate, queue: DispatchQueue.main)
let playerItem = AVPlayerItem(asset: videoAsset)
let player = AVPlayer(playerItem: playerItem)
// 后续播放逻辑

注意事项

  • 如果请求需要自定义HTTP头(比如身份验证信息),要在URLSession的请求中添加对应的Header字段
  • 若重定向后的令牌有有效期,方法二更适合,能在每次请求时重新获取有效链接
  • 若重定向到HTTPS链接,需确保App的ATS配置允许目标域名

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 07:33:30