141 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Swift
		
	
	
		
		
			
		
	
	
			141 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Swift
		
	
	
|  | // | ||
|  | //  GuruIronSourceAdsSdk.swift | ||
|  | //  Pods | ||
|  | // | ||
|  | //  Created by 250102 on 2025/5/6. | ||
|  | // | ||
|  | import IronSource | ||
|  | 
 | ||
|  | public class GuruIronSourceAdsSdk: GuruAdsSdk { | ||
|  |      | ||
|  |     private static var instance: GuruIronSourceAdsSdk? | ||
|  | 
 | ||
|  |      | ||
|  |     public var adPlatform: AdPlatform { | ||
|  |         return AdPlatform.ironSource | ||
|  |     } | ||
|  |      | ||
|  |     private var initialized = false | ||
|  |      | ||
|  |     private static var interstitialAds: [String: GuruInterstitialAd] = [:] | ||
|  |     private static var rewardedAds: [String: GuruRewardedAd] = [:] | ||
|  |     private static var bannerAds: [String: GuruBannerAd] = [:] | ||
|  |     private static var mrecAds: [String: GuruMRecAd] = [:] | ||
|  |      | ||
|  |     private func logDebug(_ message: String) { | ||
|  |         Logger.d(tag: "GuruIronSourceAdsSdk", message: message) | ||
|  |     } | ||
|  |      | ||
|  |     private func logInfo(_ message: String) { | ||
|  |         Logger.i(tag: "GuruIronSourceAdsSdk", message: message) | ||
|  |     } | ||
|  |      | ||
|  |     private func logWarn(_ message: String) { | ||
|  |         Logger.w(tag: "GuruIronSourceAdsSdk", message: message) | ||
|  |     } | ||
|  |      | ||
|  |     private func logError(_ message: String) { | ||
|  |         Logger.e(tag: "GuruIronSourceAdsSdk", message: message) | ||
|  |     } | ||
|  |      | ||
|  |     private let viewController: UIViewController | ||
|  |      | ||
|  |     private let impressionDataDispatcher = GuruIronSourceImpressionDataDispatcher() | ||
|  |      | ||
|  |     private init(viewController: UIViewController) { | ||
|  |         self.viewController = viewController | ||
|  |     } | ||
|  |      | ||
|  |     public static func obtain(viewController: UIViewController) -> GuruAdsSdk { | ||
|  |         if let existingInstance = instance { | ||
|  |             return existingInstance | ||
|  |         } | ||
|  |          | ||
|  |         let newInstance = GuruIronSourceAdsSdk(viewController: viewController) | ||
|  |         instance = newInstance | ||
|  |         return newInstance | ||
|  |     } | ||
|  |      | ||
|  |     public func initialize(adsProfile: AdsProfile) async -> Bool { | ||
|  |         guard !initialized else { | ||
|  |             logWarn("SDK already initialized! Ignoring.") | ||
|  |             return false | ||
|  |         } | ||
|  |                  | ||
|  |         if(adsProfile.ironSourceSdkKey?.isEmpty != false) { | ||
|  |             logError("ironSourceSdkKey is empty, unable to initialize") | ||
|  |             return false; | ||
|  |         } | ||
|  |          | ||
|  |         initialized = true | ||
|  |          | ||
|  |         if(adsProfile.debugMode) { | ||
|  |             IronSource.setMetaDataWithKey("is_test_suite", value: "enable") | ||
|  |             ISIntegrationHelper.validateIntegration() | ||
|  |         } | ||
|  |         IronSource.add(impressionDataDispatcher) | ||
|  |         return await withCheckedContinuation(isolation: MainActor.shared) { continuation in | ||
|  |              | ||
|  |             let requestBuilder = LPMInitRequestBuilder(appKey: adsProfile.ironSourceSdkKey!) | ||
|  |                 .withUserId(adsProfile.userId) | ||
|  |              | ||
|  |             let initRequest = requestBuilder.build() | ||
|  |              | ||
|  |             LevelPlay.initWith(initRequest) | ||
|  |             { config, error in | ||
|  |                 if let error = error { | ||
|  |                     self.logError("initialize failed, \(error)") | ||
|  |                     continuation.resume(returning: false) | ||
|  |                 } else { | ||
|  |                     continuation.resume(returning: true) | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  |      | ||
|  |     public func obtainInterstitialAd(adConfig: AdConfig) -> GuruInterstitialAd { | ||
|  |         if let existingAd = Self.interstitialAds[adConfig.cacheKey] { | ||
|  |             return existingAd | ||
|  |         } | ||
|  |          | ||
|  |         let newAd = GuruIronSourceInterstitialAd(viewController: viewController, adConfig: adConfig) | ||
|  |         Self.interstitialAds[adConfig.cacheKey] = newAd | ||
|  |         return newAd | ||
|  |     } | ||
|  |      | ||
|  |     public func obtainRewardedAd(adConfig: AdConfig) -> GuruRewardedAd { | ||
|  |         if let existingAd = Self.rewardedAds[adConfig.cacheKey] { | ||
|  |             return existingAd | ||
|  |         } | ||
|  |          | ||
|  |         let newAd = GuruIronSourceRewardedAd(viewController: viewController, adConfig: adConfig) | ||
|  |         Self.rewardedAds[adConfig.cacheKey] = newAd | ||
|  |         return newAd | ||
|  |     } | ||
|  |      | ||
|  |     public func obtainBannerAd(adConfig: AdConfig) -> GuruBannerAd { | ||
|  |         if let existingAd = Self.bannerAds[adConfig.cacheKey] { | ||
|  |             return existingAd | ||
|  |         } | ||
|  |          | ||
|  |         let newAd = GuruIronSourceBannerAd(viewController: viewController, adConfig: adConfig) | ||
|  |         Self.bannerAds[adConfig.cacheKey] = newAd | ||
|  |         return newAd | ||
|  |     } | ||
|  |      | ||
|  |     public func obtainMRecAd(adConfig: AdConfig) -> GuruMRecAd { | ||
|  |         if let existingAd = Self.mrecAds[adConfig.cacheKey] { | ||
|  |             return existingAd | ||
|  |         } | ||
|  |          | ||
|  |         let newAd = GuruIronSourceMRecAd(viewController: viewController, adConfig: adConfig) | ||
|  |         Self.mrecAds[adConfig.cacheKey] = newAd | ||
|  |         return newAd | ||
|  |     } | ||
|  |      | ||
|  |     public func processCrossAction(action: AdsCrossAction) -> Bool { | ||
|  |         return false | ||
|  |     } | ||
|  |      | ||
|  | } |