广告事件统计
This commit is contained in:
parent
5d8529dd95
commit
e0160146e3
@ -24,16 +24,17 @@ import UIKit
|
|||||||
|
|
||||||
|
|
||||||
protocol FABannerAdDelegate: NSObjectProtocol {
|
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)
|
func fa_bannerAdDidClick(ad: FABannerAd)
|
||||||
}
|
}
|
||||||
@ -50,6 +51,8 @@ protocol FABannerAd: NSObjectProtocol {
|
|||||||
|
|
||||||
var adUnitID: String { get }
|
var adUnitID: String { get }
|
||||||
|
|
||||||
|
var networkName: String { get set }
|
||||||
|
|
||||||
var isReady: Bool { get set }
|
var isReady: Bool { get set }
|
||||||
|
|
||||||
func loadAd()
|
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 {
|
var isAdAvailable: Bool {
|
||||||
if FALogin.manager.userInfo?.user_level == .ad {
|
if FALogin.manager.userInfo?.user_level == .ad {
|
||||||
return bannerAd?.isReady ?? false
|
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() {
|
func loadAd() {
|
||||||
guard FALogin.manager.userInfo?.user_level == .ad else {
|
guard FALogin.manager.userInfo?.user_level == .ad else {
|
||||||
let error = NSError(domain: "非广告用户", code: -1)
|
let error = NSError(domain: "非广告用户", code: -1)
|
||||||
self.delegate?.fa_bannerAdManager?(manager: self, didLoadFail: error)
|
self.delegate?.fa_bannerAdManager?(manager: self, didLoadFail: error)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
self.cleanAd()
|
||||||
|
|
||||||
let ad = FATradPlusBannerAd()
|
let ad = FATradPlusBannerAd()
|
||||||
ad.delegate = self
|
ad.delegate = self
|
||||||
@ -102,6 +121,9 @@ class FABannerAdManager: NSObject {
|
|||||||
|
|
||||||
func cleanAd() {
|
func cleanAd() {
|
||||||
self.bannerAd = nil
|
self.bannerAd = nil
|
||||||
|
self.isShowingAd = false
|
||||||
|
self.startLoadDate = nil
|
||||||
|
self.endLoadDate = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
private func updateLayout() {
|
private func updateLayout() {
|
||||||
@ -117,27 +139,43 @@ class FABannerAdManager: NSObject {
|
|||||||
//MARK: FABannerAdManager
|
//MARK: FABannerAdManager
|
||||||
extension FABannerAdManager: FABannerAdDelegate {
|
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)
|
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)
|
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)
|
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)
|
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)
|
self.delegate?.fa_bannerAdManagerDidDismiss?(manager: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
func fa_bannerAdDidClick(ad: any FABannerAd) {
|
func fa_bannerAdDidClick(ad: any FABannerAd) {
|
||||||
|
self.uploadAdsHistory(ad: ad, type: .click)
|
||||||
self.delegate?.fa_bannerAdManagerDidClick?(manager: self)
|
self.delegate?.fa_bannerAdManagerDidClick?(manager: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -147,6 +185,54 @@ extension FABannerAdManager: FABannerAdDelegate {
|
|||||||
|
|
||||||
extension FABannerAdManager {
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -46,6 +46,8 @@ class FATradPlusBannerAd: NSObject, FABannerAd {
|
|||||||
return self.adPlatform.bannerUnitId
|
return self.adPlatform.bannerUnitId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var networkName: String = ""
|
||||||
|
|
||||||
func loadAd() {
|
func loadAd() {
|
||||||
#if canImport(TradPlusAds)
|
#if canImport(TradPlusAds)
|
||||||
self.bannerView.setAdUnitID(self.adUnitID)
|
self.bannerView.setAdUnitID(self.adUnitID)
|
||||||
@ -58,23 +60,28 @@ class FATradPlusBannerAd: NSObject, FABannerAd {
|
|||||||
#if canImport(TradPlusAds)
|
#if canImport(TradPlusAds)
|
||||||
extension FATradPlusBannerAd: TradPlusADBannerDelegate {
|
extension FATradPlusBannerAd: TradPlusADBannerDelegate {
|
||||||
|
|
||||||
|
func tpBannerAdStartLoad(_ adInfo: [AnyHashable : Any]) {
|
||||||
|
self.delegate?.fa_bannerAdDidStartLoad(ad: self)
|
||||||
|
}
|
||||||
|
|
||||||
func tpBannerAdLoaded(_ adInfo: [AnyHashable : Any]) {
|
func tpBannerAdLoaded(_ adInfo: [AnyHashable : Any]) {
|
||||||
self.isReady = true
|
self.isReady = true
|
||||||
|
self.networkName = (adInfo["adNetworkName"] as? String) ?? "unknown"
|
||||||
debugLog("+++++++++++广告加载成功")
|
debugLog("+++++++++++广告加载成功")
|
||||||
self.delegate?.fa_bannerAdDidLoadFinish(bannerAd: self)
|
self.delegate?.fa_bannerAdDidLoadFinish(ad: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
func tpBannerAdLoadFailWithError(_ error: any Error) {
|
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]) {
|
func tpBannerAdImpression(_ adInfo: [AnyHashable : Any]) {
|
||||||
debugLog("+++++++++++广告加载展示成功")
|
debugLog("+++++++++++广告加载展示成功")
|
||||||
self.delegate?.fa_bannerAdDidShow(bannerAd: self)
|
self.delegate?.fa_bannerAdDidShow(ad: self, adInfo: adInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
func tpBannerAdShow(_ adInfo: [AnyHashable : Any], didFailWithError error: any Error) {
|
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]) {
|
func tpBannerAdClicked(_ adInfo: [AnyHashable : Any]) {
|
||||||
|
|||||||
@ -23,6 +23,18 @@ class FAAdManager: NSObject {
|
|||||||
case splash = "splash"
|
case splash = "splash"
|
||||||
case banner = "banner"
|
case banner = "banner"
|
||||||
case open = "open"
|
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() {
|
static func initSdk() {
|
||||||
|
|||||||
@ -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 ads_id: String?
|
||||||
var view_seconds: Int?
|
var view_seconds: Int?
|
||||||
var loading_time: Int?
|
var loading_time: Int?
|
||||||
|
|||||||
@ -24,18 +24,19 @@ import UIKit
|
|||||||
|
|
||||||
|
|
||||||
protocol FANativeAdDelegate: NSObjectProtocol {
|
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 {
|
protocol FANativeAd: NSObjectProtocol {
|
||||||
@ -52,6 +53,8 @@ protocol FANativeAd: NSObjectProtocol {
|
|||||||
|
|
||||||
var adUnitID: String { get }
|
var adUnitID: String { get }
|
||||||
|
|
||||||
|
var networkName: String { get set }
|
||||||
|
|
||||||
var isReady: Bool { get }
|
var isReady: Bool { get }
|
||||||
|
|
||||||
func loadAd()
|
func loadAd()
|
||||||
@ -83,10 +86,16 @@ class FANativeAdManager: NSObject {
|
|||||||
|
|
||||||
///广告是否在加载中
|
///广告是否在加载中
|
||||||
private(set) var isLoadingAd = false
|
private(set) var isLoadingAd = false
|
||||||
|
///广告正在被展示
|
||||||
|
private(set) var isShowingAd = false
|
||||||
|
|
||||||
///是否展示过
|
///是否展示过
|
||||||
var hasShow = false
|
var hasShow = false
|
||||||
|
|
||||||
|
private var startShowDate: Date?
|
||||||
|
private var startLoadDate: Date?
|
||||||
|
private var endLoadDate: Date?
|
||||||
|
|
||||||
|
|
||||||
private var nativeAd: FANativeAd? {
|
private var nativeAd: FANativeAd? {
|
||||||
didSet {
|
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() {
|
func load() {
|
||||||
@ -121,6 +138,7 @@ class FANativeAdManager: NSObject {
|
|||||||
}
|
}
|
||||||
guard !hasShow, self.isAdAvailable else { return }
|
guard !hasShow, self.isAdAvailable else { return }
|
||||||
|
|
||||||
|
self.isShowingAd = true
|
||||||
self.hasShow = true
|
self.hasShow = true
|
||||||
self.nativeAd?.show()
|
self.nativeAd?.show()
|
||||||
}
|
}
|
||||||
@ -129,32 +147,100 @@ class FANativeAdManager: NSObject {
|
|||||||
|
|
||||||
extension FANativeAdManager: FANativeAdDelegate {
|
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.isLoadingAd = false
|
||||||
|
self.endLoadDate = Date()
|
||||||
|
self.uploadAdsHistory(ad: ad, type: .endLoad)
|
||||||
self.delegate?.fa_nativeAdManagerDidLoadFinish?(manager: self)
|
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)
|
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.isLoadingAd = false
|
||||||
|
self.endLoadDate = Date()
|
||||||
|
uploadAdsHistory(ad: ad, type: .loadFailed, errorMsg: error.localizedDescription)
|
||||||
self.delegate?.fa_nativeAdManager?(manager: self, didLoadFail: error)
|
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)
|
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)
|
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)
|
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)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -34,6 +34,8 @@ class FATradPlusNativeAd: NSObject, FANativeAd {
|
|||||||
return adPlatform.nativeUnitId
|
return adPlatform.nativeUnitId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var networkName: String = ""
|
||||||
|
|
||||||
var isReady: Bool {
|
var isReady: Bool {
|
||||||
#if canImport(TradPlusAds)
|
#if canImport(TradPlusAds)
|
||||||
return self.nativeAd?.isAdReady ?? false
|
return self.nativeAd?.isAdReady ?? false
|
||||||
@ -75,28 +77,33 @@ class FATradPlusNativeAd: NSObject, FANativeAd {
|
|||||||
#if canImport(TradPlusAds)
|
#if canImport(TradPlusAds)
|
||||||
extension FATradPlusNativeAd: TradPlusADNativeDelegate {
|
extension FATradPlusNativeAd: TradPlusADNativeDelegate {
|
||||||
|
|
||||||
|
func tpNativeAdStartLoad(_ adInfo: [AnyHashable : Any]) {
|
||||||
|
self.delegate?.fa_nativeAdDidStartLoad(ad: self)
|
||||||
|
}
|
||||||
|
|
||||||
func tpNativeAdLoaded(_ adInfo: [AnyHashable : Any]) {
|
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]) {
|
func tpNativeAdImpression(_ adInfo: [AnyHashable : Any]) {
|
||||||
self.delegate?.fa_nativeAdDidShow(nativeAd: self)
|
self.delegate?.fa_nativeAdDidShow(ad: self, adInfo: adInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
func tpNativeAdLoadFailWithError(_ error: any Error) {
|
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) {
|
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]) {
|
func tpNativeAdClicked(_ adInfo: [AnyHashable : Any]) {
|
||||||
self.delegate?.fa_nativeAdDidClick(nativeAd: self)
|
self.delegate?.fa_nativeAdDidClick(ad: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
func tpNativeAdClose(_ adInfo: [AnyHashable : Any]) {
|
func tpNativeAdClose(_ adInfo: [AnyHashable : Any]) {
|
||||||
self.delegate?.fa_nativeAdDidDismiss(nativeAd: self)
|
self.delegate?.fa_nativeAdDidDismiss(ad: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -179,7 +179,7 @@ extension FAOpenAdManager: FAOpenAdDelegate {
|
|||||||
|
|
||||||
func fa_openAdDidStartLoad(ad: any FAOpenAd) {
|
func fa_openAdDidStartLoad(ad: any FAOpenAd) {
|
||||||
self.startLoadDate = Date()
|
self.startLoadDate = Date()
|
||||||
self.uploadAdsHistory(ad: ad, type: "startLoad")
|
self.uploadAdsHistory(ad: ad, type: .startLoad)
|
||||||
}
|
}
|
||||||
|
|
||||||
func fa_openAd(ad: FAOpenAd, didLoadFail error: Error) {
|
func fa_openAd(ad: FAOpenAd, didLoadFail error: Error) {
|
||||||
@ -188,14 +188,14 @@ extension FAOpenAdManager: FAOpenAdDelegate {
|
|||||||
isWaitingToShow = false
|
isWaitingToShow = false
|
||||||
appOpenAd = nil
|
appOpenAd = nil
|
||||||
clearTimer()
|
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)
|
delegate?.fa_openAdManager?(manager: self, didLoadFail: error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func fa_openAdDidLoadFinish(ad: FAOpenAd) {
|
func fa_openAdDidLoadFinish(ad: FAOpenAd) {
|
||||||
self.endLoadDate = Date()
|
self.endLoadDate = Date()
|
||||||
isLoadingAd = false
|
isLoadingAd = false
|
||||||
self.uploadAdsHistory(ad: ad, type: "endLoad")
|
self.uploadAdsHistory(ad: ad, type: .endLoad)
|
||||||
delegate?.fa_openAdManagerDidLoadFinish?(manager: self)
|
delegate?.fa_openAdManagerDidLoadFinish?(manager: self)
|
||||||
|
|
||||||
// 如果之前处于等待展示状态,现在立即展示
|
// 如果之前处于等待展示状态,现在立即展示
|
||||||
@ -210,13 +210,13 @@ extension FAOpenAdManager: FAOpenAdDelegate {
|
|||||||
isWaitingToShow = false
|
isWaitingToShow = false
|
||||||
appOpenAd = nil
|
appOpenAd = nil
|
||||||
clearTimer()
|
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)
|
delegate?.fa_openAdManager?(manager: self, didDisplayFail: error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func fa_openAdDidShow(ad: any FAOpenAd, adInfo: [AnyHashable : Any]) {
|
func fa_openAdDidShow(ad: any FAOpenAd, adInfo: [AnyHashable : Any]) {
|
||||||
self.startShowDate = Date()
|
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.requestUploadAdsPrice(ad: ad, adInfo: adInfo)
|
||||||
delegate?.fa_openAdManagerDidShow?(manager: self)
|
delegate?.fa_openAdManagerDidShow?(manager: self)
|
||||||
}
|
}
|
||||||
@ -224,11 +224,7 @@ extension FAOpenAdManager: FAOpenAdDelegate {
|
|||||||
func fa_openAdDidDismiss(ad: FAOpenAd) {
|
func fa_openAdDidDismiss(ad: FAOpenAd) {
|
||||||
isShowingAd = false
|
isShowingAd = false
|
||||||
appOpenAd = nil
|
appOpenAd = nil
|
||||||
var viewSeconds: Int? = nil
|
self.uploadAdsHistory(ad: ad, type: .close)
|
||||||
if let startShowDate = self.startShowDate {
|
|
||||||
viewSeconds = Int(Date().timeIntervalSince(startShowDate))
|
|
||||||
}
|
|
||||||
self.uploadAdsHistory(ad: ad, type: "close", viewSeconds: viewSeconds)
|
|
||||||
|
|
||||||
delegate?.fa_openAdManagerDidDismiss?(manager: self)
|
delegate?.fa_openAdManagerDidDismiss?(manager: self)
|
||||||
// 关闭后自动预加载下一条,5秒后开始加载
|
// 关闭后自动预加载下一条,5秒后开始加载
|
||||||
@ -239,11 +235,7 @@ extension FAOpenAdManager: FAOpenAdDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func fa_openAdDidClick(ad: FAOpenAd) {
|
func fa_openAdDidClick(ad: FAOpenAd) {
|
||||||
var viewSeconds: Int? = nil
|
self.uploadAdsHistory(ad: ad, type: .click)
|
||||||
if let startShowDate = self.startShowDate {
|
|
||||||
viewSeconds = Int(Date().timeIntervalSince(startShowDate))
|
|
||||||
}
|
|
||||||
self.uploadAdsHistory(ad: ad, type: "click", viewSeconds: viewSeconds)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -255,11 +247,7 @@ extension FAOpenAdManager {
|
|||||||
if !self.isShowingAd { return }
|
if !self.isShowingAd { return }
|
||||||
guard let ad = self.appOpenAd else { return }
|
guard let ad = self.appOpenAd else { return }
|
||||||
|
|
||||||
var viewSeconds: Int? = nil
|
self.uploadAdsHistory(ad: ad, type: .interrupt)
|
||||||
if let startShowDate = self.startShowDate {
|
|
||||||
viewSeconds = Int(Date().timeIntervalSince(startShowDate))
|
|
||||||
}
|
|
||||||
self.uploadAdsHistory(ad: ad, type: "Interrupt", viewSeconds: viewSeconds)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc private func didBecomeActiveNotification() {
|
@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?
|
var loadTime: Int?
|
||||||
if let startDate = self.startLoadDate, let endDate = self.endLoadDate {
|
if let startDate = self.startLoadDate, let endDate = self.endLoadDate {
|
||||||
loadTime = Int(endDate.timeIntervalSince(startDate))
|
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()
|
let model = FAAdStatModel()
|
||||||
model.scene = .open
|
model.scene = .open
|
||||||
if let loadTime = loadTime {
|
if let loadTime = loadTime {
|
||||||
model.loading_time = max(0, loadTime)
|
model.loading_time = max(0, loadTime)
|
||||||
}
|
}
|
||||||
model.view_seconds = viewSeconds
|
model.view_seconds = showTime
|
||||||
model.ad_type = ad.adType.rawValue
|
model.ad_type = ad.adType.rawValue
|
||||||
model.ads_id = ad.adUnitID
|
model.ads_id = ad.adUnitID
|
||||||
model.ad_platform_key = ad.adPlatform
|
model.ad_platform_key = ad.adPlatform
|
||||||
|
|||||||
@ -144,33 +144,33 @@ extension FARewardedAdManager: FARewardedAdDelegate {
|
|||||||
self.rewardedAd = nil
|
self.rewardedAd = nil
|
||||||
self.endLoadDate = Date()
|
self.endLoadDate = Date()
|
||||||
self.isLoadingAd = false
|
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)
|
self.delegate?.fa_rewardedAdManager?(adManager: self, didLoadFail: error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func fa_rewardedAd(ad: any FARewardedAd, didDisplayFail error: any Error) {
|
func fa_rewardedAd(ad: any FARewardedAd, didDisplayFail error: any Error) {
|
||||||
self.isPlaying = false
|
self.isPlaying = false
|
||||||
self.rewardedAd = nil
|
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)
|
self.delegate?.fa_rewardedAdManager?(adManager: self, didDisplayFail: error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func fa_rewardedAdDidStartLoad(ad: any FARewardedAd) {
|
func fa_rewardedAdDidStartLoad(ad: any FARewardedAd) {
|
||||||
self.startLoadDate = Date()
|
self.startLoadDate = Date()
|
||||||
self.uploadAdsHistory(ad: ad, type: "startLoad")
|
self.uploadAdsHistory(ad: ad, type: .startLoad)
|
||||||
}
|
}
|
||||||
|
|
||||||
func fa_rewardedAdDidLoadFinish(ad: any FARewardedAd) {
|
func fa_rewardedAdDidLoadFinish(ad: any FARewardedAd) {
|
||||||
self.isLoadingAd = false
|
self.isLoadingAd = false
|
||||||
self.endLoadDate = Date()
|
self.endLoadDate = Date()
|
||||||
self.uploadAdsHistory(ad: ad, type: "endLoad")
|
self.uploadAdsHistory(ad: ad, type: .endLoad)
|
||||||
self.delegate?.fa_rewardedAdManagerDidLoadFinish?(adManager: self)
|
self.delegate?.fa_rewardedAdManagerDidLoadFinish?(adManager: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
func fa_rewardedAdDidShow(ad: any FARewardedAd, adInfo: [AnyHashable : Any]) {
|
func fa_rewardedAdDidShow(ad: any FARewardedAd, adInfo: [AnyHashable : Any]) {
|
||||||
self.isPlaying = true
|
self.isPlaying = true
|
||||||
self.startShowDate = Date()
|
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.requestUploadAdsPrice(ad: ad, adInfo: adInfo)
|
||||||
self.delegate?.fa_rewardedAdManagerDidShow?(adManager: self)
|
self.delegate?.fa_rewardedAdManagerDidShow?(adManager: self)
|
||||||
}
|
}
|
||||||
@ -178,22 +178,14 @@ extension FARewardedAdManager: FARewardedAdDelegate {
|
|||||||
func fa_rewardedAdDidDismiss(ad: any FARewardedAd) {
|
func fa_rewardedAdDidDismiss(ad: any FARewardedAd) {
|
||||||
self.isPlaying = false
|
self.isPlaying = false
|
||||||
self.rewardedAd = nil
|
self.rewardedAd = nil
|
||||||
var viewSeconds: Int? = nil
|
self.uploadAdsHistory(ad: ad, type: .close)
|
||||||
if let startShowDate = self.startShowDate {
|
|
||||||
viewSeconds = Int(Date().timeIntervalSince(startShowDate))
|
|
||||||
}
|
|
||||||
self.uploadAdsHistory(ad: ad, type: "close", viewSeconds: viewSeconds)
|
|
||||||
self.delegate?.fa_rewardedAdManagerDidDismiss?(adManager: self, platform: ad.adPlatform.rawValue, adUnitID: ad.adUnitID)
|
self.delegate?.fa_rewardedAdManagerDidDismiss?(adManager: self, platform: ad.adPlatform.rawValue, adUnitID: ad.adUnitID)
|
||||||
//加载新的广告
|
//加载新的广告
|
||||||
self.load()
|
self.load()
|
||||||
}
|
}
|
||||||
|
|
||||||
func fa_rewardedAdDidClick(ad: any FARewardedAd) {
|
func fa_rewardedAdDidClick(ad: any FARewardedAd) {
|
||||||
var viewSeconds: Int? = nil
|
self.uploadAdsHistory(ad: ad, type: .click)
|
||||||
if let startShowDate = self.startShowDate {
|
|
||||||
viewSeconds = Int(Date().timeIntervalSince(startShowDate))
|
|
||||||
}
|
|
||||||
self.uploadAdsHistory(ad: ad, type: "click", viewSeconds: viewSeconds)
|
|
||||||
self.delegate?.fa_rewardedAdManagerDidClick?(adManager: self)
|
self.delegate?.fa_rewardedAdManagerDidClick?(adManager: self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -202,11 +194,7 @@ extension FARewardedAdManager {
|
|||||||
@objc private func didEnterBackgroundNotification() {
|
@objc private func didEnterBackgroundNotification() {
|
||||||
guard let ad = self.rewardedAd, self.isPlaying else { return }
|
guard let ad = self.rewardedAd, self.isPlaying else { return }
|
||||||
|
|
||||||
var viewSeconds: Int? = nil
|
self.uploadAdsHistory(ad: ad, type: .interrupt)
|
||||||
if let startShowDate = self.startShowDate {
|
|
||||||
viewSeconds = Int(Date().timeIntervalSince(startShowDate))
|
|
||||||
}
|
|
||||||
self.uploadAdsHistory(ad: ad, type: "Interrupt", viewSeconds: viewSeconds)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -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?
|
var loadTime: Int?
|
||||||
if let startDate = self.startLoadDate, let endDate = self.endLoadDate {
|
if let startDate = self.startLoadDate, let endDate = self.endLoadDate {
|
||||||
loadTime = Int(endDate.timeIntervalSince(startDate))
|
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()
|
let model = FAAdStatModel()
|
||||||
model.short_play_id = self.shortPlayId
|
model.short_play_id = self.shortPlayId
|
||||||
model.short_play_video_id = self.shortPlayVideoId
|
model.short_play_video_id = self.shortPlayVideoId
|
||||||
model.scene = self.businessScene
|
model.scene = self.businessScene
|
||||||
model.loading_time = loadTime
|
model.loading_time = loadTime
|
||||||
model.view_seconds = viewSeconds
|
model.view_seconds = showTime
|
||||||
model.ad_type = ad.adType.rawValue
|
model.ad_type = ad.adType.rawValue
|
||||||
model.ads_id = ad.adUnitID
|
model.ads_id = ad.adUnitID
|
||||||
model.ad_platform_key = ad.adPlatform
|
model.ad_platform_key = ad.adPlatform
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user