如何在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
相关产品推荐
相关产品推荐

