diff --git a/Fableon/Object/Libs/AdManager/Banner/FABannerAdManager.swift b/Fableon/Object/Libs/AdManager/Banner/FABannerAdManager.swift index 010b2a4..fdfac1a 100644 --- a/Fableon/Object/Libs/AdManager/Banner/FABannerAdManager.swift +++ b/Fableon/Object/Libs/AdManager/Banner/FABannerAdManager.swift @@ -24,16 +24,17 @@ import UIKit protocol FABannerAdDelegate: NSObjectProtocol { + func fa_bannerAdDidStartLoad(ad: FABannerAd) ///广告加载失败 - func fa_bannerAd(bannerAd: FABannerAd, didLoadFail error: Error) + func fa_bannerAd(ad: FABannerAd, didLoadFail error: Error) ///广告加载成功 - func fa_bannerAdDidLoadFinish(bannerAd: FABannerAd) + func fa_bannerAdDidLoadFinish(ad: FABannerAd) ///广告被展示 - func fa_bannerAdDidShow(bannerAd: FABannerAd) + func fa_bannerAdDidShow(ad: FABannerAd, adInfo: [AnyHashable : Any]) ///广告展示失败 - func fa_bannerAd(bannerAd: FABannerAd, didDisplayFail error: Error) + func fa_bannerAd(ad: FABannerAd, didDisplayFail error: Error) ///广告被关闭 - func fa_bannerAdDidDismiss(bannerAd: FABannerAd) + func fa_bannerAdDidDismiss(ad: FABannerAd) ///广告被点击 func fa_bannerAdDidClick(ad: FABannerAd) } @@ -50,6 +51,8 @@ protocol FABannerAd: NSObjectProtocol { var adUnitID: String { get } + var networkName: String { get set } + var isReady: Bool { get set } func loadAd() @@ -76,6 +79,12 @@ class FABannerAdManager: NSObject { } } + private var startShowDate: Date? + private var startLoadDate: Date? + private var endLoadDate: Date? + ///广告正在被展示 + private(set) var isShowingAd = false + var isAdAvailable: Bool { if FALogin.manager.userInfo?.user_level == .ad { return bannerAd?.isReady ?? false @@ -84,12 +93,22 @@ class FABannerAdManager: NSObject { } } + deinit { + NotificationCenter.default.removeObserver(self) + } + + override init() { + super.init() + NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackgroundNotification), name: UIApplication.didEnterBackgroundNotification, object: nil) + } + func loadAd() { guard FALogin.manager.userInfo?.user_level == .ad else { let error = NSError(domain: "非广告用户", code: -1) self.delegate?.fa_bannerAdManager?(manager: self, didLoadFail: error) return } + self.cleanAd() let ad = FATradPlusBannerAd() ad.delegate = self @@ -102,6 +121,9 @@ class FABannerAdManager: NSObject { func cleanAd() { self.bannerAd = nil + self.isShowingAd = false + self.startLoadDate = nil + self.endLoadDate = nil } private func updateLayout() { @@ -117,27 +139,43 @@ class FABannerAdManager: NSObject { //MARK: FABannerAdManager extension FABannerAdManager: FABannerAdDelegate { - func fa_bannerAd(bannerAd: any FABannerAd, didDisplayFail error: any Error) { + func fa_bannerAdDidStartLoad(ad: any FABannerAd) { + self.startLoadDate = Date() + self.uploadAdsHistory(ad: ad, type: .startLoad) + } + + func fa_bannerAd(ad: any FABannerAd, didDisplayFail error: any Error) { + uploadAdsHistory(ad: ad, type: .showFailed, errorMsg: error.localizedDescription) self.delegate?.fa_bannerAdManager?(manager: self, didDisplayFail: error) } - func fa_bannerAd(bannerAd: any FABannerAd, didLoadFail error: any Error) { + func fa_bannerAd(ad: any FABannerAd, didLoadFail error: any Error) { + self.endLoadDate = Date() + uploadAdsHistory(ad: ad, type: .loadFailed, errorMsg: error.localizedDescription) self.delegate?.fa_bannerAdManager?(manager: self, didLoadFail: error) } - func fa_bannerAdDidLoadFinish(bannerAd: any FABannerAd) { + func fa_bannerAdDidLoadFinish(ad: any FABannerAd) { + self.endLoadDate = Date() + self.uploadAdsHistory(ad: ad, type: .endLoad) self.delegate?.fa_bannerAdManagerDidLoadFinish?(manager: self) } - func fa_bannerAdDidShow(bannerAd: any FABannerAd) { + func fa_bannerAdDidShow(ad: any FABannerAd, adInfo: [AnyHashable : Any]) { + self.isShowingAd = true + self.startShowDate = Date() + self.uploadAdsHistory(ad: ad, type: .show, viewSeconds: 0) + self.requestUploadAdsPrice(ad: ad, adInfo: adInfo) self.delegate?.fa_bannerAdManagerDidShow?(manager: self) } - func fa_bannerAdDidDismiss(bannerAd: any FABannerAd) { + func fa_bannerAdDidDismiss(ad: any FABannerAd) { + self.uploadAdsHistory(ad: ad, type: .close) self.delegate?.fa_bannerAdManagerDidDismiss?(manager: self) } func fa_bannerAdDidClick(ad: any FABannerAd) { + self.uploadAdsHistory(ad: ad, type: .click) self.delegate?.fa_bannerAdManagerDidClick?(manager: self) } @@ -147,6 +185,54 @@ extension FABannerAdManager: FABannerAdDelegate { extension FABannerAdManager { + @objc private func didEnterBackgroundNotification() { + if !self.isShowingAd { return } + guard let ad = self.bannerAd else { return } + + self.uploadAdsHistory(ad: ad, type: .interrupt) + } + func uploadAdsHistory(ad: any FABannerAd, type: FAAdManager.StatType, viewSeconds: Int? = nil, errorMsg: String? = nil) { + var loadTime: Int? + if let startDate = self.startLoadDate, let endDate = self.endLoadDate { + loadTime = Int(endDate.timeIntervalSince(startDate)) + } + + var showTime: Int? = viewSeconds + if showTime == nil && (type == .click || type == .interrupt || type == .close) { + if let startShowDate = self.startShowDate { + showTime = Int(Date().timeIntervalSince(startShowDate)) + } + } + + let model = FAAdStatModel() + model.scene = .banner + if let loadTime = loadTime { + model.loading_time = max(0, loadTime) + } + model.view_seconds = showTime + model.ad_type = ad.adType.rawValue + model.ads_id = ad.adUnitID + model.ad_platform_key = ad.adPlatform + model.type = type + model.ag_platform_name = ad.networkName + model.ad_platform_name = ad.adPlatform + + FAStatAPI.requestUploadAdsHistory(model: model) + } + func requestUploadAdsPrice(ad: any FABannerAd, adInfo: [AnyHashable : Any]) { + guard let ecpm = adInfo["ecpm"] as? String else { return } + let money = (NSNumber(string: ecpm)?.doubleValue ?? 0) / 1000 + + let model = FAUploadAdsPriceModel() + model.short_play_launch_id = ad.adUnitID + model.type = ad.adType.rawValue + model.agent_name = ad.adPlatform.rawValue + model.alliance_name = ad.networkName + model.money = "\(money)" + model.scene = .banner + + FAStatAPI.requestUploadAdsPrice(model: model) + } } diff --git a/Fableon/Object/Libs/AdManager/Banner/FATradPlusBannerAd.swift b/Fableon/Object/Libs/AdManager/Banner/FATradPlusBannerAd.swift index f93da65..d1ea01d 100644 --- a/Fableon/Object/Libs/AdManager/Banner/FATradPlusBannerAd.swift +++ b/Fableon/Object/Libs/AdManager/Banner/FATradPlusBannerAd.swift @@ -46,6 +46,8 @@ class FATradPlusBannerAd: NSObject, FABannerAd { return self.adPlatform.bannerUnitId } + var networkName: String = "" + func loadAd() { #if canImport(TradPlusAds) self.bannerView.setAdUnitID(self.adUnitID) @@ -58,23 +60,28 @@ class FATradPlusBannerAd: NSObject, FABannerAd { #if canImport(TradPlusAds) extension FATradPlusBannerAd: TradPlusADBannerDelegate { + func tpBannerAdStartLoad(_ adInfo: [AnyHashable : Any]) { + self.delegate?.fa_bannerAdDidStartLoad(ad: self) + } + func tpBannerAdLoaded(_ adInfo: [AnyHashable : Any]) { self.isReady = true + self.networkName = (adInfo["adNetworkName"] as? String) ?? "unknown" debugLog("+++++++++++广告加载成功") - self.delegate?.fa_bannerAdDidLoadFinish(bannerAd: self) + self.delegate?.fa_bannerAdDidLoadFinish(ad: self) } func tpBannerAdLoadFailWithError(_ error: any Error) { - self.delegate?.fa_bannerAd(bannerAd: self, didLoadFail: error) + self.delegate?.fa_bannerAd(ad: self, didLoadFail: error) } func tpBannerAdImpression(_ adInfo: [AnyHashable : Any]) { debugLog("+++++++++++广告加载展示成功") - self.delegate?.fa_bannerAdDidShow(bannerAd: self) + self.delegate?.fa_bannerAdDidShow(ad: self, adInfo: adInfo) } func tpBannerAdShow(_ adInfo: [AnyHashable : Any], didFailWithError error: any Error) { - self.delegate?.fa_bannerAd(bannerAd: self, didDisplayFail: error) + self.delegate?.fa_bannerAd(ad: self, didDisplayFail: error) } func tpBannerAdClicked(_ adInfo: [AnyHashable : Any]) { diff --git a/Fableon/Object/Libs/AdManager/FAAdManager.swift b/Fableon/Object/Libs/AdManager/FAAdManager.swift index cd09698..4416e2d 100644 --- a/Fableon/Object/Libs/AdManager/FAAdManager.swift +++ b/Fableon/Object/Libs/AdManager/FAAdManager.swift @@ -23,6 +23,18 @@ class FAAdManager: NSObject { case splash = "splash" case banner = "banner" case open = "open" + case native = "native" + } + + enum StatType: String, SmartCaseDefaultable { + case startLoad = "startLoad" + case showFailed = "show_failed" + case loadFailed = "load_failed" + case endLoad = "endLoad" + case show = "start" + case close = "close" + case click = "click" + case interrupt = "Interrupt" } static func initSdk() { diff --git a/Fableon/Object/Libs/AdManager/FAAdStatModel.swift b/Fableon/Object/Libs/AdManager/FAAdStatModel.swift index 2ebb2ed..eac9e14 100644 --- a/Fableon/Object/Libs/AdManager/FAAdStatModel.swift +++ b/Fableon/Object/Libs/AdManager/FAAdStatModel.swift @@ -14,7 +14,7 @@ class FAAdStatModel: NSObject, SmartCodable { - var type: String? //start click error click show_failed load_failed Interrupt(退到后台) close + var type: FAAdManager.StatType? //start click error click show_failed load_failed Interrupt(退到后台) close var ads_id: String? var view_seconds: Int? var loading_time: Int? diff --git a/Fableon/Object/Libs/AdManager/Native/FANativeAdManager.swift b/Fableon/Object/Libs/AdManager/Native/FANativeAdManager.swift index 3139a1c..56dd497 100644 --- a/Fableon/Object/Libs/AdManager/Native/FANativeAdManager.swift +++ b/Fableon/Object/Libs/AdManager/Native/FANativeAdManager.swift @@ -24,18 +24,19 @@ import UIKit protocol FANativeAdDelegate: NSObjectProtocol { + func fa_nativeAdDidStartLoad(ad: FANativeAd) ///广告加载失败 - func fa_nativeAd(nativeAd: FANativeAd, didLoadFail error: Error) + func fa_nativeAd(ad: FANativeAd, didLoadFail error: Error) ///广告加载成功 - func fa_nativeAdDidLoadFinish(nativeAd: FANativeAd) + func fa_nativeAdDidLoadFinish(ad: FANativeAd) ///广告被展示 - func fa_nativeAdDidShow(nativeAd: FANativeAd) + func fa_nativeAdDidShow(ad: FANativeAd, adInfo: [AnyHashable : Any]) ///广告展示失败 - func fa_nativeAd(nativeAd: FANativeAd, didDisplayFail error: Error) + func fa_nativeAd(ad: FANativeAd, didDisplayFail error: Error) ///广告被关闭 - func fa_nativeAdDidDismiss(nativeAd: FANativeAd) + func fa_nativeAdDidDismiss(ad: FANativeAd) ///广告被点击 - func fa_nativeAdDidClick(nativeAd: FANativeAd) + func fa_nativeAdDidClick(ad: FANativeAd) } protocol FANativeAd: NSObjectProtocol { @@ -52,6 +53,8 @@ protocol FANativeAd: NSObjectProtocol { var adUnitID: String { get } + var networkName: String { get set } + var isReady: Bool { get } func loadAd() @@ -83,10 +86,16 @@ class FANativeAdManager: NSObject { ///广告是否在加载中 private(set) var isLoadingAd = false + ///广告正在被展示 + private(set) var isShowingAd = false ///是否展示过 var hasShow = false + private var startShowDate: Date? + private var startLoadDate: Date? + private var endLoadDate: Date? + private var nativeAd: FANativeAd? { didSet { @@ -95,6 +104,14 @@ class FANativeAdManager: NSObject { } } + deinit { + NotificationCenter.default.removeObserver(self) + } + + override init() { + super.init() + NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackgroundNotification), name: UIApplication.didEnterBackgroundNotification, object: nil) + } func load() { @@ -121,6 +138,7 @@ class FANativeAdManager: NSObject { } guard !hasShow, self.isAdAvailable else { return } + self.isShowingAd = true self.hasShow = true self.nativeAd?.show() } @@ -129,32 +147,100 @@ class FANativeAdManager: NSObject { extension FANativeAdManager: FANativeAdDelegate { - func fa_nativeAdDidLoadFinish(nativeAd: any FANativeAd) { + func fa_nativeAdDidStartLoad(ad: any FANativeAd) { + self.startLoadDate = Date() + self.uploadAdsHistory(ad: ad, type: .startLoad) + } + + func fa_nativeAdDidLoadFinish(ad: any FANativeAd) { self.isLoadingAd = false + self.endLoadDate = Date() + self.uploadAdsHistory(ad: ad, type: .endLoad) self.delegate?.fa_nativeAdManagerDidLoadFinish?(manager: self) } - func fa_nativeAdDidShow(nativeAd: any FANativeAd) { + func fa_nativeAdDidShow(ad: any FANativeAd, adInfo: [AnyHashable : Any]) { + self.startShowDate = Date() + self.uploadAdsHistory(ad: ad, type: .show, viewSeconds: 0) + self.requestUploadAdsPrice(ad: ad, adInfo: adInfo) self.delegate?.fa_nativeAdManagerDidShow?(manager: self) } - func fa_nativeAd(nativeAd: any FANativeAd, didLoadFail error: any Error) { + func fa_nativeAd(ad: any FANativeAd, didLoadFail error: any Error) { self.isLoadingAd = false + self.endLoadDate = Date() + uploadAdsHistory(ad: ad, type: .loadFailed, errorMsg: error.localizedDescription) self.delegate?.fa_nativeAdManager?(manager: self, didLoadFail: error) } - func fa_nativeAd(nativeAd: any FANativeAd, didDisplayFail error: any Error) { + func fa_nativeAd(ad: any FANativeAd, didDisplayFail error: any Error) { + uploadAdsHistory(ad: ad, type: .showFailed, errorMsg: error.localizedDescription) self.delegate?.fa_nativeAdManager?(manager: self, didDisplayFail: error) } - func fa_nativeAdDidDismiss(nativeAd: any FANativeAd) { + func fa_nativeAdDidDismiss(ad: any FANativeAd) { + self.uploadAdsHistory(ad: ad, type: .close) self.delegate?.fa_nativeAdManagerDidDismiss?(manager: self) } - func fa_nativeAdDidClick(nativeAd: any FANativeAd) { + func fa_nativeAdDidClick(ad: any FANativeAd) { + self.uploadAdsHistory(ad: ad, type: .click) self.delegate?.fa_nativeAdManagerDidClick?(manager: self) } - +} + +extension FANativeAdManager { + + @objc private func didEnterBackgroundNotification() { + if !self.isShowingAd { return } + guard let ad = self.nativeAd else { return } + + self.uploadAdsHistory(ad: ad, type: .interrupt) + } + + func uploadAdsHistory(ad: any FANativeAd, type: FAAdManager.StatType, viewSeconds: Int? = nil, errorMsg: String? = nil) { + var loadTime: Int? + if let startDate = self.startLoadDate, let endDate = self.endLoadDate { + loadTime = Int(endDate.timeIntervalSince(startDate)) + } + + var showTime: Int? = viewSeconds + if showTime == nil && (type == .click || type == .interrupt || type == .close) { + if let startShowDate = self.startShowDate { + showTime = Int(Date().timeIntervalSince(startShowDate)) + } + } + + let model = FAAdStatModel() + model.scene = .native + if let loadTime = loadTime { + model.loading_time = max(0, loadTime) + } + model.view_seconds = showTime + model.ad_type = ad.adType.rawValue + model.ads_id = ad.adUnitID + model.ad_platform_key = ad.adPlatform + model.type = type + model.ag_platform_name = ad.networkName + model.ad_platform_name = ad.adPlatform + + FAStatAPI.requestUploadAdsHistory(model: model) + } + + func requestUploadAdsPrice(ad: any FANativeAd, adInfo: [AnyHashable : Any]) { + guard let ecpm = adInfo["ecpm"] as? String else { return } + let money = (NSNumber(string: ecpm)?.doubleValue ?? 0) / 1000 + + let model = FAUploadAdsPriceModel() + model.short_play_launch_id = ad.adUnitID + model.type = ad.adType.rawValue + model.agent_name = ad.adPlatform.rawValue + model.alliance_name = ad.networkName + model.money = "\(money)" + model.scene = .native + + FAStatAPI.requestUploadAdsPrice(model: model) + } } diff --git a/Fableon/Object/Libs/AdManager/Native/FATradPlusNativeAd.swift b/Fableon/Object/Libs/AdManager/Native/FATradPlusNativeAd.swift index 0591f3c..77b8b50 100644 --- a/Fableon/Object/Libs/AdManager/Native/FATradPlusNativeAd.swift +++ b/Fableon/Object/Libs/AdManager/Native/FATradPlusNativeAd.swift @@ -34,6 +34,8 @@ class FATradPlusNativeAd: NSObject, FANativeAd { return adPlatform.nativeUnitId } + var networkName: String = "" + var isReady: Bool { #if canImport(TradPlusAds) return self.nativeAd?.isAdReady ?? false @@ -75,28 +77,33 @@ class FATradPlusNativeAd: NSObject, FANativeAd { #if canImport(TradPlusAds) extension FATradPlusNativeAd: TradPlusADNativeDelegate { + func tpNativeAdStartLoad(_ adInfo: [AnyHashable : Any]) { + self.delegate?.fa_nativeAdDidStartLoad(ad: self) + } + func tpNativeAdLoaded(_ adInfo: [AnyHashable : Any]) { - self.delegate?.fa_nativeAdDidLoadFinish(nativeAd: self) + self.networkName = (adInfo["adNetworkName"] as? String) ?? "unknown" + self.delegate?.fa_nativeAdDidLoadFinish(ad: self) } func tpNativeAdImpression(_ adInfo: [AnyHashable : Any]) { - self.delegate?.fa_nativeAdDidShow(nativeAd: self) + self.delegate?.fa_nativeAdDidShow(ad: self, adInfo: adInfo) } func tpNativeAdLoadFailWithError(_ error: any Error) { - self.delegate?.fa_nativeAd(nativeAd: self, didLoadFail: error) + self.delegate?.fa_nativeAd(ad: self, didLoadFail: error) } func tpNativeAdShow(_ adInfo: [AnyHashable : Any], didFailWithError error: any Error) { - self.delegate?.fa_nativeAd(nativeAd: self, didDisplayFail: error) + self.delegate?.fa_nativeAd(ad: self, didDisplayFail: error) } func tpNativeAdClicked(_ adInfo: [AnyHashable : Any]) { - self.delegate?.fa_nativeAdDidClick(nativeAd: self) + self.delegate?.fa_nativeAdDidClick(ad: self) } func tpNativeAdClose(_ adInfo: [AnyHashable : Any]) { - self.delegate?.fa_nativeAdDidDismiss(nativeAd: self) + self.delegate?.fa_nativeAdDidDismiss(ad: self) } } diff --git a/Fableon/Object/Libs/AdManager/Open/FAOpenAdManager.swift b/Fableon/Object/Libs/AdManager/Open/FAOpenAdManager.swift index 4003f27..437c705 100644 --- a/Fableon/Object/Libs/AdManager/Open/FAOpenAdManager.swift +++ b/Fableon/Object/Libs/AdManager/Open/FAOpenAdManager.swift @@ -179,7 +179,7 @@ extension FAOpenAdManager: FAOpenAdDelegate { func fa_openAdDidStartLoad(ad: any FAOpenAd) { self.startLoadDate = Date() - self.uploadAdsHistory(ad: ad, type: "startLoad") + self.uploadAdsHistory(ad: ad, type: .startLoad) } func fa_openAd(ad: FAOpenAd, didLoadFail error: Error) { @@ -188,14 +188,14 @@ extension FAOpenAdManager: FAOpenAdDelegate { isWaitingToShow = false appOpenAd = nil clearTimer() - uploadAdsHistory(ad: ad, type: "load_failed", errorMsg: error.localizedDescription) + uploadAdsHistory(ad: ad, type: .loadFailed, errorMsg: error.localizedDescription) delegate?.fa_openAdManager?(manager: self, didLoadFail: error) } func fa_openAdDidLoadFinish(ad: FAOpenAd) { self.endLoadDate = Date() isLoadingAd = false - self.uploadAdsHistory(ad: ad, type: "endLoad") + self.uploadAdsHistory(ad: ad, type: .endLoad) delegate?.fa_openAdManagerDidLoadFinish?(manager: self) // 如果之前处于等待展示状态,现在立即展示 @@ -210,13 +210,13 @@ extension FAOpenAdManager: FAOpenAdDelegate { isWaitingToShow = false appOpenAd = nil clearTimer() - uploadAdsHistory(ad: ad, type: "show_failed", errorMsg: error.localizedDescription) + uploadAdsHistory(ad: ad, type: .showFailed, errorMsg: error.localizedDescription) delegate?.fa_openAdManager?(manager: self, didDisplayFail: error) } func fa_openAdDidShow(ad: any FAOpenAd, adInfo: [AnyHashable : Any]) { self.startShowDate = Date() - self.uploadAdsHistory(ad: ad, type: "start", viewSeconds: 0) + self.uploadAdsHistory(ad: ad, type: .show, viewSeconds: 0) self.requestUploadAdsPrice(ad: ad, adInfo: adInfo) delegate?.fa_openAdManagerDidShow?(manager: self) } @@ -224,11 +224,7 @@ extension FAOpenAdManager: FAOpenAdDelegate { func fa_openAdDidDismiss(ad: FAOpenAd) { isShowingAd = false appOpenAd = nil - var viewSeconds: Int? = nil - if let startShowDate = self.startShowDate { - viewSeconds = Int(Date().timeIntervalSince(startShowDate)) - } - self.uploadAdsHistory(ad: ad, type: "close", viewSeconds: viewSeconds) + self.uploadAdsHistory(ad: ad, type: .close) delegate?.fa_openAdManagerDidDismiss?(manager: self) // 关闭后自动预加载下一条,5秒后开始加载 @@ -239,11 +235,7 @@ extension FAOpenAdManager: FAOpenAdDelegate { } func fa_openAdDidClick(ad: FAOpenAd) { - var viewSeconds: Int? = nil - if let startShowDate = self.startShowDate { - viewSeconds = Int(Date().timeIntervalSince(startShowDate)) - } - self.uploadAdsHistory(ad: ad, type: "click", viewSeconds: viewSeconds) + self.uploadAdsHistory(ad: ad, type: .click) } } @@ -255,11 +247,7 @@ extension FAOpenAdManager { if !self.isShowingAd { return } guard let ad = self.appOpenAd else { return } - var viewSeconds: Int? = nil - if let startShowDate = self.startShowDate { - viewSeconds = Int(Date().timeIntervalSince(startShowDate)) - } - self.uploadAdsHistory(ad: ad, type: "Interrupt", viewSeconds: viewSeconds) + self.uploadAdsHistory(ad: ad, type: .interrupt) } @objc private func didBecomeActiveNotification() { @@ -269,18 +257,25 @@ extension FAOpenAdManager { } } - func uploadAdsHistory(ad: any FAOpenAd, type: String, viewSeconds: Int? = nil, errorMsg: String? = nil) { + func uploadAdsHistory(ad: any FAOpenAd, type: FAAdManager.StatType, viewSeconds: Int? = nil, errorMsg: String? = nil) { var loadTime: Int? if let startDate = self.startLoadDate, let endDate = self.endLoadDate { loadTime = Int(endDate.timeIntervalSince(startDate)) } + var showTime: Int? = viewSeconds + if showTime == nil && (type == .click || type == .interrupt || type == .close) { + if let startShowDate = self.startShowDate { + showTime = Int(Date().timeIntervalSince(startShowDate)) + } + } + let model = FAAdStatModel() model.scene = .open if let loadTime = loadTime { model.loading_time = max(0, loadTime) } - model.view_seconds = viewSeconds + model.view_seconds = showTime model.ad_type = ad.adType.rawValue model.ads_id = ad.adUnitID model.ad_platform_key = ad.adPlatform diff --git a/Fableon/Object/Libs/AdManager/Rewarded/FARewardedAdManager.swift b/Fableon/Object/Libs/AdManager/Rewarded/FARewardedAdManager.swift index 395c2a3..de971e2 100644 --- a/Fableon/Object/Libs/AdManager/Rewarded/FARewardedAdManager.swift +++ b/Fableon/Object/Libs/AdManager/Rewarded/FARewardedAdManager.swift @@ -144,33 +144,33 @@ extension FARewardedAdManager: FARewardedAdDelegate { self.rewardedAd = nil self.endLoadDate = Date() self.isLoadingAd = false - self.uploadAdsHistory(ad: ad, type: "load_failed", errorMsg: error.localizedDescription) + self.uploadAdsHistory(ad: ad, type: .loadFailed, errorMsg: error.localizedDescription) self.delegate?.fa_rewardedAdManager?(adManager: self, didLoadFail: error) } func fa_rewardedAd(ad: any FARewardedAd, didDisplayFail error: any Error) { self.isPlaying = false self.rewardedAd = nil - self.uploadAdsHistory(ad: ad, type: "show_failed", errorMsg: error.localizedDescription) + self.uploadAdsHistory(ad: ad, type: .showFailed, errorMsg: error.localizedDescription) self.delegate?.fa_rewardedAdManager?(adManager: self, didDisplayFail: error) } func fa_rewardedAdDidStartLoad(ad: any FARewardedAd) { self.startLoadDate = Date() - self.uploadAdsHistory(ad: ad, type: "startLoad") + self.uploadAdsHistory(ad: ad, type: .startLoad) } func fa_rewardedAdDidLoadFinish(ad: any FARewardedAd) { self.isLoadingAd = false self.endLoadDate = Date() - self.uploadAdsHistory(ad: ad, type: "endLoad") + self.uploadAdsHistory(ad: ad, type: .endLoad) self.delegate?.fa_rewardedAdManagerDidLoadFinish?(adManager: self) } func fa_rewardedAdDidShow(ad: any FARewardedAd, adInfo: [AnyHashable : Any]) { self.isPlaying = true self.startShowDate = Date() - self.uploadAdsHistory(ad: ad, type: "start", viewSeconds: 0) + self.uploadAdsHistory(ad: ad, type: .show, viewSeconds: 0) self.requestUploadAdsPrice(ad: ad, adInfo: adInfo) self.delegate?.fa_rewardedAdManagerDidShow?(adManager: self) } @@ -178,22 +178,14 @@ extension FARewardedAdManager: FARewardedAdDelegate { func fa_rewardedAdDidDismiss(ad: any FARewardedAd) { self.isPlaying = false self.rewardedAd = nil - var viewSeconds: Int? = nil - if let startShowDate = self.startShowDate { - viewSeconds = Int(Date().timeIntervalSince(startShowDate)) - } - self.uploadAdsHistory(ad: ad, type: "close", viewSeconds: viewSeconds) + self.uploadAdsHistory(ad: ad, type: .close) self.delegate?.fa_rewardedAdManagerDidDismiss?(adManager: self, platform: ad.adPlatform.rawValue, adUnitID: ad.adUnitID) //加载新的广告 self.load() } func fa_rewardedAdDidClick(ad: any FARewardedAd) { - var viewSeconds: Int? = nil - if let startShowDate = self.startShowDate { - viewSeconds = Int(Date().timeIntervalSince(startShowDate)) - } - self.uploadAdsHistory(ad: ad, type: "click", viewSeconds: viewSeconds) + self.uploadAdsHistory(ad: ad, type: .click) self.delegate?.fa_rewardedAdManagerDidClick?(adManager: self) } } @@ -202,11 +194,7 @@ extension FARewardedAdManager { @objc private func didEnterBackgroundNotification() { guard let ad = self.rewardedAd, self.isPlaying else { return } - var viewSeconds: Int? = nil - if let startShowDate = self.startShowDate { - viewSeconds = Int(Date().timeIntervalSince(startShowDate)) - } - self.uploadAdsHistory(ad: ad, type: "Interrupt", viewSeconds: viewSeconds) + self.uploadAdsHistory(ad: ad, type: .interrupt) } } @@ -220,18 +208,25 @@ extension FARewardedAdManager { } } - func uploadAdsHistory(ad: any FARewardedAd, type: String, viewSeconds: Int? = nil, errorMsg: String? = nil) { + func uploadAdsHistory(ad: any FARewardedAd, type: FAAdManager.StatType, viewSeconds: Int? = nil, errorMsg: String? = nil) { var loadTime: Int? if let startDate = self.startLoadDate, let endDate = self.endLoadDate { loadTime = Int(endDate.timeIntervalSince(startDate)) } + var showTime: Int? = viewSeconds + if showTime == nil && (type == .click || type == .interrupt || type == .close) { + if let startShowDate = self.startShowDate { + showTime = Int(Date().timeIntervalSince(startShowDate)) + } + } + let model = FAAdStatModel() model.short_play_id = self.shortPlayId model.short_play_video_id = self.shortPlayVideoId model.scene = self.businessScene model.loading_time = loadTime - model.view_seconds = viewSeconds + model.view_seconds = showTime model.ad_type = ad.adType.rawValue model.ads_id = ad.adUnitID model.ad_platform_key = ad.adPlatform