// // VPBannerAdManager.swift // Veloria // // Created by 湖南秦九 on 2025/7/15. // import UIKit #if canImport(AppLovinSDK) import AppLovinSDK #endif @objc protocol VPBannerAdDelegate: NSObjectProtocol { ///广告加载失败 @objc optional func bannerAd(bannerAd: VPBannerAd, didLoadFail error: Error) ///广告加载成功 @objc optional func bannerAdDidLoadFinish(bannerAd: VPBannerAd) ///广告被展示 @objc optional func bannerAdDidShow(bannerAd: VPBannerAd) ///广告被关闭 @objc optional func bannerAdDidDismiss(bannerAd: VPBannerAd) ///广告被点击 @objc optional func bannerAdDidClick(ad: VPBannerAd) } @objc protocol VPBannerAd: NSObjectProtocol { weak var delegate: VPBannerAdDelegate? { get set } var adView: UIView { get } var adPlatformKey: String { get } var adUnitID: String { get } func loadAd() } class VPBannerAdManager: NSObject { let size = CGSize.init(width: UIScreen.width, height: 59) var videoInfo: VPVideoInfoModel? private var adsDate: Date? private(set) lazy var bannerAd: VPBannerAd = { let ad = VPApplovinBannerAd() ad.delegate = self return ad }() var adView: UIView { return bannerAd.adView } deinit { NotificationCenter.default.removeObserver(self) } override init() { super.init() NotificationCenter.default.addObserver(self, selector: #selector(didEnterBackgroundNotification), name: UIApplication.didEnterBackgroundNotification, object: nil) bannerAd.loadAd() } } //MARK: -------------- VPBannerAdDelegate -------------- extension VPBannerAdManager: VPBannerAdDelegate { ///广告加载失败 func bannerAd(bannerAd: VPBannerAd, didLoadFail error: Error) { requestStatAd(type: "load_failed", errorMsg: error.localizedDescription) } ///广告加载成功 func bannerAdDidLoadFinish(bannerAd: VPBannerAd) { adsDate = Date() requestStatAd(type: "start", errorMsg: nil) } ///广告被展示 func bannerAdDidShow(bannerAd: VPBannerAd) { } ///广告被关闭 func bannerAdDidDismiss(bannerAd: VPBannerAd) { requestStatAd(type: "close", errorMsg: nil) } ///广告被点击 func bannerAdDidClick(ad: VPBannerAd) { requestStatAd(type: "click", errorMsg: nil) } } extension VPBannerAdManager { func requestStatAd(type: String, errorMsg: String?) { var seconds = 0 if let adsDate = self.adsDate { if type == "click" || type == "close" { seconds = Int(Date().timeIntervalSince(adsDate)) } } if type == "close" && self.adsDate == nil { return } let model = VPStatAdModel() model.view_seconds = seconds model.type = type model.ads_id = bannerAd.adUnitID model.ad_platform_key = VPAdPlatformKey(rawValue: bannerAd.adPlatformKey) model.error_msg = errorMsg model.scene = .banner model.short_play_id = self.videoInfo?.short_play_id model.short_play_video_id = self.videoInfo?.short_play_video_id VPStatAPI.requestStatAd(model: model) } @objc private func didEnterBackgroundNotification() { self.requestStatAd(type: "Interrupt", errorMsg: nil) } }