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