W większości przypadków użycia pakietu IMA SDK wystarczy zarządzać tylko 1 żądaniem reklamy naraz. Niektóre przypadki użycia, np. wstępne wczytywanie danych reklamy przed wybraniem filmu przez użytkownika, mogą jednak wymagać wysyłania wielu żądań jednocześnie. Żądania reklam są wysyłane asynchronicznie, więc zapewnienie, że odpowiedni menedżer reklam jest powiązany z właściwym kontekstem, może wydawać się trudnym zadaniem.
Aby uprościć proces rozróżniania wielu usług Ad Managera, pakiet IMA SDK na iOS umożliwia wydawcom przekazywanie dowolnej wartości lub obiektu do pola UserContext w dowolnym żądaniu reklamy. Tę wartość lub ten obiekt można następnie pobrać w funkcji delegata AdsLoader:AdsLoadedWithData za pomocą atrybutu userContext obiektu IMAAdsLoadedData.
Przykład
...
adsLoader = IMAAdsLoader(settings: nil)
adsLoader.delegate = self
let userContextA = {id: "Request A", element: videoElementA}
let userContextB = {id: "Request B", element: videoElementB}
let requestA = IMAAdsRequest(
adTagUrl: ViewController.AdTagURLString,
adDisplayContainer: adDisplayContainer,
contentPlayhead: contentPlayhead,
userContext: userContextA)
let requestB = IMAAdsRequest(
adTagUrl: ViewController.AdTagURLString,
adDisplayContainer: adDisplayContainer,
contentPlayhead: contentPlayhead,
userContext: userContextB)
adsLoader.requestAds(with: requestA)
adsLoader.requestAds(with: requestB)
...
// MARK: - IMAAdsLoaderDelegate
func adsLoader(_ loader: IMAAdsLoader!, adsLoadedWith adsLoadedData: IMAAdsLoadedData!) {
let userContext = adsLoadedData.userContext
print("Loaded ads for ID: " + userContext.id)
adsManager = adsLoadedData.adsManager
adsManager.initialize(with: nil)
}
func adsLoader(_ loader: IMAAdsLoader!, failedWith adErrorData: IMAAdLoadingErrorData!) {
let userContext = adsLoadingErrorData.userContext
print("Error loading ads for ID: " + userContext.id)
}
...