241 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Swift
		
	
	
		
		
			
		
	
	
			241 lines
		
	
	
		
			8.7 KiB
		
	
	
	
		
			Swift
		
	
	
|  | // GuruMaxAdsSdk.swift | ||
|  | // Main SDK class for MAX integration | ||
|  | // Corresponds to GuruMaxAdsSdk.kt in Android implementation | ||
|  | 
 | ||
|  | import UIKit | ||
|  | import AppLovinSDK | ||
|  | import DTBiOSSDK | ||
|  | import GuruConsent | ||
|  | import FBAudienceNetwork | ||
|  | import OpenWrapSDK | ||
|  | import InMobiSDK | ||
|  | import TradPlusAds | ||
|  | import MobileFuseSDK | ||
|  | 
 | ||
|  | public class GuruMaxAdsSdk: GuruAdsSdk { | ||
|  |      | ||
|  |     private static var instance: GuruMaxAdsSdk? | ||
|  |     private var initialized = false | ||
|  |      | ||
|  |     private static var interstitialAds: [String: GuruMaxInterstitialAd] = [:] | ||
|  |     private static var rewardedAds: [String: GuruMaxRewardedAd] = [:] | ||
|  |     private static var bannerAds: [String: GuruMaxBannerAd] = [:] | ||
|  |     private static var mrecAds: [String: GuruMaxMRecAd] = [:] | ||
|  |      | ||
|  |     private let viewController: UIViewController | ||
|  |      | ||
|  |     private init(viewController: UIViewController) { | ||
|  |         self.viewController = viewController | ||
|  |     } | ||
|  |      | ||
|  |     public static func obtain(viewController: UIViewController) -> GuruAdsSdk { | ||
|  |         if let existingInstance = instance { | ||
|  |             return existingInstance | ||
|  |         } | ||
|  |          | ||
|  |         let newInstance = GuruMaxAdsSdk(viewController: viewController) | ||
|  |         instance = newInstance | ||
|  |         return newInstance | ||
|  |     } | ||
|  |      | ||
|  |     private func logDebug(_ message: String) { | ||
|  |         Logger.d(tag: "GuruMaxAdsSdk", message: message) | ||
|  |     } | ||
|  |      | ||
|  |     private func logInfo(_ message: String) { | ||
|  |         Logger.i(tag: "GuruMaxAdsSdk", message: message) | ||
|  |     } | ||
|  |      | ||
|  |     private func logWarn(_ message: String) { | ||
|  |         Logger.w(tag: "GuruMaxAdsSdk", message: message) | ||
|  |     } | ||
|  |      | ||
|  |     public var adPlatform: AdPlatform { | ||
|  |         return AdPlatform.max | ||
|  |     } | ||
|  |      | ||
|  |     public func initialize(adsProfile: AdsProfile) async -> Bool { | ||
|  |         return await internalInitialize(adsProfile: adsProfile) | ||
|  | //        return true | ||
|  |     } | ||
|  |      | ||
|  |     private func internalInitialize(adsProfile: AdsProfile) async -> Bool { | ||
|  |         guard !initialized else { | ||
|  |             logWarn("SDK already initialized! Ignoring.") | ||
|  |             return false | ||
|  |         } | ||
|  |          | ||
|  |         guard !adsProfile.maxSdkKey.isEmpty else { | ||
|  |             logWarn("maxSdkKey is empty") | ||
|  |             return false | ||
|  |         } | ||
|  |          | ||
|  |         initialized = true | ||
|  |          | ||
|  |         // Initialize Amazon SDK if needed | ||
|  |         if let amazonAppId = adsProfile.amazonAppId, !amazonAppId.isEmpty { | ||
|  |             // In a real implementation, you would initialize Amazon SDK here | ||
|  |             logInfo("Would initialize Amazon SDK with ID: \(amazonAppId)") | ||
|  |         } | ||
|  |          | ||
|  |         // Configure PubMatic if needed | ||
|  |         if let pubmaticStoreUrl = adsProfile.pubmaticStoreUrl, !pubmaticStoreUrl.isEmpty { | ||
|  |             // In a real implementation, you would configure PubMatic here | ||
|  |             logInfo("Would configure PubMatic with store URL: \(pubmaticStoreUrl)") | ||
|  |         } | ||
|  |         let amazonAppId = adsProfile.amazonAppId ?? "" | ||
|  |         if (!amazonAppId.isEmpty) { | ||
|  |             DTBAds.sharedInstance().setAppKey(amazonAppId) | ||
|  |             DTBAds.sharedInstance().setAdNetworkInfo(DTBAdNetworkInfo.init(networkName: DTBADNETWORK_MAX)) | ||
|  |             DTBAds.sharedInstance().mraidCustomVersions = ["1.0", "2.0", "3.0"] | ||
|  |             DTBAds.sharedInstance().mraidPolicy = CUSTOM_MRAID | ||
|  |             DTBAds.sharedInstance().useGeoLocation = true | ||
|  |              | ||
|  |             if (adsProfile.debugMode) { | ||
|  |                 DTBAds.sharedInstance().setLogLevel(DTBLogLevelAll) | ||
|  |             } | ||
|  |             //            DTBAds.sharedInstance().testMode = true | ||
|  |         } | ||
|  |          | ||
|  |         // Update UID2 token if available | ||
|  |         if let uid2Token = adsProfile.uid2Token { | ||
|  |             updateUid2Token(uid2Token) | ||
|  |         } | ||
|  |          | ||
|  |         if(!(adsProfile.pubmaticStoreUrl?.isEmpty ?? true)){ | ||
|  |             let appInfo = POBApplicationInfo() | ||
|  |             appInfo.storeURL = URL(string: adsProfile.pubmaticStoreUrl!)! | ||
|  |             OpenWrapSDK.setApplicationInfo(appInfo) | ||
|  |         } | ||
|  |          | ||
|  |         let maxSdkKey = adsProfile.maxSdkKey | ||
|  |         NSLog("===> [\(ALMediationProviderMAX)]maxSdkKey: \(maxSdkKey)") | ||
|  |         let initConfig = ALSdkInitializationConfiguration(sdkKey: maxSdkKey) { builder in | ||
|  |             builder.mediationProvider = ALMediationProviderMAX | ||
|  |             let segments = adsProfile.segments.segments | ||
|  |             if(!segments.isEmpty) { | ||
|  |                 builder.segmentCollection = MASegmentCollection { segmentsBuilder in | ||
|  |                     for seg in segments { | ||
|  |                         if (seg.key <= 0 || seg.values.isEmpty) { | ||
|  |                             continue | ||
|  |                         } | ||
|  |                         segmentsBuilder.add(MASegment(key: NSNumber(value: seg.key), values: seg.values.map { | ||
|  |                             NSNumber(value: $0) | ||
|  |                         })) | ||
|  |                         NSLog("segment.key:\(seg.key) \(seg.values)") | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |          | ||
|  |         // Initialize the AppLovin SDK | ||
|  |         let sdk = ALSdk.shared() | ||
|  |          | ||
|  |         // Set user ID if available | ||
|  |         if !adsProfile.userId.isEmpty { | ||
|  |             sdk.settings.userIdentifier = adsProfile.userId | ||
|  |             logDebug("Set userId \(adsProfile.userId) success") | ||
|  |         } else { | ||
|  |             logDebug("userId is null") | ||
|  |         } | ||
|  |          | ||
|  |         // Set custom parameters | ||
|  |         sdk.settings.isVerboseLoggingEnabled = adsProfile.debugMode | ||
|  |         sdk.settings.isMuted = true | ||
|  |         sdk.settings.setExtraParameterForKey("enable_black_screen_fixes", value: "true") | ||
|  |          | ||
|  |         return await withCheckedContinuation(isolation: MainActor.shared) { continuation in | ||
|  |             // Initialize AppLovin SDK | ||
|  |             do { | ||
|  |                 sdk.initialize(with: initConfig){ [weak self] configuration in | ||
|  |                     guard let self = self else { | ||
|  |                         continuation.resume(returning: false) | ||
|  |                         return | ||
|  |                     } | ||
|  |                      | ||
|  |                     self.logDebug("AppLovinSdk initialized successfully") | ||
|  |                      | ||
|  |                     // Initialize TP Creative Key if needed | ||
|  |                     if !adsProfile.tpCreativeKey.isEmpty { | ||
|  |                         DispatchQueue.main.async { | ||
|  |                             self.logWarn("tpCreativeKey \(adsProfile.tpCreativeKey)") | ||
|  |                             // In a real implementation, you would initialize GuardManager here | ||
|  |                         } | ||
|  |                     } | ||
|  |                     continuation.resume(returning: true) | ||
|  |                 } | ||
|  |             } catch { | ||
|  |                 continuation.resume(returning: false) | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  |      | ||
|  |     private func updateUid2Token(_ uid2Token: String?) { | ||
|  |         guard let uid2Token = uid2Token, !uid2Token.isEmpty else { return } | ||
|  |          | ||
|  |         // In a real implementation, you would set the UID2 token to various ad networks | ||
|  |         logDebug("Set uid2Token success \(uid2Token)") | ||
|  |          | ||
|  |         // Define UID2 API constant | ||
|  |         let UID2_API = "uidapi.com" | ||
|  |          | ||
|  |         // Update for InMobi | ||
|  |         let jsonObject = ["uidapi.com": uid2Token] | ||
|  |         // In a real implementation, you would use this with InMobiSdk | ||
|  |          | ||
|  |         // Update for PubMatic | ||
|  |         // In a real implementation, you would use this with PubMatic SDK | ||
|  |          | ||
|  |         // Update for TradPlus | ||
|  |         // In a real implementation, you would use this with TradPlus SDK | ||
|  |          | ||
|  |         // Update for MobileFuse | ||
|  |         // In a real implementation, you would use this with MobileFuse SDK | ||
|  |     } | ||
|  |      | ||
|  |     public func obtainInterstitialAd(adConfig: AdConfig) -> GuruInterstitialAd { | ||
|  |         if let existingAd = Self.interstitialAds[adConfig.cacheKey] { | ||
|  |             return existingAd | ||
|  |         } | ||
|  |          | ||
|  |         let newAd = GuruMaxInterstitialAd(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 = GuruMaxRewardedAd(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 = GuruMaxBannerAd(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 = GuruMaxMRecAd(viewController: viewController, adConfig: adConfig) | ||
|  |         Self.mrecAds[adConfig.cacheKey] = newAd | ||
|  |         return newAd | ||
|  |     } | ||
|  |      | ||
|  |     public func processCrossAction(action: AdsCrossAction) -> Bool { | ||
|  |         // Implement cross-platform actions as needed | ||
|  |         return true | ||
|  |     } | ||
|  | } |