// // HappyPathAdsSdk.swift // FusionAds // // Created by 250102 on 2025/3/18. // Copyright © 2025 CocoaPods. All rights reserved. // import FusionAds let queue = DispatchQueue.main /// 只许成功,不许失败 的假广告sdk class HappyPathAdsSdk: GuruAdsSdk { static let shared = HappyPathAdsSdk() public private(set) var ads: [String: Any] = [:] private init() { } public static func obtain(viewController: UIViewController) -> GuruAdsSdk { return shared } public var adPlatform: FusionAds.AdPlatform { return AdPlatform.test } public var adsProfile: FusionAds.AdsProfile? = nil func initialize(adsProfile: FusionAds.AdsProfile) async -> Bool { self.adsProfile = adsProfile return true } func obtainInterstitialAd(adConfig: FusionAds.AdConfig) -> FusionAds.GuruInterstitialAd { let ad = ads[adConfig.adUnitId] as? HappyPathInterstitialAd if(ad != nil) { return ad! } let newAd = HappyPathInterstitialAd(engineId: adConfig.engineId, adUnitId: adConfig.adUnitId, adPlatform: adPlatform) ads[adConfig.adUnitId] = newAd return newAd } func obtainRewardedAd(adConfig: FusionAds.AdConfig) -> FusionAds.GuruRewardedAd { let ad = ads[adConfig.adUnitId] as? HappyPathRewardedAd if(ad != nil) { return ad! } let newAd = HappyPathRewardedAd(engineId: adConfig.engineId, adUnitId: adConfig.adUnitId, adPlatform: adPlatform) ads[adConfig.adUnitId] = newAd return newAd } func obtainBannerAd(adConfig: FusionAds.AdConfig) -> FusionAds.GuruBannerAd { let ad = ads[adConfig.adUnitId] as? HappyPathBannerAd if(ad != nil) { return ad! } let newAd = HappyPathBannerAd(engineId: adConfig.engineId, adUnitId: adConfig.adUnitId, adPlatform: adPlatform) ads[adConfig.adUnitId] = newAd return newAd } func obtainMRecAd(adConfig: FusionAds.AdConfig) -> FusionAds.GuruMRecAd { let ad = ads[adConfig.adUnitId] as? HappyPathMRecAd if(ad != nil) { return ad! } let newAd = HappyPathMRecAd(engineId: adConfig.engineId, adUnitId: adConfig.adUnitId, adPlatform: adPlatform) ads[adConfig.adUnitId] = newAd return newAd } func processCrossAction(action: FusionAds.AdsCrossAction) -> Bool { return false } } class HappyPathInterstitialAd : GuruInterstitialAd { private var ad: HappyPathOriginalAd public private(set) var state: HappyPathAdState = HappyPathAdState() override init(engineId: Int, adUnitId: String, adPlatform: AdPlatform) { ad = HappyPathOriginalAd(adPlatform: adPlatform, adUnitId: adUnitId) super.init(engineId: engineId, adUnitId: adUnitId, adPlatform: adPlatform) } override public func load() -> Bool { state.isLoaded = true let fusionAd = HappyPathFusionAd(engineId: engineId, adType: AdType.Interstitial, originAd: ad) queue.async { [weak self] in self?.listener?.onAdLoaded(ad: fusionAd) } return true; } override public func show(_ request: InterstitialShowRequest? = nil) -> Bool { state.isShown = true ad.placement = request?.placement let fusionAd = HappyPathFusionAd(engineId: engineId, adType: AdType.Interstitial, originAd: ad) queue.async { [weak self] in self?.listener?.onAdDisplayed(ad: fusionAd) } return true; } override public func destroy() -> Bool { state.isDestroyed = true return true; } } class HappyPathRewardedAd : GuruRewardedAd { private var ad: HappyPathOriginalAd public private(set) var state: HappyPathAdState = HappyPathAdState() override init(engineId: Int, adUnitId: String, adPlatform: AdPlatform) { ad = HappyPathOriginalAd(adPlatform: adPlatform, adUnitId: adUnitId) super.init(engineId: engineId, adUnitId: adUnitId, adPlatform: adPlatform) } override public func load() -> Bool { let fusionAd = HappyPathFusionAd(engineId: engineId, adType: AdType.Rewarded, originAd: ad) state.isLoaded = true queue.async { [weak self] in self?.listener?.onAdLoaded(ad: fusionAd) } return true; } override public func show(_ request: RewardedShowRequest? = nil) -> Bool { state.isShown = true ad.placement = request?.placement let fusionAd = HappyPathFusionAd(engineId: engineId, adType: AdType.Rewarded, originAd: ad) queue.async { [weak self] in self?.listener?.onAdDisplayed(ad: fusionAd) } return true; } override public func destroy() -> Bool { state.isDestroyed = true return true; } } class HappyPathBannerAd : GuruBannerAd { private var ad: HappyPathOriginalAd public private(set) var state: HappyPathAdState = HappyPathAdState() public private(set) var lastShowRequest: BannerShowRequest? = nil override init(engineId: Int, adUnitId: String, adPlatform: AdPlatform) { ad = HappyPathOriginalAd(adPlatform: adPlatform, adUnitId: adUnitId) super.init(engineId: engineId, adUnitId: adUnitId, adPlatform: adPlatform) } override public func load() -> Bool { state.isLoaded = true let fusionAd = HappyPathFusionAd(engineId: engineId, adType: AdType.Banner, originAd: ad) queue.async { [weak self] in self?.listener?.onAdLoaded(ad: fusionAd) } return true; } override public func show(_ request: BannerShowRequest? = nil) -> Bool { state.isShown = true lastShowRequest = request ad.placement = request?.placement let fusionAd = HappyPathFusionAd(engineId: engineId, adType: AdType.Banner, originAd: ad) return true; } override func hide() -> Bool { state.isHidden = true return true } override func destroy() -> Bool { state.isDestroyed = true return true } override func updateOrientation(orientation: ScreenOrientation) -> Bool { state.orientation = orientation return true } } class HappyPathMRecAd : GuruMRecAd { private var ad: HappyPathOriginalAd public private(set) var state: HappyPathAdState = HappyPathAdState() public private(set) var lastShowRequest: MRecShowRequest? override init(engineId: Int, adUnitId: String, adPlatform: AdPlatform) { ad = HappyPathOriginalAd(adPlatform: adPlatform, adUnitId: adUnitId) super.init(engineId: engineId, adUnitId: adUnitId, adPlatform: adPlatform) } override public func load() -> Bool { state.isLoaded = true let fusionAd = HappyPathFusionAd(engineId: engineId, adType: AdType.MRec, originAd: ad) queue.async { [weak self] in self?.listener?.onAdDisplayed(ad: fusionAd) } return true; } override public func show(request: MRecShowRequest? = nil) -> Bool { state.isShown = true lastShowRequest = request ad.placement = request?.placement let fusionAd = HappyPathFusionAd(engineId: engineId, adType: AdType.MRec, originAd: ad) return true; } override func hide() -> Bool { state.isHidden = true return true } override func destroy() -> Bool { state.isDestroyed = true return true } override func updateOrientation(orientation: ScreenOrientation) -> Bool { state.orientation = orientation return true } } struct HappyPathAdState { var isLoaded = false var isShown = false var isHidden = false var isDestroyed = false var orientation: ScreenOrientation? = nil } struct HappyPathOriginalAd { let adPlatform: AdPlatform let adUnitId: String var revenue: Double = 0 var waterfallName: String? = nil var placement: String? = nil var networkName: String? = nil var networkPlacement: String? = nil var creativeId: String? = nil var adReviewCreativeId: String? = nil } class HappyPathFusionAd : FusionAd { private let originAd: HappyPathOriginalAd init(engineId: Int, adType: AdType, originAd: HappyPathOriginalAd) { self.originAd = originAd super.init(engineId: engineId, adType: adType) } override var adPlatform: AdPlatform { return originAd.adPlatform } override var adUnitId: String? { return originAd.adUnitId } override var revenue: Double { return originAd.revenue } override var waterfallName: String? { return originAd.waterfallName } override var placement: String? { return originAd.placement } override var networkName: String? { return originAd.networkName } override var networkPlacement: String? { return originAd.networkPlacement } override var creativeId: String? { return originAd.creativeId } override var adReviewCreativeId: String? { return originAd.adReviewCreativeId } }