Veloria/Veloria/Libs/AdManager/Banner/VPBannerAdManager.swift
2025-07-17 19:43:53 +08:00

132 lines
3.4 KiB
Swift

//
// 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)
}
}