// // GuruIronSourceImpressionDataDispatcher.swift // Pods // // Created by 250102 on 2025/5/12. // import IronSource internal protocol GuruIronSourceImpressionDataListenerRegistrar { func register(adUnitId: String, listener: ISImpressionDataDelegate) func unregister(listener: ISImpressionDataDelegate) } internal class GuruIronSourceImpressionDataDispatcher : NSObject, ISImpressionDataDelegate, GuruIronSourceImpressionDataListenerRegistrar { func impressionDataDidSucceed(_ impressionData: ISImpressionData?) { guard let data = impressionData else { return } dispatchImpressionData(data: data) } private var listeners: [(String, any ISImpressionDataDelegate)] = [] private func dispatchImpressionData(data: ISImpressionData) { listeners.forEach { let adUnitId = $0.0 let listener = $0.1 if (adUnitId == data.mediation_ad_unit_id) { listener.impressionDataDidSucceed(data) } } } func register( adUnitId: String, listener: ISImpressionDataDelegate ) { listeners.append((adUnitId, listener)) } func unregister(listener: ISImpressionDataDelegate) { listeners.removeAll { $0.1 === listener } } } internal class IronSourceImpressedFusionAd: FusionAd { private let impressionData: ISImpressionData init(engineId: Int, adType: AdType, impressionData: ISImpressionData) { self.impressionData = impressionData super.init(engineId: engineId, adType: adType) } override public var adPlatform: AdPlatform { return AdPlatform.ironSource } override public var adUnitId: String? { return impressionData.mediation_ad_unit_id } override public var revenue: Double { return impressionData.revenue?.doubleValue ?? 0.0 } override public var waterfallName: String? { return impressionData.auction_id } override public var placement: String? { return impressionData.placement } override public var networkName: String? { return impressionData.ad_network } override public var networkPlacement: String? { return nil } override public var creativeId: String? { return impressionData.creative_id } override public var adReviewCreativeId: String? { return nil } }