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 }
 | ||
| }
 |