// // MP_AnalyticsManager.swift // MusicPlayer // // Created by Mr.Zhou on 2024/5/30. // import UIKit import FirebaseAnalytics import FirebaseCrashlytics import FirebaseRemoteConfig import GoogleMobileAds /// 埋点管理工具 class MP_AnalyticsManager: NSObject { static let shared = MP_AnalyticsManager() //是否新用户 private var isOLD:Bool //MARK: - 配置开关 private let remoteConfig = RemoteConfig.remoteConfig() //MARK: - 事件名 //用户启动 private let user_launch:String = "user_launch" //app闪退 private let app_crash:String = "app_crash" //启动页曝光 private let launch_pv:String = "launch_pv" //fireBase配置获取成功 private let config_success_event:String = "config_success_event" //启动页计时结束点 private let launch_progress_end:String = "launch_progress_end" //跳转页面动作 private let jump_event:String = "jump_event" //A面首页曝光 private let home_a_pv:String = "home_a_pv" //B面首页曝光 private let home_b_pv:String = "home_b_pv" //首页资源曝光失败 private let home_b_module_showfailure_error:String = "home_b_module_showfailure_error" //首页资源曝光成功 private let home_b_module_showsucces_action:String = "home_b_module_showsucces_action" //点击首页模块 private let home_b_module_click:String = "home_b_module_click" //B面我的曝光 private let me_b_pv = "me_b_pv" //播放器弹出 private let song_click = "song_click" //播放器曝光 private let player_b_imp = "player_b_imp" //播放器歌曲列表加载成功 private let player_b_list = "player_b_list" //B面播放器曝光 private let player_b_pv = "player_b_pv" //统计加载时间 private let player_b_delay_action = "player_b_delay_action" //播放成功 private let player_b_success_action = "player_b_success_action" //播放失败 private let player_b_failure_error = "player_b_failure_error" //资源获取失败 private let player_resource_failure = "player_resource_failure" //点击收藏 private let player_b_love_click = "player_b_love_click" //取消收藏 private let player_b_unlove_click = "player_b_unlove_click" //点击下载 private let player_b_download_click = "player_b_download_click" //下载成功 private let player_b_downloadsuccess_action = "player_b_downloadsuccess_action" //资源下载失败 private let player_b_downloadfailure_error = "player_b_downloadfailure_error" //B面搜索曝光 private let search_pv = "search_pv" //如何进入搜索结果页 private let search_from_action = "search_from_action" //B面搜索心情流派模块点击 private let grid_mood_click = "grid_mood_click" //搜索SUG曝光 private let search_sug_show = "search_sug_show" //点击sug结果 private let search_sug_click = "search_sug_click" //搜索结果曝光 private let search_result_pv = "search_result_pv" //搜索有结果 private let search_resultsuccess_action = "search_resultsuccess_action" //创建自定义歌单 private let create_list_action = "create_list_action" //好评引导 private let guide_click = "guide_click" //曲库点击 private let library_click = "library_click" ///点击付费入口 private let VIP_click = "VIP_click" ///付费页面展示 private let VIP_page_imp = "VIP_page_imp" ///购买付费套餐 private let VIP_continue_click = "VIP_continue_click" ///购买成功 private let VIP_buy_success = "VIP_buy_success" ///购买失败 private let VIP_buy_failure = "VIP_buy_failure" ///弹出更新框 private let update_reminder_show = "update_reminder_show" ///取消更新 private let update_reminder_cancel = "update_reminder_cancel" ///确认更新 private let update_reminder_sure = "update_reminder_sure" private override init() { //获取用户是新用户还是老用户 if UserDefaults.standard.bool(forKey: "UserStatus") { //是老用户 isOLD = true }else { //新用户 isOLD = false UserDefaults.standard.setValue(true, forKey: "UserStatus") } super.init() Crashlytics.crashlytics().log(app_crash) //为配置设置默认值 remoteConfig.setDefaults(["versionCode":app_Version as NSObject, "enter":true as NSObject]) } //MARK: - 开关 ///A/B面开关(包括间隔时长更新) func getOpenStatus(_ completion:@escaping ((Bool) -> Void)) { //每次启动都要获取值 let duration:TimeInterval = 0 remoteConfig.fetch(withExpirationDuration: duration) {[weak self] status, error in guard let self = self else {return} if status == .success { print("获取配置成功,各项功能使用线上配置") config_success_eventAction() //配置获取成功 self.remoteConfig.activate { changed, error in if error == nil{ //更新启动App广告时长间隔 if let text = self.remoteConfig.configValue(forKey: "openAppEventDuration").jsonValue as? [String:Any], let seconds = text["times"] as? TimeInterval { MP_AdMobManager.shared.setOpenAppDuration(seconds) print("更新了启动App广告时长间隔") } //更新插页广告时长间隔 if let text = self.remoteConfig.configValue(forKey: "interstitialEventDuration").jsonValue as? [String:Any], let seconds = text["times"] as? TimeInterval { MP_AdMobManager.shared.setInterstitialDuration(seconds) print("更新了插页广告时长间隔") } //更新中介广告间隔 if let text = self.remoteConfig.configValue(forKey: "intermediaryEventDuration").jsonValue as? [String:Any], let seconds = text["times"] as? TimeInterval { MP_AdMobManager.shared.setIntermediaryDuration(seconds) print("更新了中介广告间隔") } //更新禁用名单 if let trashLists = self.remoteConfig.configValue(forKey: "trashLists").jsonValue as? [String:Any], let lists = trashLists["lists"] as? [[String:Any]] { //将名单中所有处于启用状态的内容提取出来 var array:[MPPositive_TrashListModel] = lists.map({.init($0)}) array = array.filter({$0.statu == true}) //将启用的禁止名单进行分发 var trashKeyWords:[String] = [] var trashSingerIDs:[String] = [] var trashVideoIDs:[String] = [] array.forEach { item in trashKeyWords.append(contentsOf: item.keyWords) trashSingerIDs.append(item.singerID) trashVideoIDs.append(contentsOf: item.videoIDs) } //去除所有为空的字符 trashKeyWords = trashKeyWords.filter({$0.isEmpty == false}) MP_NetWorkManager.shared.setTrashKeyWords(trashKeyWords) trashSingerIDs = trashSingerIDs.filter({$0.isEmpty == false}) MP_NetWorkManager.shared.setTrashSingerIds(trashSingerIDs) trashVideoIDs = trashVideoIDs.filter({$0.isEmpty == false}) MP_NetWorkManager.shared.setTrashVideoIds(trashVideoIDs) } //更新版本数据设置 if let versionData = self.remoteConfig.configValue(forKey: "dataVersion").jsonValue as? [String:String] { //对数据进行更新 for (key, value) in versionData { UserDefaults.standard.setValue(value, forKey: key) } print("更新了所有版本数据") MP_NetWorkManager.shared.reloadVersion() } //更新通知内容 if let notificationBodyTexts = self.remoteConfig.configValue(forKey: "notificationBodyTexts").jsonValue as? [String:[String]] { //对数据进行更新 for (key, value) in notificationBodyTexts { UserDefaults.standard.setValue(value, forKey: key) } print("更新了通知文本数据") //更新通知 scheduleDailyNotifications() } //是否需要弹出更新弹窗 if let updateReminder = self.remoteConfig.configValue(forKey: "updateReminder").jsonValue as? [String:Any] { //检索是否需要更新 if let statu = updateReminder["statu"] as? Bool, let version = updateReminder["versionCode"] as? String { //获得更新状态,根据更新状态确定是否需要弹出广告 if statu { //需要更新,检索当前版本是否为最新的版本 if version == app_Version { //不用更新 isUpDateReminder = false print("无需更新") }else { //需要更新 isUpDateReminder = true print("需要更新") } }else { //不用更新 isUpDateReminder = false print("无需更新") } }else { //不用更新 isUpDateReminder = false print("无需更新") } }else { //不用更新 isUpDateReminder = false print("无需更新") } let js = self.remoteConfig.configValue(forKey: "openStatus").jsonValue as! [String:Any] let value = js["versionCode"] as! String if value == app_Version { //是同一个版本,当前根据开关状态确认进入页面是什么 let open = js["enter"] as! Bool if open { //更新广告ID设置-正式版 self.reloadAdMobIDs("adMobNewLevelIDs") //进入b面 completion(true) }else { //更新广告ID设置-测试版 self.reloadAdMobIDs("lowPriceAdModIDs") //进入a面 completion(false) } }else { //不是同一个版本,直接进入B面 //更新广告ID设置-正式版 self.reloadAdMobIDs("adMobNewLevelIDs") completion(true) } } } }else { print("获取配置失败,各项功能使用默认配置") //配置获取失败,查看缓存内容 if let js = self.remoteConfig.configValue(forKey: "openStatus").jsonValue as? [String:Any] { //存在缓存数据,调用缓存数据内容 let value = js["versionCode"] as! String if value == app_Version { //是同一个版本,当前根据开关状态确认进入页面是什么 let open = js["enter"] as! Bool if open { //进入b面 completion(true) }else { //进入a面 completion(false) } }else { //不是同一个版本,直接进入B面 completion(true) } }else { //不存在,直接进入A面 completion(false) } } } } ///更新广告配置 private func reloadAdMobIDs(_ adMob:String) { //根据传入的键值决定使用什么版本的广告ID组 //更新广告ID设置 if let adTextIDs = self.remoteConfig.configValue(forKey: adMob).jsonValue as? [String:[[String:Any]]] { //对所有广告ID组进行更新 for (key, values) in adTextIDs { var array:[MPPositive_AdModelModel] = [] values.forEach { value in if let level = value["level"] as? Int, let identifier = value["identifier"] as? String, let ad = value["ad"] as? String, let item = value["type"] as? String, let type = MPPositive_AdModelType(rawValue: item) { array.append(.init(level: level, identifier: identifier, ad: ad, type: type)) } } //将array转为jsonData if array.isEmpty == false, let data = coreAdModelforJson(array) { UserDefaults.standard.removeObject(forKey: key) //重新更新内容 print("\(key)---IDs:\(array.count)") UserDefaults.standard.set(data, forKey: key) } } MP_AdMobManager.shared.reloadAdMobIDs() } } //MARK: - 事件日志 ///执行用户启动日志 func user_launchAction(){ Analytics.logEvent(user_launch, parameters: nil) } ///启动页曝光 func launch_pvAction(){ Analytics.logEvent(launch_pv, parameters: nil) } ///配置获取成功 func config_success_eventAction() { Analytics.logEvent(config_success_event, parameters: nil) } ///启动页进度结束时间 func launch_progress_endAction() { Analytics.logEvent(launch_progress_end, parameters: nil) } ///跳转事件 func jump_eventAction(_ side:String, reason:String) { Analytics.logEvent(jump_event, parameters: ["side":side, "reason":reason]) } ///A面首页曝光 func home_a_pvAction(){ Analytics.logEvent(home_a_pv, parameters: nil) } ///B面首页曝光 func home_b_pvAction(){ Analytics.logEvent(home_b_pv, parameters: nil) } ///首页资源曝光失败 func home_b_module_showfailure_errorAction(_ error:String) { Analytics.logEvent(home_b_module_showfailure_error, parameters: ["error":error]) } ///首页资源曝光成功 func home_b_module_showsucces_actionAction(){ Analytics.logEvent(home_b_module_showsucces_action, parameters: nil) } /// 点击首页模块 /// - Parameter modulename: 模块名 func home_b_module_clickAction(_ modulename:String){ Analytics.logEvent(home_b_module_click, parameters: ["modulename":modulename]) } ///B面我的曝光 func me_b_pvAction(){ Analytics.logEvent(me_b_pv, parameters: nil) } ///需要播放器弹出 func song_clickAction(_ songfrom:String) { Analytics.logEvent(song_click, parameters: ["songfrom":songfrom]) } ///B面播放器曝光 func player_b_impAction() { Analytics.logEvent(player_b_imp, parameters: nil) } ///B面列表资源加载成功 func player_b_listAction() { Analytics.logEvent(player_b_list, parameters: nil) } /// B面播放器切歌 /// - Parameters: /// - videoid: 音乐id /// - videoname: 音乐名 /// - artistname: 歌手 func player_b_pvAction(_ videoid:String, videoname:String, artistname:String){ Analytics.logEvent(player_b_pv, parameters: [ "videoid":videoid, "videoname":videoname, "artistname":artistname ]) } ///统计加载时间 /// - Parameters: /// - videoid: 音乐id /// - videoname: 音乐名 /// - artistname: 歌手 func player_b_delay_actionAction(_ videoid:String, videoname:String, artistname:String, delay:String){ Analytics.logEvent(player_b_delay_action, parameters: [ "videoid":videoid, "videoname":videoname, "artistname":artistname, "delay":delay ]) } ///播放成功 /// - Parameters: /// - videoid: 音乐id /// - videoname: 音乐名 /// - artistname: 歌手 func player_b_success_actionAction(_ videoid:String, videoname:String, artistname:String){ Analytics.logEvent(player_b_success_action, parameters: [ "videoid":videoid, "videoname":videoname, "artistname":artistname ]) } ///播放失败 func player_b_failure_errorAction(_ videoid:String, videoname:String, artistname:String, error:String) { Analytics.logEvent(player_b_failure_error, parameters: [ "videoid":videoid, "videoname":videoname, "artistname":artistname, "error":error ]) } ///资源获取失败 func player_resource_failureAction(_ code:String) { Analytics.logEvent(player_resource_failure, parameters: ["area_code":code]) } ///点击收藏 /// - Parameters: /// - videoid: 音乐id /// - videoname: 音乐名 /// - artistname: 歌手 func player_b_love_clickAction(_ videoid:String, videoname:String, artistname:String){ Analytics.logEvent(player_b_love_click, parameters: [ "videoid":videoid, "videoname":videoname, "artistname":artistname ]) } ///取消收藏 /// - Parameters: /// - videoid: 音乐id /// - videoname: 音乐名 /// - artistname: 歌手 func player_b_unlove_clickAction(_ videoid:String, videoname:String, artistname:String){ Analytics.logEvent(player_b_unlove_click, parameters: [ "videoid":videoid, "videoname":videoname, "artistname":artistname ]) } ///点击下载 /// - Parameters: /// - videoid: 音乐id /// - videoname: 音乐名 /// - artistname: 歌手 func player_b_download_clickAction(_ videoid:String, videoname:String, artistname:String){ Analytics.logEvent(player_b_download_click, parameters: [ "videoid":videoid, "videoname":videoname, "artistname":artistname ]) } ///下载成功 /// - Parameters: /// - videoid: 音乐id /// - videoname: 音乐名 /// - artistname: 歌手 func player_b_downloadsuccess_actionAction(_ videoid:String, videoname:String, artistname:String){ Analytics.logEvent(player_b_downloadsuccess_action, parameters: [ "videoid":videoid, "videoname":videoname, "artistname":artistname ]) } ///下载失败 func player_b_downloadfailure_errorAction(_ videoid:String, videoname:String, artistname:String, error:String) { Analytics.logEvent(player_b_downloadfailure_error, parameters: [ "videoid":videoid, "videoname":videoname, "artistname":artistname, "error":error ]) } ///B面搜索曝光 func search_pvAction(){ Analytics.logEvent(search_pv, parameters: nil) } ///B面搜索心情流派模块点击 func grid_mood_clickAction(_ mood:String) { Analytics.logEvent(grid_mood_click, parameters: ["mood":mood]) } ///如何进入搜索结果页 func search_from_actionAction(_ from:String) { Analytics.logEvent(search_from_action, parameters: ["search_from":from]) } ///搜索SUG曝光 func search_sug_showAction(){ Analytics.logEvent(search_sug_show, parameters: nil) } /// 点击sug结果 /// - Parameter sugname: 搜索标签名 func search_sug_clickAction(_ sugname:String){ Analytics.logEvent(search_sug_click, parameters: ["sugname":sugname]) } ///搜索结果曝光 func search_result_pvAction(){ Analytics.logEvent(search_result_pv, parameters: nil) } ///搜索有结果 func search_resultsuccess_actionAction(){ Analytics.logEvent(search_resultsuccess_action, parameters: nil) } ///创建自定义歌单 func create_list_actionAction() { Analytics.logEvent(create_list_action, parameters: nil) } ///好评引导结果 func guide_clickAction(_ result:String) { Analytics.logEvent(guide_click, parameters: ["result":result]) } ///曲库点击事件 func library_clickAction(_ click:String, folder:String) { Analytics.logEvent(library_click, parameters: ["click_from":click, "folder_click":folder]) } ///点击付费入口 func VIP_clickAction() { Analytics.logEvent(VIP_click, parameters: nil) } ///付费页面展示 func VIP_page_impAction() { Analytics.logEvent(VIP_page_imp, parameters: nil) } ///购买付费套餐 func VIP_continue_clickAction(_ productID:String) { Analytics.logEvent(VIP_continue_click, parameters: ["productID":productID]) } ///购买成功 func VIP_buy_successAction(_ productID:String) { Analytics.logEvent(VIP_buy_success, parameters: ["productID":productID]) } ///购买失败 func VIP_buy_failureAction(_ productID:String, error:String) { Analytics.logEvent(VIP_buy_failure, parameters: ["productID":productID, "buy_error":error]) } ///弹出更新框 func update_reminder_showAction() { Analytics.logEvent(update_reminder_show, parameters: nil) } ///确认更新 func update_reminder_sureAction() { Analytics.logEvent(update_reminder_sure, parameters: nil) } ///取消更新 func update_reminder_cancelAction() { Analytics.logEvent(update_reminder_cancel, parameters: nil) } //MARK: - 广告埋点事件 //冷启动展示机会 private let cold_ads_chance:String = "cold_ads_chance" //冷启动加载失败 private let cold_ads_loadFailure:String = "cold_ads_loadFailure" //冷启动展示成功 private let cold_ads_showSuccess:String = "cold_ads_showSuccess" //冷启动展示失败 private let cold_ads_showFailure:String = "cold_ads_showFailure" //冷启动关闭事件 private let cold_ads_close:String = "cold_ads_close" //热启动展示机会 private let hot_ads_chance:String = "hot_ads_chance" //热启动加载失败 private let hot_ads_loadFailure:String = "hot_ads_loadFailure" //热启动展示成功 private let hot_ads_showSuccess:String = "hot_ads_showSuccess" //热启动展示失败 private let hot_ads_showFailure:String = "hot_ads_showFailure" //搜索展示机会 private let search_ads_chance:String = "search_ads_chance" //搜索加载失败 private let search_ads_loadFailure:String = "search_ads_loadFailure" //搜索展示次数 private let search_ads_showSuccess:String = "search_ads_showSuccess" //搜索展示次数 private let search_ads_showFailure:String = "search_ads_showFailure" //搜索结果页展示机会 private let result_ads_chance:String = "result_ads_chance" //搜索结果原生 private let result_ads_show:String = "result_ads_show" //播放展示机会 private let play_ads_chance:String = "play_ads_chance" //播放加载失败 private let play_ads_loadFailure:String = "play_ads_loadFailure" //播放展示次数 private let play_ads_showSuccess:String = "play_ads_showSuccess" //播放展示次数 private let play_ads_showFailure:String = "play_ads_showFailure" //下载展示机会 private let dl_ads_chance:String = "dl_ads_chance" //下载加载失败 private let dl_ads_loadFailure:String = "dl_ads_loadFailure" //下载展示次数 private let dl_ads_showSuccess:String = "dl_ads_showSuccess" //下载展示次数 private let dl_ads_showFailure:String = "dl_ads_showFailure" //切歌展示机会 private let cut_ads_chance:String = "cut_ads_chance" //切歌加载失败 private let cut_ads_loadFailure:String = "cut_ads_loadFailure" //切歌展示次数 private let cut_ads_showSuccess:String = "cut_ads_showSuccess" //切歌展示次数 private let cut_ads_showFailure:String = "cut_ads_showFailure" //列表进入机会 private let listclk_ads_chance:String = "listclk_ads_chance" //列表加载失败 private let listclk_ads_loadFailure:String = "listclk_ads_loadFailure" //列表进入次数 private let listclk_ads_showSuccess:String = "listclk_ads_showSuccess" //列表进入次数 private let listclk_ads_showFailure:String = "listclk_ads_showFailure" //曲库原生机会 private let lbr_ads_chance:String = "lbr_ads_chance" //曲库原生次数 private let lbr_ads_show:String = "lbr_ads_show" //列表原生机会 private let list_ads_chance:String = "list_ads_chance" //列表原生次数 private let list_ads_show:String = "list_ads_show" //总价值上报 private let ad_session_total_value:String = "ad_session_total_value" //插页广告内容值转化 private func infoToParameters(_ responseInfo:GADResponseInfo, adValue:GADAdValue) -> [String:Any] { var mediation = "Unknown" if let mediation_group_name = responseInfo.extrasDictionary["mediation_group_name"] as? String { mediation = mediation_group_name } let price = valueToUSD(adValue) let priceString = String(format: "%.5f", price) //创建参数 let parameters:[String:Any] = ["CS_PLATFORM":responseInfo.loadedAdNetworkResponseInfo?.adSourceName ?? "Unknown", "CS_SOURCE":responseInfo.loadedAdNetworkResponseInfo?.adSourceInstanceName ?? "Unknown", "CS_UNIT_NAME":mediation, "CS_CURRENCY":adValue.currencyCode, "CS_VALUE":priceString, "CS_STATUS":isOLD ? "Old":"New"] return parameters } ///检索广告来源 func infoFromAdMobSource(_ responseInfo:GADResponseInfo?) -> Bool { guard let responseInfo = responseInfo else {return false} return (responseInfo.loadedAdNetworkResponseInfo?.adSourceInstanceName ?? "").contains("AdMob") } //价格转化(全部转化为美元) private func valueToUSD(_ adValue:GADAdValue) -> Double { //将价格全部转为美元 if adValue.currencyCode == "USD" { return Double(truncating: adValue.value) }else { //日后添加转化 return Double(truncating: adValue.value) } } //MARK: - 广告事件日志 ///冷启动展示机会 func cold_ads_chanceAction() { Analytics.logEvent(cold_ads_chance, parameters: ["CS_STATUS":isOLD ? "Old":"New"]) } ///冷启动加载失败 func cold_ads_loadFailureAction(_ error:String) { let parameters:[String:String] = ["CS_STATUS":isOLD ? "Old":"New", "CS_ERROR":error] Analytics.logEvent(cold_ads_loadFailure, parameters: parameters) } ///冷启动展示成功 func cold_ads_showSuccessAction(_ responseInfo:GADResponseInfo, adValue:GADAdValue) { let parameters:[String:Any] = infoToParameters(responseInfo, adValue: adValue) print("冷启动成功展示信息--\(parameters)") Analytics.logEvent(cold_ads_showSuccess, parameters: parameters) } ///冷启动展示失败 func cold_ads_showFailureAction(_ error:String) { let parameters:[String:String] = ["CS_STATUS":isOLD ? "Old":"New", "CS_ERROR":error] print("冷启动失败展示信息--\(parameters)") Analytics.logEvent(cold_ads_showFailure, parameters: parameters) } ///冷启动关闭 func cold_ads_closeAction() { let parameters:[String:String] = ["CS_STATUS":isOLD ? "Old":"New"] Analytics.logEvent(cold_ads_close, parameters: parameters) } ///热启动展示机会 func hot_ads_chanceAction() { Analytics.logEvent(hot_ads_chance, parameters: ["CS_STATUS":isOLD ? "Old":"New"]) } ///热启动加载失败 func hot_ads_loadFailureAction(_ error:String) { let parameters:[String:String] = ["CS_STATUS":isOLD ? "Old":"New", "CS_ERROR":error] Analytics.logEvent(hot_ads_loadFailure, parameters: parameters) } ///热启动展示成功 func hot_ads_showSuccessAction(_ responseInfo:GADResponseInfo, adValue:GADAdValue) { let parameters:[String:Any] = infoToParameters(responseInfo, adValue: adValue) print("热启动成功展示信息--\(parameters)") Analytics.logEvent(hot_ads_showSuccess, parameters: parameters) } ///热启动展示失败 func hot_ads_showFailureAction(_ error:String) { let parameters:[String:String] = ["CS_STATUS":isOLD ? "Old":"New", "CS_ERROR":error] print("热启动失败展示信息--\(parameters)") Analytics.logEvent(hot_ads_showFailure, parameters: parameters) } ///搜索展示机会 func search_ads_chanceAction() { Analytics.logEvent(search_ads_chance, parameters: ["CS_STATUS":isOLD ? "Old":"New"]) } ///搜索加载失败 func search_ads_loadFailureAction(_ error:String) { let parameters:[String:String] = ["CS_STATUS":isOLD ? "Old":"New", "CS_ERROR":error] Analytics.logEvent(search_ads_loadFailure, parameters: parameters) } ///搜索展示成功 func search_ads_showSuccessAction(_ responseInfo:GADResponseInfo, adValue:GADAdValue) { let parameters:[String:Any] = infoToParameters(responseInfo, adValue: adValue) print("搜索插页成功展示信息--\(parameters)") Analytics.logEvent(search_ads_showSuccess, parameters: ["CS_STATUS":isOLD ? "Old":"New"]) } ///搜索展示失败 func search_ads_showFailureAction(_ error:String) { let parameters:[String:String] = ["CS_STATUS":isOLD ? "Old":"New", "CS_ERROR":error] print("搜索插页失败展示信息--\(parameters)") Analytics.logEvent(search_ads_showFailure, parameters: parameters) } ///搜索结果页展示机会 func result_ads_chanceAction() { Analytics.logEvent(result_ads_chance, parameters: ["CS_STATUS":isOLD ? "Old":"New"]) } ///搜索结果页成功 func result_ads_showAction(_ responseInfo:GADResponseInfo, adValue:GADAdValue) { let parameters:[String:Any] = infoToParameters(responseInfo, adValue: adValue) print("搜索结果页成功展示信息--\(parameters)") Analytics.logEvent(result_ads_show, parameters: parameters) } ///播放展示机会 func play_ads_chanceAction() { Analytics.logEvent(play_ads_chance, parameters: ["CS_STATUS":isOLD ? "Old":"New"]) } ///播放加载失败 func play_ads_loadFailureAction(_ error:String) { let parameters:[String:String] = ["CS_STATUS":isOLD ? "Old":"New", "CS_ERROR":error] Analytics.logEvent(play_ads_loadFailure, parameters: parameters) } ///播放展示成功 func play_ads_showSuccessAction(_ responseInfo:GADResponseInfo, adValue:GADAdValue) { let parameters:[String:Any] = infoToParameters(responseInfo, adValue: adValue) print("播放插页成功展示信息--\(parameters)") Analytics.logEvent(play_ads_showSuccess, parameters: parameters) } ///播放展示失败 func play_ads_showFailureAction(_ error:String) { let parameters:[String:String] = ["CS_STATUS":isOLD ? "Old":"New", "CS_ERROR":error] print("播放插页失败展示信息--\(parameters)") Analytics.logEvent(play_ads_showFailure, parameters: parameters) } ///下载展示机会 func dl_ads_chanceAction() { Analytics.logEvent(dl_ads_chance, parameters: ["CS_STATUS":isOLD ? "Old":"New"]) } ///下载加载失败 func dl_ads_loadFailureAction(_ error:String) { let parameters:[String:String] = ["CS_STATUS":isOLD ? "Old":"New", "CS_ERROR":error] Analytics.logEvent(dl_ads_loadFailure, parameters: parameters) } ///下载展示成功 func dl_ads_showSuccessAction(_ responseInfo:GADResponseInfo, adValue:GADAdValue) { let parameters:[String:Any] = infoToParameters(responseInfo, adValue: adValue) print("下载插页成功展示信息--\(parameters)") Analytics.logEvent(dl_ads_showSuccess, parameters: parameters) } ///下载展示失败 func dl_ads_showFailureAction(_ error:String) { let parameters:[String:String] = ["CS_STATUS":isOLD ? "Old":"New", "CS_ERROR":error] print("下载插页失败展示信息--\(parameters)") Analytics.logEvent(dl_ads_showFailure, parameters: parameters) } ///切歌展示机会 func cut_ads_chanceAction() { Analytics.logEvent(cut_ads_chance, parameters: ["CS_STATUS":isOLD ? "Old":"New"]) } ///切歌加载失败 func cut_ads_loadFailureAction(_ error:String) { let parameters:[String:String] = ["CS_STATUS":isOLD ? "Old":"New", "CS_ERROR":error] Analytics.logEvent(cut_ads_loadFailure, parameters: parameters) } ///切歌展示成功 func cut_ads_showSuccessAction(_ responseInfo:GADResponseInfo, adValue:GADAdValue) { let parameters:[String:Any] = infoToParameters(responseInfo, adValue: adValue) print("切歌插页成功展示信息--\(parameters)") Analytics.logEvent(cut_ads_showSuccess, parameters: parameters) } ///切歌展示失败 func cut_ads_showFailureAction(_ error:String) { let parameters:[String:String] = ["CS_STATUS":isOLD ? "Old":"New", "CS_ERROR":error] print("切歌插页失败展示信息--\(parameters)") Analytics.logEvent(cut_ads_showFailure, parameters: parameters) } ///列表进入机会 func listclk_ads_chanceAction() { Analytics.logEvent(listclk_ads_chance, parameters: ["CS_STATUS":isOLD ? "Old":"New"]) } ///列表加载失败 func listclk_ads_loadFailureAction(_ error:String) { let parameters:[String:String] = ["CS_STATUS":isOLD ? "Old":"New", "CS_ERROR":error] Analytics.logEvent(listclk_ads_loadFailure, parameters: parameters) } ///列表进入成功 func listclk_ads_showSuccessAction(_ responseInfo:GADResponseInfo, adValue:GADAdValue) { let parameters:[String:Any] = infoToParameters(responseInfo, adValue: adValue) print("列表插页成功展示信息--\(parameters)") Analytics.logEvent(listclk_ads_showSuccess, parameters: parameters) } ///列表进入失败 func listclk_ads_showFailureAction(_ error:String) { let parameters:[String:String] = ["CS_STATUS":isOLD ? "Old":"New", "CS_ERROR":error] print("列表插页失败展示信息--\(parameters)") Analytics.logEvent(listclk_ads_showFailure, parameters: parameters) } ///曲库原生机会 func lbr_ads_chanceAction() { Analytics.logEvent(lbr_ads_chance, parameters: ["CS_STATUS":isOLD ? "Old":"New"]) } ///曲库原生次数 func lbr_ads_showAction(_ responseInfo:GADResponseInfo, adValue:GADAdValue) { let parameters:[String:Any] = infoToParameters(responseInfo, adValue: adValue) print("曲库原生成功展示信息--\(parameters)") Analytics.logEvent(lbr_ads_show, parameters: parameters) } ///列表原生机会 func list_ads_chanceAction() { Analytics.logEvent(list_ads_chance, parameters: ["CS_STATUS":isOLD ? "Old":"New"]) } ///列表原生次数 func list_ads_showAction(_ responseInfo:GADResponseInfo, adValue:GADAdValue) { let parameters:[String:Any] = infoToParameters(responseInfo, adValue: adValue) print("列表原生成功展示信息--\(parameters)") Analytics.logEvent(list_ads_show, parameters: parameters) } //获取太平洋洛杉矶时间 func getCurrentLosAngelesTime() -> String { // 获取当前日期和时间 let now = Date() // 创建 DateFormatter 实例 let dateFormatter = DateFormatter() dateFormatter.dateFormat = "yyyy-MM-dd" // 设置时区为洛杉矶时间 if let losAngelesTimeZone = TimeZone(identifier: "America/Los_Angeles") { dateFormatter.timeZone = losAngelesTimeZone } else { return "Error: Unable to find Los Angeles Time Zone" } // 将当前时间转换为洛杉矶时间并格式化为字符串 let losAngelesTimeString = dateFormatter.string(from: now) return losAngelesTimeString } }