ThimraTV/ThimraTV/Libs/AdManager/BannerAd/SPBannerAdManager.swift
2025-07-16 17:06:13 +08:00

136 lines
3.8 KiB
Swift

//
// SPBannerAdManager.swift
// ThimraTV
//
// Created by on 2025/7/11.
//
import UIKit
import GoogleMobileAds
@objc protocol SPBannerAdManagerDelegate: NSObjectProtocol {
///广
@objc optional func bannerAdManager(adManager: SPBannerAdManager, didLoadFail error: Error)
///广
@objc optional func bannerAdManagerDidLoadFinish(adManager: SPBannerAdManager)
///广
@objc optional func bannerAdManagerDidShow(adManager: SPBannerAdManager)
///广
@objc optional func bannerAdManagerDidDismiss(adManager: SPBannerAdManager)
}
@objc protocol SPBannerAdDelegate: NSObjectProtocol {
///广
@objc optional func bannerAd(bannerAd: SPBannerAd, didLoadFail error: Error)
///广
@objc optional func bannerAdDidLoadFinish(bannerAd: SPBannerAd)
///广
@objc optional func bannerAdDidShow(bannerAd: SPBannerAd)
///广
@objc optional func bannerAdDidDismiss(bannerAd: SPBannerAd)
///广
@objc optional func bannerAdDidClick(ad: SPBannerAd)
}
@objc protocol SPBannerAd: NSObjectProtocol {
weak var delegate: SPBannerAdDelegate? { get set }
var adView: UIView { get }
var adPlatformKey: String { get }
var adUnitID: String { get }
func loadAd()
}
class SPBannerAdManager: NSObject {
let adUnitID = SPAdManager.manager.admob_bannerAdUnitID
let size = CGSize.init(width: kSPScreenWidth, height: 59)
weak var delegate: SPBannerAdManagerDelegate?
private lazy var bannerAd: SPBannerAd = {
let ad = SPAdmobBannerAd()
ad.delegate = self
return ad
}()
var view: 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: -------------- SPBannerAdDelegate --------------
extension SPBannerAdManager: SPBannerAdDelegate {
///广
func bannerAd(bannerAd: SPBannerAd, didLoadFail error: Error) {
self.requestStatAd(type: "load_failed", errorMsg: error.localizedDescription)
self.delegate?.bannerAdManager?(adManager: self, didLoadFail: error)
}
///广
func bannerAdDidLoadFinish(bannerAd: SPBannerAd) {
self.requestStatAd(type: "start", errorMsg: nil)
self.delegate?.bannerAdManagerDidLoadFinish?(adManager: self)
}
///广
func bannerAdDidShow(bannerAd: SPBannerAd) {
self.delegate?.bannerAdManagerDidShow?(adManager: self)
}
///广
func bannerAdDidDismiss(bannerAd: SPBannerAd) {
self.requestStatAd(type: "close", errorMsg: nil)
self.delegate?.bannerAdManagerDidDismiss?(adManager: self)
}
func bannerAdDidClick(ad: any SPBannerAd) {
self.requestStatAd(type: "click", errorMsg: nil)
}
}
//MARK: -------------- --------------
extension SPBannerAdManager {
func requestStatAd(type: String, errorMsg: String?) {
guard self.view.superview != nil else { return }
let model = SPStatAdModel()
model.type = type
model.ads_id = adUnitID
model.ad_platform_key = SPAdPlatformKey(rawValue: bannerAd.adPlatformKey)
model.error_msg = errorMsg
model.scene = .banner
SPStatAPI.requestStatAd(model: model)
}
@objc private func didEnterBackgroundNotification() {
self.requestStatAd(type: "Interrupt", errorMsg: nil)
}
}