// // MabAnalyticsEvents.swift // Pods // // Created by 250102 on 2025/5/10. // // 单例实现 internal class MabAnalyticEvents { // 单例访问点 static let shared = MabAnalyticEvents() // 私有初始化方法确保单例模式 private init() {} static func faLoad( faUnitId: String, adType: AdType, aggregatorId: String, adUnitId: String, requestReason: RequestReason? ) { var params: [String: Any] = [:] params["fa_unitid"] = faUnitId params["aggregator_id"] = aggregatorId if let requestReason = requestReason { params["req_type"] = requestReason.statsName } params["ad_format"] = adType.label params["ad_unit_name"] = shrink(adUnitId) AnalyticsEvents.shared.onEvent(name: "fa_load", param: params) } static func faLoaded( faUnitId: String, adType: AdType, adSource: String?, aggregatorId: String, adUnitId: String, durationInMillis: Int64? ) { guard let durationInMillis = durationInMillis else { return } AnalyticsEvents.shared.onEvent( name: "fa_loaded", pairs: ("fa_unitid", faUnitId), ("aggregator_id", aggregatorId), ("ad_format", adType.label), ("duration", durationInMillis), ("ad_unit_name", shrink(adUnitId)), ("ad_source", (adSource ?? "unknown")) ) } static func faFailed( faUnitId: String, adType: AdType, aggregatorId: String, adUnitId: String, durationInMillis: Int64?, errorCode: Int ) { guard let durationInMillis = durationInMillis else { return } AnalyticsEvents.shared.onEvent( name: "fa_failed", pairs: ("fa_unitid", faUnitId), ("aggregator_id", aggregatorId), ("ad_format", adType.label), ("duration", durationInMillis), ("ad_unit_name", shrink(adUnitId)), ("error_code", errorCode) ) } /** * 精简adUnitId以便于不过多占用打点数据包 */ private static func shrink(_ adUnitId: String) -> String { // shrink a adUnitId from AdMob to a shorter form, // for example, ca-app-pub-2436733915645843/9966308712 // shrink("ca-app-pub-2436733915645843/9966308712") == "9966308712" if adUnitId.hasPrefix("ca-app-pub-") && adUnitId.count == 38 && adUnitId[adUnitId.index(adUnitId.startIndex, offsetBy: 27)] == "/" { return String(adUnitId.suffix(10)) } // no need to shrink return adUnitId } }