开屏广告统计
This commit is contained in:
parent
cc918f56d9
commit
5d8529dd95
@ -143,4 +143,10 @@ extension FABannerAdManager: FABannerAdDelegate {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
extension FABannerAdManager {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,6 +22,7 @@ class FAAdManager: NSObject {
|
|||||||
case reward = "reward"
|
case reward = "reward"
|
||||||
case splash = "splash"
|
case splash = "splash"
|
||||||
case banner = "banner"
|
case banner = "banner"
|
||||||
|
case open = "open"
|
||||||
}
|
}
|
||||||
|
|
||||||
static func initSdk() {
|
static func initSdk() {
|
||||||
|
|||||||
@ -20,6 +20,6 @@ class FAUploadAdsPriceModel: NSObject, SmartCodable {
|
|||||||
var alliance_name: String?
|
var alliance_name: String?
|
||||||
var money: String?
|
var money: String?
|
||||||
var scene: FAAdManager.BusinessScene?
|
var scene: FAAdManager.BusinessScene?
|
||||||
|
var currency: String = "USD"
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,10 +23,12 @@ import UIKit
|
|||||||
}
|
}
|
||||||
|
|
||||||
protocol FAOpenAdDelegate: NSObjectProtocol {
|
protocol FAOpenAdDelegate: NSObjectProtocol {
|
||||||
func fa_openAd(ad: FAOpenAd, didLoadFail error: Error)
|
|
||||||
|
func fa_openAdDidStartLoad(ad: FAOpenAd)
|
||||||
func fa_openAdDidLoadFinish(ad: FAOpenAd)
|
func fa_openAdDidLoadFinish(ad: FAOpenAd)
|
||||||
|
func fa_openAd(ad: FAOpenAd, didLoadFail error: Error)
|
||||||
func fa_openAd(ad: FAOpenAd, didDisplayFail error: Error)
|
func fa_openAd(ad: FAOpenAd, didDisplayFail error: Error)
|
||||||
func fa_openAdDidShow(ad: FAOpenAd)
|
func fa_openAdDidShow(ad: FAOpenAd, adInfo: [AnyHashable : Any])
|
||||||
func fa_openAdDidDismiss(ad: FAOpenAd)
|
func fa_openAdDidDismiss(ad: FAOpenAd)
|
||||||
func fa_openAdDidClick(ad: FAOpenAd)
|
func fa_openAdDidClick(ad: FAOpenAd)
|
||||||
}
|
}
|
||||||
@ -36,6 +38,7 @@ protocol FAOpenAd: NSObjectProtocol {
|
|||||||
var adPlatform: FAAdPlatform { get }
|
var adPlatform: FAAdPlatform { get }
|
||||||
var adType: FAAdType { get }
|
var adType: FAAdType { get }
|
||||||
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()
|
||||||
@ -67,6 +70,10 @@ class FAOpenAdManager: NSObject {
|
|||||||
private(set) var isWaitingToShow = false
|
private(set) var isWaitingToShow = false
|
||||||
private var timeOutTimer: Timer?
|
private var timeOutTimer: Timer?
|
||||||
|
|
||||||
|
private var startShowDate: Date?
|
||||||
|
private var startLoadDate: Date?
|
||||||
|
private var endLoadDate: Date?
|
||||||
|
|
||||||
var isAdAvailable: Bool {
|
var isAdAvailable: Bool {
|
||||||
return appOpenAd?.isReady ?? false
|
return appOpenAd?.isReady ?? false
|
||||||
}
|
}
|
||||||
@ -128,6 +135,8 @@ class FAOpenAdManager: NSObject {
|
|||||||
showAd()
|
showAd()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
self.startLoadDate = nil
|
||||||
|
self.endLoadDate = nil
|
||||||
|
|
||||||
// 2. 如果没有就绪,标记等待并开始加载,同时开启超时保护
|
// 2. 如果没有就绪,标记等待并开始加载,同时开启超时保护
|
||||||
isWaitingToShow = true
|
isWaitingToShow = true
|
||||||
@ -168,17 +177,25 @@ class FAOpenAdManager: NSObject {
|
|||||||
// MARK: - BRAppOpenAdDelegate
|
// MARK: - BRAppOpenAdDelegate
|
||||||
extension FAOpenAdManager: FAOpenAdDelegate {
|
extension FAOpenAdManager: FAOpenAdDelegate {
|
||||||
|
|
||||||
|
func fa_openAdDidStartLoad(ad: any FAOpenAd) {
|
||||||
|
self.startLoadDate = Date()
|
||||||
|
self.uploadAdsHistory(ad: ad, type: "startLoad")
|
||||||
|
}
|
||||||
|
|
||||||
func fa_openAd(ad: FAOpenAd, didLoadFail error: Error) {
|
func fa_openAd(ad: FAOpenAd, didLoadFail error: Error) {
|
||||||
|
self.endLoadDate = Date()
|
||||||
isLoadingAd = false
|
isLoadingAd = false
|
||||||
isWaitingToShow = false
|
isWaitingToShow = false
|
||||||
appOpenAd = nil
|
appOpenAd = nil
|
||||||
clearTimer()
|
clearTimer()
|
||||||
requestStatAd(type: "load_failed", errorMsg: error.localizedDescription)
|
uploadAdsHistory(ad: ad, type: "load_failed", 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()
|
||||||
isLoadingAd = false
|
isLoadingAd = false
|
||||||
|
self.uploadAdsHistory(ad: ad, type: "endLoad")
|
||||||
delegate?.fa_openAdManagerDidLoadFinish?(manager: self)
|
delegate?.fa_openAdManagerDidLoadFinish?(manager: self)
|
||||||
|
|
||||||
// 如果之前处于等待展示状态,现在立即展示
|
// 如果之前处于等待展示状态,现在立即展示
|
||||||
@ -193,18 +210,26 @@ extension FAOpenAdManager: FAOpenAdDelegate {
|
|||||||
isWaitingToShow = false
|
isWaitingToShow = false
|
||||||
appOpenAd = nil
|
appOpenAd = nil
|
||||||
clearTimer()
|
clearTimer()
|
||||||
requestStatAd(type: "show_failed", errorMsg: error.localizedDescription)
|
uploadAdsHistory(ad: ad, type: "show_failed", errorMsg: error.localizedDescription)
|
||||||
delegate?.fa_openAdManager?(manager: self, didDisplayFail: error)
|
delegate?.fa_openAdManager?(manager: self, didDisplayFail: error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func fa_openAdDidShow(ad: FAOpenAd) {
|
func fa_openAdDidShow(ad: any FAOpenAd, adInfo: [AnyHashable : Any]) {
|
||||||
requestStatAd(type: "start", errorMsg: nil)
|
self.startShowDate = Date()
|
||||||
|
self.uploadAdsHistory(ad: ad, type: "start", viewSeconds: 0)
|
||||||
|
self.requestUploadAdsPrice(ad: ad, adInfo: adInfo)
|
||||||
delegate?.fa_openAdManagerDidShow?(manager: self)
|
delegate?.fa_openAdManagerDidShow?(manager: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
func fa_openAdDidDismiss(ad: FAOpenAd) {
|
func fa_openAdDidDismiss(ad: FAOpenAd) {
|
||||||
isShowingAd = false
|
isShowingAd = false
|
||||||
appOpenAd = nil
|
appOpenAd = nil
|
||||||
|
var viewSeconds: Int? = nil
|
||||||
|
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秒后开始加载
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now() + 10) { [weak self] in
|
DispatchQueue.main.asyncAfter(deadline: .now() + 10) { [weak self] in
|
||||||
@ -214,30 +239,27 @@ extension FAOpenAdManager: FAOpenAdDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func fa_openAdDidClick(ad: FAOpenAd) {
|
func fa_openAdDidClick(ad: FAOpenAd) {
|
||||||
requestStatAd(type: "click", errorMsg: nil)
|
var viewSeconds: Int? = nil
|
||||||
|
if let startShowDate = self.startShowDate {
|
||||||
|
viewSeconds = Int(Date().timeIntervalSince(startShowDate))
|
||||||
|
}
|
||||||
|
self.uploadAdsHistory(ad: ad, type: "click", viewSeconds: viewSeconds)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Statistics
|
// MARK: - Statistics
|
||||||
extension FAOpenAdManager {
|
extension FAOpenAdManager {
|
||||||
private func requestStatAd(type: String, errorMsg: String?) {
|
|
||||||
guard let appOpenAd = appOpenAd else { return }
|
|
||||||
|
|
||||||
// let model = SPStatAdModel()
|
|
||||||
// model.type = type
|
|
||||||
// model.ads_id = appOpenAd.adUnitID
|
|
||||||
// model.ad_platform_key = SPAdPlatformKey(rawValue: appOpenAd.adPlatformKey)
|
|
||||||
// model.error_msg = errorMsg
|
|
||||||
// model.scene = .splash
|
|
||||||
//
|
|
||||||
// SPStatAPI.requestStatAd(model: model)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
@objc private func didEnterBackgroundNotification() {
|
@objc private func didEnterBackgroundNotification() {
|
||||||
if !self.isShowingAd { return }
|
if !self.isShowingAd { return }
|
||||||
|
guard let ad = self.appOpenAd else { return }
|
||||||
|
|
||||||
self.requestStatAd(type: "Interrupt", errorMsg: nil)
|
var viewSeconds: Int? = nil
|
||||||
|
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() {
|
||||||
@ -246,4 +268,41 @@ extension FAOpenAdManager {
|
|||||||
self.showAd()
|
self.showAd()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func uploadAdsHistory(ad: any FAOpenAd, type: String, viewSeconds: Int? = nil, errorMsg: String? = nil) {
|
||||||
|
var loadTime: Int?
|
||||||
|
if let startDate = self.startLoadDate, let endDate = self.endLoadDate {
|
||||||
|
loadTime = Int(endDate.timeIntervalSince(startDate))
|
||||||
|
}
|
||||||
|
|
||||||
|
let model = FAAdStatModel()
|
||||||
|
model.scene = .open
|
||||||
|
if let loadTime = loadTime {
|
||||||
|
model.loading_time = max(0, loadTime)
|
||||||
|
}
|
||||||
|
model.view_seconds = viewSeconds
|
||||||
|
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 FAOpenAd, 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 = .open
|
||||||
|
|
||||||
|
FAStatAPI.requestUploadAdsPrice(model: model)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,6 +29,8 @@ class FATradPlusOpenAd: NSObject, FAOpenAd {
|
|||||||
var adUnitID: String {
|
var adUnitID: String {
|
||||||
return self.adPlatform.openUnitId
|
return self.adPlatform.openUnitId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var networkName: String = ""
|
||||||
|
|
||||||
var isReady: Bool {
|
var isReady: Bool {
|
||||||
#if canImport(TradPlusAds)
|
#if canImport(TradPlusAds)
|
||||||
@ -78,7 +80,12 @@ class FATradPlusOpenAd: NSObject, FAOpenAd {
|
|||||||
// MARK: - TradPlusADSplashDelegate
|
// MARK: - TradPlusADSplashDelegate
|
||||||
extension FATradPlusOpenAd: TradPlusADSplashDelegate {
|
extension FATradPlusOpenAd: TradPlusADSplashDelegate {
|
||||||
|
|
||||||
|
func tpSplashAdStartLoad(_ adInfo: [AnyHashable : Any]) {
|
||||||
|
self.delegate?.fa_openAdDidStartLoad(ad: self)
|
||||||
|
}
|
||||||
|
|
||||||
func tpSplashAdLoaded(_ adInfo: [AnyHashable : Any]) {
|
func tpSplashAdLoaded(_ adInfo: [AnyHashable : Any]) {
|
||||||
|
self.networkName = (adInfo["adNetworkName"] as? String) ?? "unknown"
|
||||||
self.delegate?.fa_openAdDidLoadFinish(ad: self)
|
self.delegate?.fa_openAdDidLoadFinish(ad: self)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,7 +95,7 @@ extension FATradPlusOpenAd: TradPlusADSplashDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func tpSplashAdImpression(_ adInfo: [AnyHashable : Any]) {
|
func tpSplashAdImpression(_ adInfo: [AnyHashable : Any]) {
|
||||||
self.delegate?.fa_openAdDidShow(ad: self)
|
self.delegate?.fa_openAdDidShow(ad: self, adInfo: adInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
func tpSplashAdShow(_ adInfo: [AnyHashable : Any], didFailWithError error: Error) {
|
func tpSplashAdShow(_ adInfo: [AnyHashable : Any], didFailWithError error: Error) {
|
||||||
|
|||||||
@ -112,6 +112,8 @@ class FARewardedAdManager: NSObject {
|
|||||||
}
|
}
|
||||||
if self.isAdAvailable { return }
|
if self.isAdAvailable { return }
|
||||||
if self.isLoadingAd { return }
|
if self.isLoadingAd { return }
|
||||||
|
self.startLoadDate = nil
|
||||||
|
self.endLoadDate = nil
|
||||||
|
|
||||||
self.isLoadingAd = true
|
self.isLoadingAd = true
|
||||||
|
|
||||||
@ -144,7 +146,6 @@ extension FARewardedAdManager: FARewardedAdDelegate {
|
|||||||
self.isLoadingAd = false
|
self.isLoadingAd = false
|
||||||
self.uploadAdsHistory(ad: ad, type: "load_failed", errorMsg: error.localizedDescription)
|
self.uploadAdsHistory(ad: ad, type: "load_failed", errorMsg: error.localizedDescription)
|
||||||
self.delegate?.fa_rewardedAdManager?(adManager: self, didLoadFail: error)
|
self.delegate?.fa_rewardedAdManager?(adManager: self, didLoadFail: error)
|
||||||
self.endLoadDate = nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func fa_rewardedAd(ad: any FARewardedAd, didDisplayFail error: any Error) {
|
func fa_rewardedAd(ad: any FARewardedAd, didDisplayFail error: any Error) {
|
||||||
@ -164,7 +165,6 @@ extension FARewardedAdManager: FARewardedAdDelegate {
|
|||||||
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)
|
||||||
self.endLoadDate = nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func fa_rewardedAdDidShow(ad: any FARewardedAd, adInfo: [AnyHashable : Any]) {
|
func fa_rewardedAdDidShow(ad: any FARewardedAd, adInfo: [AnyHashable : Any]) {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user