// // AV_LaunchLimitesVC.swift // anniversary_Project // // Created by 忆海16 on 2024/7/11. // import UIKit import SVProgressHUD import Photos import Alamofire import AppLovinSDK //import FirebaseAnalytics import FirebaseRemoteConfig class AV_LaunchLimitesVC: AV_RootVC { let activityView = UIActivityIndicatorView() var interstitialAd: MAInterstitialAd! var retryAttempt = 0.0 var adCheckTimer: Timer? var adCheckStartTime: Date? var adLoadTime: Int = 0 var idad:String? var remoteConfig: RemoteConfig! var failureCount = 0 private var retryTimer: Timer? private var retryAttempts = 0 private let maxRetryAttempts = 3 private let retryInterval: TimeInterval = 3 override func viewDidLoad() { super.viewDidLoad() remoteConfig = RemoteConfig.remoteConfig() // 设置最小获取间隔(开发期间可以设置较小的值) let settings = RemoteConfigSettings() settings.minimumFetchInterval = 0 remoteConfig.configSettings = settings // Fetch 配置值 remoteConfig.setDefaults(fromPlist: "isopen") activityView.center = CGPoint(x: self.view.center.x + 10, y: self.view.bounds.size.height - 100 ) // 停止后,隐藏菊花 activityView.hidesWhenStopped = true activityView.color = .black; activityView.style = UIActivityIndicatorView.Style.whiteLarge self.view.addSubview(activityView) self.activityView.startAnimating() fetchRemoteConfig() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) navigationController?.navigationBar.isHidden = true // createInterstitialAd() DispatchQueue.main.asyncAfter(deadline: .now() + 3) { // 请求跟踪授权 requestTrackingAuthorization { idfa in if let idfa = idfa { print("IDFA: \(idfa)") StartManager.shared.idfaid = idfa print("Stored IDFA: \(StartManager.shared.idfaid ?? "N/A")") } else { print("IDFA is not available or tracking authorization denied.") } } } } func fetchRemoteConfig() { let localVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "0.0" print("version ------- \(localVersion)") remoteConfig.fetch { [weak self] (status, error) in guard let self = self else { return } if status == .success { self.retryAttempts = 0 print("Config fetched!") self.remoteConfig.activate { changed, error in if error == nil { let js = self.remoteConfig.configValue(forKey: "isopen").jsonValue as! [String: Any] let valueopen = js["isadopen"] as! Bool let valueversion = js["version"] as! String DispatchQueue.main.async { if valueversion == localVersion { let appDelegate = UIApplication.shared.delegate appDelegate?.window??.rootViewController = AV_NAVVC(rootViewController: AV_WaterHomeVC()) StartManager.shared.superHero = false } else { if valueopen { self.startAdCheck() StartManager.shared.superHero = true } else { let appDelegate = UIApplication.shared.delegate appDelegate?.window??.rootViewController = AV_NAVVC(rootViewController: AV_WaterHomeVC()) StartManager.shared.superHero = false } } } } } } else { print("Config not fetched") if let error = error { print("Error: \(error.localizedDescription)") } self.retryAttempts += 1 if self.retryAttempts <= self.maxRetryAttempts { // 取消之前的定时器 self.retryTimer?.invalidate() // 启动新的定时器 self.retryTimer = Timer.scheduledTimer(withTimeInterval: self.retryInterval, repeats: false) { [weak self] _ in self?.fetchRemoteConfig() } } else { print("Max retry attempts reached. Stopping retries.") let appDelegate = UIApplication.shared.delegate appDelegate?.window??.rootViewController = AV_NAVVC(rootViewController: AV_WaterHomeVC()) } } } } ///定时加载 func startAdCheck() { createInterstitialAd() adCheckStartTime = Date() adCheckTimer = Timer.scheduledTimer(timeInterval: 0.01, target: self, selector: #selector(checkAdStatus), userInfo: nil, repeats: true) } @objc func checkAdStatus() { let elapsedTime = Date().timeIntervalSince(adCheckStartTime!) let elapsedTimeInMilliseconds = Int(elapsedTime * 1000) if interstitialAd.isReady { interstitialAd.show() adLoadTime = elapsedTimeInMilliseconds // 记录加载 adCheckTimer?.invalidate() self.activityView.stopAnimating() if StartManager.shared.idfaid == ""{ self.fetchIDFAUntilSuccess() }else{ self.setPostSHOW() } } else if elapsedTimeInMilliseconds >= 10000 { // 10000 毫秒 = 10 秒 adCheckTimer?.invalidate() let appDelegate = UIApplication.shared.delegate appDelegate?.window??.rootViewController = AV_NAVVC(rootViewController: AV_WaterHomeVC()) self.activityView.stopAnimating() } else { print("广告未准备好,继续检查...") } } func setPostload(){ let url = "http://111.9.47.226:38080/top_selection/save_ad_load_log" let parameters:[String : Any] = [ "deviceId": StartManager.shared.devicID ?? "", "localIp": StartManager.shared.localIP ?? "", "remoteIp": StartManager.shared.publicIP ?? "", "linkId": "", "packageName": "com.countdown.day.daycount", "gaid": StartManager.shared.idfaid ?? "", "dataId": "", "shelfNumber":"开屏加载", "succeed": StartManager.shared.succeed, "loadTime":StartManager.shared.loadTime ?? "", "adPlatform": StartManager.shared.adPlatform ?? "", "countryCode": StartManager.shared.countryCode ?? "", "adId": StartManager.shared.adId ?? "", "platformResponseTime": StartManager.shared.platformResponseTime ?? "", "getIpResponseTime": StartManager.shared.getIpResponseTime ?? "", "ecpm": StartManager.shared.ecpm ?? "", "dsp": StartManager.shared.dsp ?? "", "network": StartManager.shared.network ?? "", "showStatus": 0, "washParam": true, ] let headers: HTTPHeaders = [ "Content-Type": "application/json" ] NetworkManager.shared.postRequest(url: url, parameters: parameters, headers: headers) { result in switch result { case .success(let data): print("Response:--- \(data)") case .failure(let error): print("Error:--- \(error)") } } } func setPostSHOW(){ let url = "http://111.9.47.226:38080/top_selection/save_ad_show_log" let parameters:[String : Any] = [ "deviceId": StartManager.shared.devicID ?? "", "localIp": StartManager.shared.localIP ?? "", "remoteIp": StartManager.shared.publicIP ?? "", "linkId": "", "packageName": "com.countdown.day.daycount", "gaid": StartManager.shared.idfaid ?? "", "dataId": "", "shelfNumber":"开屏展示", "succeed": StartManager.shared.succeed, "loadTime":StartManager.shared.loadTime ?? "", "adPlatform": StartManager.shared.adPlatform ?? "", "countryCode": StartManager.shared.countryCode ?? "", "adId": StartManager.shared.adId ?? "", "platformResponseTime": StartManager.shared.platformResponseTime ?? "", "getIpResponseTime": StartManager.shared.getIpResponseTime ?? "", "ecpm": StartManager.shared.ecpm ?? "", "dsp": StartManager.shared.dsp ?? "", "network": StartManager.shared.network ?? "", ] let headers: HTTPHeaders = [ "Content-Type": "application/json" ] NetworkManager.shared.postRequest(url: url, parameters: parameters, headers: headers) { result in switch result { case .success(let data): print("Response:--- \(data)") case .failure(let error): print("Error:--- \(error)") } } } func fetchIDFAUntilSuccess() { DispatchQueue.global(qos: .background).async { var idfaObtained = false while !idfaObtained { let semaphore = DispatchSemaphore(value: 0) requestIDFA { idfa in if let idfa = idfa { print("Got IDFA: \(idfa)") // 执行成功获取 IDFA 后的处理方法 // self.performActionWithIDFA(idfa) StartManager.shared.idfaid = idfa self.setPostSHOW() idfaObtained = true } else { print("Failed to get IDFA, retrying...") DispatchQueue.global(qos: .background).asyncAfter(deadline: .now() + 1.0) { semaphore.signal() } } } semaphore.wait() } } } } extension AV_LaunchLimitesVC: MAAdDelegate { func createInterstitialAd() { let randomString = getRandomString() if StartManager.shared.adId == nil{ StartManager.shared.adId = randomString ?? "bee9f7039e56cc7a" interstitialAd = MAInterstitialAd(adUnitIdentifier: StartManager.shared.adId!) print("adid-----\(StartManager.shared.adId ?? "gggg")") }else{ interstitialAd = MAInterstitialAd(adUnitIdentifier: StartManager.shared.adId!) print("adid-----\(StartManager.shared.adId ?? "gggg")") } interstitialAd.delegate = self self.idad = randomString // Load the first ad interstitialAd.load() } // MARK: MAAdDelegate Protocol /// 当广告加载成功时调用的方法 func didLoad(_ ad: MAAd) { // 重试尝试次数重置为0 retryAttempt = 0 // 记录广告加载成功的相关信息 // StartManager.shared.shelfNumber = "开屏加载" StartManager.shared.succeed = true StartManager.shared.loadTime = self.adLoadTime StartManager.shared.adPlatform = "MAX" StartManager.shared.countryCode = ALSdk.shared().configuration.countryCode StartManager.shared.adId = self.idad StartManager.shared.platformResponseTime = ad.requestLatency StartManager.shared.ecpm = Float(ad.revenue) StartManager.shared.dsp = ad.dspName StartManager.shared.network = ad.networkName self.setPostload() } /// 当广告加载失败时调用的方法 func didFailToLoadAd(forAdUnitIdentifier adUnitIdentifier: String, withError error: MAError) { // 广告加载失败,建议进行重试 // 使用指数递增的延迟时间进行重试,最大延迟时间为 64 秒 retryAttempt += 1 let delaySec = pow(2.0, min(6.0, retryAttempt)) DispatchQueue.main.asyncAfter(deadline: .now() + delaySec) { self.interstitialAd.load() } } /// 当广告显示时调用的方法 func didDisplay(_ ad: MAAd) { // 暂停您的应用的背景音频 } /// 当用户点击广告时调用的方法 func didClick(_ ad: MAAd) { // 用户点击广告 } /// 当广告隐藏时调用的方法 func didHide(_ ad: MAAd) { // 恢复您的应用的背景音频 // 广告隐藏后,预加载下一个广告 interstitialAd.load() let appDelegate = UIApplication.shared.delegate appDelegate?.window??.rootViewController = AV_NAVVC(rootViewController: AV_WaterHomeVC()) } /// 当广告无法显示时调用的方法 func didFail(toDisplay ad: MAAd, withError error: MAError) { // 广告无法显示,建议加载下一个广告 interstitialAd.load() } }