From bddd0142a6641b757ce142b119fc5c4a2c6ec2fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B9=96=E5=8C=97=E7=A7=A6=E4=B9=9D?= Date: Sat, 28 Feb 2026 09:35:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B9=BF=E5=91=8Abug=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=EF=BC=8C1.0.8=E6=8F=90=E5=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Fableon.xcodeproj/project.pbxproj | 4 ++-- .../Base/Controller/FAViewController.swift | 4 ---- .../Class/Me/C/FACoinPackViewController.swift | 5 ++++ .../Player/V/FAPlayerDetailControlView.swift | 10 ++++++-- .../VC/FAPlayerDetailViewController.swift | 16 +++++++++---- .../Player/VM/FAShortDetailViewModel.swift | 5 ++++ .../Class/Store/C/FAStoreViewController.swift | 5 ++++ .../AdManager/Banner/FABannerAdManager.swift | 19 +++++++++++++-- .../Object/Libs/AdManager/FAAdManager.swift | 4 ++-- .../AdManager/Native/FANativeAdManager.swift | 24 ++++++++++++++++--- .../AdManager/Native/FATradPlusNativeAd.swift | 4 +++- .../Libs/AdManager/Open/FAOpenAdManager.swift | 7 ++++-- .../Rewarded/FARewardedAdManager.swift | 11 ++------- 13 files changed, 87 insertions(+), 31 deletions(-) diff --git a/Fableon.xcodeproj/project.pbxproj b/Fableon.xcodeproj/project.pbxproj index e1f2e2a..5496770 100644 --- a/Fableon.xcodeproj/project.pbxproj +++ b/Fableon.xcodeproj/project.pbxproj @@ -2881,7 +2881,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.7; + MARKETING_VERSION = 1.0.8; PRODUCT_BUNDLE_IDENTIFIER = com.hn.qinjiu.fableon; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; @@ -2923,7 +2923,7 @@ "$(inherited)", "@executable_path/Frameworks", ); - MARKETING_VERSION = 1.0.7; + MARKETING_VERSION = 1.0.8; PRODUCT_BUNDLE_IDENTIFIER = com.hn.qinjiu.fableon; PRODUCT_NAME = "$(TARGET_NAME)"; SUPPORTED_PLATFORMS = "iphoneos iphonesimulator"; diff --git a/Fableon/Object/Base/Controller/FAViewController.swift b/Fableon/Object/Base/Controller/FAViewController.swift index 466b32d..a73eea0 100644 --- a/Fableon/Object/Base/Controller/FAViewController.swift +++ b/Fableon/Object/Base/Controller/FAViewController.swift @@ -67,10 +67,6 @@ extension UIViewController { @objc func handleNavigationBack() { self.fa_toLastViewController(animated: true) - if FARewardedAdManager.manager.isAdAvailable { - FARewardedAdManager.manager.businessScene = .detailBack - FARewardedAdManager.manager.show() - } } func fa_toLastViewController(animated: Bool) { diff --git a/Fableon/Object/Class/Me/C/FACoinPackViewController.swift b/Fableon/Object/Class/Me/C/FACoinPackViewController.swift index 766055a..824649a 100644 --- a/Fableon/Object/Class/Me/C/FACoinPackViewController.swift +++ b/Fableon/Object/Class/Me/C/FACoinPackViewController.swift @@ -133,6 +133,11 @@ class FACoinPackViewController: FAViewController { self.fa_setNavigationStyle() } + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + FAOpenAdManager.manager.vcAllowedShowAd = false + } + private func updateLayout() { stackView.fa_removeAllArrangedSubview() diff --git a/Fableon/Object/Class/Player/V/FAPlayerDetailControlView.swift b/Fableon/Object/Class/Player/V/FAPlayerDetailControlView.swift index b63c102..66d9c27 100644 --- a/Fableon/Object/Class/Player/V/FAPlayerDetailControlView.swift +++ b/Fableon/Object/Class/Player/V/FAPlayerDetailControlView.swift @@ -25,7 +25,8 @@ class FAPlayerDetailControlView: JXPlayerListControlView { override var model: Any? { didSet { let model = self.model as? FAVideoInfoModel - + self.bannerAdManager.shortPlayId = model?.short_play_id + self.bannerAdManager.shortPlayVideoId = model?.short_play_video_id updateEp() } } @@ -56,8 +57,12 @@ class FAPlayerDetailControlView: JXPlayerListControlView { didSet { playButton.setNeedsUpdateConfiguration() if isCurrent { - self.bannerAdManager.loadAd() + let model = self.model as? FAVideoInfoModel + if model?.is_lock == false { + self.bannerAdManager.loadAd() + } } else { + self.bannerAdManager.uploadCloseAdsHistory() self.bannerAdManager.cleanAd() } self.updateBannerAdLayout() @@ -167,6 +172,7 @@ class FAPlayerDetailControlView: JXPlayerListControlView { }() deinit { + self.bannerAdManager.uploadCloseAdsHistory() NotificationCenter.default.removeObserver(self) } diff --git a/Fableon/Object/Class/Player/VC/FAPlayerDetailViewController.swift b/Fableon/Object/Class/Player/VC/FAPlayerDetailViewController.swift index bbfa375..1c9fba3 100644 --- a/Fableon/Object/Class/Player/VC/FAPlayerDetailViewController.swift +++ b/Fableon/Object/Class/Player/VC/FAPlayerDetailViewController.swift @@ -83,8 +83,6 @@ class FAPlayerDetailViewController: JXPlayerListViewController { requestDetailList() - self.fa_viewModel.loadNativeAd() - fa_setupLayout() self.fa_viewModel.requestRecommandData() @@ -168,6 +166,15 @@ class FAPlayerDetailViewController: JXPlayerListViewController { // self.handleNavigationBack() } + + override func handleNavigationBack() { + super.handleNavigationBack() + + if FARewardedAdManager.manager.isAdAvailable { + FARewardedAdManager.manager.businessScene = .detailBack + FARewardedAdManager.manager.show() + } + } } extension FAPlayerDetailViewController { @@ -224,6 +231,8 @@ extension FAPlayerDetailViewController: JXPlayerListViewControllerDelegate, JXPl FARewardedAdManager.manager.shortPlayId = model?.short_play_id FARewardedAdManager.manager.shortPlayVideoId = model?.short_play_video_id } + self.fa_viewModel.nativeAdManager.shortPlayId = model?.short_play_id + self.fa_viewModel.nativeAdManager.shortPlayVideoId = model?.short_play_video_id } func jx_shouldAutoScrollNextEpisode(_ viewController: JXPlayerListViewController) -> Bool { @@ -242,8 +251,7 @@ extension FAPlayerDetailViewController { private func requestDetailList() { self.fa_viewModel.requestDetailData { [weak self] code in guard let self = self else { return } - - + self.fa_viewModel.loadNativeAd() } } } diff --git a/Fableon/Object/Class/Player/VM/FAShortDetailViewModel.swift b/Fableon/Object/Class/Player/VM/FAShortDetailViewModel.swift index 3c84612..cc33119 100644 --- a/Fableon/Object/Class/Player/VM/FAShortDetailViewModel.swift +++ b/Fableon/Object/Class/Player/VM/FAShortDetailViewModel.swift @@ -61,6 +61,9 @@ class FAShortDetailViewModel: JXPlayerListViewModel, ObservableObject { return manager }() + deinit { + self.nativeAdManager.uploadCloseAdsHistory() + } func requestDetailData(indexPath: IndexPath? = nil, completer: ((_ code: Int) -> Void)?) { isShowRecommand = false @@ -290,6 +293,8 @@ extension FAShortDetailViewModel { ///加载原生广告 func loadNativeAd() { + if self.nativeAdManager.hasShow || self.nativeAdManager.isAdAvailable { return } + self.nativeAdManager.load() } diff --git a/Fableon/Object/Class/Store/C/FAStoreViewController.swift b/Fableon/Object/Class/Store/C/FAStoreViewController.swift index 0227aca..290b9f3 100644 --- a/Fableon/Object/Class/Store/C/FAStoreViewController.swift +++ b/Fableon/Object/Class/Store/C/FAStoreViewController.swift @@ -113,6 +113,11 @@ class FAStoreViewController: FAViewController { fa_setNavigationStyle() } + override func viewDidAppear(_ animated: Bool) { + super.viewDidAppear(animated) + FAOpenAdManager.manager.vcAllowedShowAd = false + } + private func buyFinish() { self.requestPayData() } diff --git a/Fableon/Object/Libs/AdManager/Banner/FABannerAdManager.swift b/Fableon/Object/Libs/AdManager/Banner/FABannerAdManager.swift index fdfac1a..c9963dd 100644 --- a/Fableon/Object/Libs/AdManager/Banner/FABannerAdManager.swift +++ b/Fableon/Object/Libs/AdManager/Banner/FABannerAdManager.swift @@ -79,6 +79,9 @@ class FABannerAdManager: NSObject { } } + var shortPlayId: String? + var shortPlayVideoId: String? + private var startShowDate: Date? private var startLoadDate: Date? private var endLoadDate: Date? @@ -99,7 +102,7 @@ class FABannerAdManager: NSObject { override init() { super.init() - NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackgroundNotification), name: UIApplication.didEnterBackgroundNotification, object: nil) +// NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackgroundNotification), name: UIApplication.didEnterBackgroundNotification, object: nil) } func loadAd() { @@ -124,6 +127,7 @@ class FABannerAdManager: NSObject { self.isShowingAd = false self.startLoadDate = nil self.endLoadDate = nil + self.startShowDate = nil } private func updateLayout() { @@ -133,6 +137,13 @@ class FABannerAdManager: NSObject { adView.autoresizingMask = [.flexibleWidth, .flexibleHeight] } } + + ///上报关闭广告历史 + func uploadCloseAdsHistory() { + guard let ad = self.bannerAd else { return } + guard self.isShowingAd else { return } + self.uploadAdsHistory(ad: ad, type: .close) + } } @@ -170,7 +181,7 @@ extension FABannerAdManager: FABannerAdDelegate { } func fa_bannerAdDidDismiss(ad: any FABannerAd) { - self.uploadAdsHistory(ad: ad, type: .close) + self.uploadCloseAdsHistory() self.delegate?.fa_bannerAdManagerDidDismiss?(manager: self) } @@ -211,6 +222,8 @@ extension FABannerAdManager { model.loading_time = max(0, loadTime) } model.view_seconds = showTime + model.short_play_id = self.shortPlayId + model.short_play_video_id = self.shortPlayVideoId model.ad_type = ad.adType.rawValue model.ads_id = ad.adUnitID model.ad_platform_key = ad.adPlatform @@ -226,6 +239,8 @@ extension FABannerAdManager { let money = (NSNumber(string: ecpm)?.doubleValue ?? 0) / 1000 let model = FAUploadAdsPriceModel() + model.short_play_id = self.shortPlayId + model.short_play_video_id = self.shortPlayVideoId model.short_play_launch_id = ad.adUnitID model.type = ad.adType.rawValue model.agent_name = ad.adPlatform.rawValue diff --git a/Fableon/Object/Libs/AdManager/FAAdManager.swift b/Fableon/Object/Libs/AdManager/FAAdManager.swift index 4416e2d..842a496 100644 --- a/Fableon/Object/Libs/AdManager/FAAdManager.swift +++ b/Fableon/Object/Libs/AdManager/FAAdManager.swift @@ -21,9 +21,9 @@ class FAAdManager: NSObject { case me = "me" case reward = "reward" case splash = "splash" - case banner = "banner" + case banner = "detail_landscape" case open = "open" - case native = "native" + case native = "detail_stop" } enum StatType: String, SmartCaseDefaultable { diff --git a/Fableon/Object/Libs/AdManager/Native/FANativeAdManager.swift b/Fableon/Object/Libs/AdManager/Native/FANativeAdManager.swift index 56dd497..dc06927 100644 --- a/Fableon/Object/Libs/AdManager/Native/FANativeAdManager.swift +++ b/Fableon/Object/Libs/AdManager/Native/FANativeAdManager.swift @@ -84,6 +84,9 @@ class FANativeAdManager: NSObject { } } + var shortPlayId: String? + var shortPlayVideoId: String? + ///广告是否在加载中 private(set) var isLoadingAd = false ///广告正在被展示 @@ -105,12 +108,12 @@ class FANativeAdManager: NSObject { } deinit { - NotificationCenter.default.removeObserver(self) +// NotificationCenter.default.removeObserver(self) } override init() { super.init() - NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackgroundNotification), name: UIApplication.didEnterBackgroundNotification, object: nil) +// NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackgroundNotification), name: UIApplication.didEnterBackgroundNotification, object: nil) } @@ -122,7 +125,11 @@ class FANativeAdManager: NSObject { } guard !self.isLoadingAd else { return } + self.startLoadDate = nil + self.endLoadDate = nil + self.startShowDate = nil self.isLoadingAd = true + self.nativeAd = FATradPlusNativeAd() self.nativeAd?.adSize = self.contentSize self.nativeAd?.adView = contentView @@ -143,6 +150,13 @@ class FANativeAdManager: NSObject { self.nativeAd?.show() } + ///上报关闭广告历史 + func uploadCloseAdsHistory() { + guard let ad = self.nativeAd else { return } + guard self.isShowingAd else { return } + self.uploadAdsHistory(ad: ad, type: .close) + } + } extension FANativeAdManager: FANativeAdDelegate { @@ -179,7 +193,7 @@ extension FANativeAdManager: FANativeAdDelegate { } func fa_nativeAdDidDismiss(ad: any FANativeAd) { - self.uploadAdsHistory(ad: ad, type: .close) + self.uploadCloseAdsHistory() self.delegate?.fa_nativeAdManagerDidDismiss?(manager: self) } @@ -218,6 +232,8 @@ extension FANativeAdManager { if let loadTime = loadTime { model.loading_time = max(0, loadTime) } + model.short_play_id = self.shortPlayId + model.short_play_video_id = self.shortPlayVideoId model.view_seconds = showTime model.ad_type = ad.adType.rawValue model.ads_id = ad.adUnitID @@ -234,6 +250,8 @@ extension FANativeAdManager { let money = (NSNumber(string: ecpm)?.doubleValue ?? 0) / 1000 let model = FAUploadAdsPriceModel() + model.short_play_id = self.shortPlayId + model.short_play_video_id = self.shortPlayVideoId model.short_play_launch_id = ad.adUnitID model.type = ad.adType.rawValue model.agent_name = ad.adPlatform.rawValue diff --git a/Fableon/Object/Libs/AdManager/Native/FATradPlusNativeAd.swift b/Fableon/Object/Libs/AdManager/Native/FATradPlusNativeAd.swift index 77b8b50..37dbe10 100644 --- a/Fableon/Object/Libs/AdManager/Native/FATradPlusNativeAd.swift +++ b/Fableon/Object/Libs/AdManager/Native/FATradPlusNativeAd.swift @@ -52,6 +52,8 @@ class FATradPlusNativeAd: NSObject, FANativeAd { self.nativeAd?.setTemplateRenderSize(adSize) self.nativeAd?.delegate = self self.nativeAd?.loadAd() + + self.delegate?.fa_nativeAdDidStartLoad(ad: self) #endif } @@ -78,7 +80,7 @@ class FATradPlusNativeAd: NSObject, FANativeAd { extension FATradPlusNativeAd: TradPlusADNativeDelegate { func tpNativeAdStartLoad(_ adInfo: [AnyHashable : Any]) { - self.delegate?.fa_nativeAdDidStartLoad(ad: self) +// self.delegate?.fa_nativeAdDidStartLoad(ad: self) } func tpNativeAdLoaded(_ adInfo: [AnyHashable : Any]) { diff --git a/Fableon/Object/Libs/AdManager/Open/FAOpenAdManager.swift b/Fableon/Object/Libs/AdManager/Open/FAOpenAdManager.swift index 437c705..1e9136e 100644 --- a/Fableon/Object/Libs/AdManager/Open/FAOpenAdManager.swift +++ b/Fableon/Object/Libs/AdManager/Open/FAOpenAdManager.swift @@ -97,8 +97,12 @@ class FAOpenAdManager: NSObject { if isLoadingAd || isAdAvailable { return } + startLoadDate = nil + endLoadDate = nil + startShowDate = nil isLoadingAd = true + appOpenAd = FATradPlusOpenAd() appOpenAd?.loadAd() } @@ -135,8 +139,7 @@ class FAOpenAdManager: NSObject { showAd() return } - self.startLoadDate = nil - self.endLoadDate = nil + // 2. 如果没有就绪,标记等待并开始加载,同时开启超时保护 isWaitingToShow = true diff --git a/Fableon/Object/Libs/AdManager/Rewarded/FARewardedAdManager.swift b/Fableon/Object/Libs/AdManager/Rewarded/FARewardedAdManager.swift index de971e2..e9b2431 100644 --- a/Fableon/Object/Libs/AdManager/Rewarded/FARewardedAdManager.swift +++ b/Fableon/Object/Libs/AdManager/Rewarded/FARewardedAdManager.swift @@ -114,10 +114,11 @@ class FARewardedAdManager: NSObject { if self.isLoadingAd { return } self.startLoadDate = nil self.endLoadDate = nil + self.startShowDate = nil self.isLoadingAd = true - self.businessScene = .main +// self.businessScene = .main self.rewardedAd = FATradPlusInterstitialAd() self.rewardedAd?.loadAd() @@ -200,14 +201,6 @@ extension FARewardedAdManager { extension FARewardedAdManager { - private func requestAdOverview() { - - FAAPI.requestRewardedAdOverview { [weak self] list in - guard let self = self else { return } - - } - } - 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 {