Search code examples
swiftavfoundationavplayer

AVPlayer playing protected HLS, how to update token when it expires?


Im playing the protected HLS streams and my token expires in 5 minutes, so each time stream drops when token expires and I'm getting an error 401 Unauthorized. Question is how to update the token inside asset? I've already tried to change it in resourceLoader loadingRequest.allHTTPHeaderFields but it didn't help:

  func resourceLoader(_ resourceLoader: AVAssetResourceLoader,
                            shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -> Bool {
        
DispatchQueue.main.async { [unowned self] in
                var request = loadingRequest.request
                let service = apiService as! APIServiceImplementation
                
                service.networkService.resfreshToken { result in
                    let data = apiService.prepareForLiveRequest(url: request.url!)
                    request.url = data.url
                    var mergedHeaders = request.allHTTPHeaderFields
                    mergedHeaders!["Cookie"] = (data.1.values.first! as! [String: String])["Cookie"]
                    request.allHTTPHeaderFields = mergedHeaders
                    URLSession(configuration: URLSessionConfiguration.default).dataTask(with: request) {
                        data, response, error in
                        if let error = error {
                            print(error)
                            loadingRequest.finishLoading(with: error)
                        } else {
                            loadingRequest.dataRequest?.respond(with: data!)
                            loadingRequest.finishLoading()
                        }
                    }.resume()
                }
            }
            return true
        }

Solution

  • There is no way to update AVAsset inside AVPlayerItem, the only thing you can do is to use local server, good example is https://cocoapods.org/pods/HLSCachingReverseProxyServer