287 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Swift
		
	
	
		
		
			
		
	
	
			287 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			Swift
		
	
	
|  | // | |||
|  | //  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 } | |||
|  | } |