// // WA_limitsVCViewController.swift // wallpaper_project import UIKit import SVProgressHUD import Photos import Alamofire import AppLovinSDK import FirebaseAnalytics import FirebaseRemoteConfig import MTGSDKNewInterstitial import MTGSDKBidding import MTGSDK class WA_limitsVCViewController: WA_RootVC { @IBOutlet weak var retryBtn: UIButton! let activityView = UIActivityIndicatorView() @IBOutlet weak var resourceLabel: UILabel! 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 // var ivAadManager:MTGNewInterstitialAdManager! var bidToken:String? var ecpmprice:Double? var newInterstitialAdManager:MTGNewInterstitialBidAdManager? override func viewDidLoad() { super.viewDidLoad() requestPhotoLibraryPermission() // 初始化 Remote Config remoteConfig = RemoteConfig.remoteConfig() // 设置最小获取间隔(开发期间可以设置较小的值) let settings = RemoteConfigSettings() settings.minimumFetchInterval = 0 remoteConfig.configSettings = settings // Fetch 配置值 remoteConfig.setDefaults(fromPlist: "isopen") self.resourceLabel.isHidden = false 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() let param = MTGBiddingRequestParameter(placementId: "1651004", unitId: "3520023", basePrice: nil) MTGBiddingRequest.getBidWith(param) { bidResponse in if bidResponse.success{ self.bidToken = bidResponse.bidToken bidResponse.notifyWin() self.newInterstitialAdManager = MTGNewInterstitialBidAdManager(placementId: "1651004", unitId: "3520023", delegate: self) StartManager.shared.ecpm = Float(bidResponse.price) self.newInterstitialAdManager?.loadAd(withBidToken:self.bidToken!) self.fetchRemoteConfig() }else{ let userDefaults = UserDefaults.standard if userDefaults.bool(forKey: "iswindows"){ let appDelegate = UIApplication.shared.delegate appDelegate?.window??.rootViewController = WA_RootNAV(rootViewController: WA_playerVC()) }else{ WA_TabbarCommon.TabBarController() } } } } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) self.retryBtn.isHidden = true 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.") } } } } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) 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 let tt = UserDefaults.standard print("-------\(tt.bool(forKey: "iswindows"))") DispatchQueue.main.async { if valueversion == localVersion { let userDefaults = UserDefaults.standard if userDefaults.bool(forKey: "iswindows"){ let appDelegate = UIApplication.shared.delegate appDelegate?.window??.rootViewController = WA_RootNAV(rootViewController: WA_playerVC()) }else{ WA_TabbarCommon.TabBarController() } StartManager.shared.superHero = false } else { if valueopen { // self.newInterstitialAdManager?.loadAd(withBidToken:self.bidToken!) self.startAdCheck() StartManager.shared.superHero = true } else { let userDefaults = UserDefaults.standard if userDefaults.bool(forKey: "iswindows"){ let appDelegate = UIApplication.shared.delegate appDelegate?.window??.rootViewController = WA_RootNAV(rootViewController: WA_playerVC()) }else{ WA_TabbarCommon.TabBarController() } 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 userDefaults = UserDefaults.standard if userDefaults.bool(forKey: "iswindows"){ let appDelegate = UIApplication.shared.delegate appDelegate?.window??.rootViewController = WA_RootNAV(rootViewController: WA_playerVC()) }else{ WA_TabbarCommon.TabBarController() } } } } } // /定时加载 func startAdCheck() { // createInterstitialAd() // newInterstitialAdManager?.loadAd(withBidToken:self.bidToken!) 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) // self.newInterstitialAdManager?.loadAd(withBidToken:self.bidToken!) let issureready = newInterstitialAdManager!.isAdReady() if issureready { // interstitialAd.show() newInterstitialAdManager?.show(from: self) Analytics.logEvent("open_load_success", parameters: nil) 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 userDefaults = UserDefaults.standard if userDefaults.bool(forKey: "iswindows"){ let appDelegate = UIApplication.shared.delegate appDelegate?.window??.rootViewController = WA_RootNAV(rootViewController: WA_playerVC()) }else{ WA_TabbarCommon.TabBarController() } Analytics.logEvent("open_load_fail", parameters: nil) self.activityView.stopAnimating() } else { print("广告未准备好,继续检查...") } } ///获取相册权限 func requestPhotoLibraryPermission() { // 检查相册权限状态 let status = PHPhotoLibrary.authorizationStatus() // 根据权限状态进行处理 switch status { case .authorized: // 用户已授权访问相册 print("相册权限已授权") case .denied, .restricted: // 用户已拒绝访问相册或权限受限 print("相册权限已拒绝或受限,请在设置中开启权限") case .notDetermined: // 用户尚未作出选择,请求相册权限 PHPhotoLibrary.requestAuthorization { [weak self] (newStatus) in DispatchQueue.main.async { if newStatus == .authorized { // 用户授权访问相册 print("用户已授权访问相册") } else { // 用户未授权访问相册 print("用户未授权访问相册") } } } @unknown default: // 处理未知权限状态 print("未知的相册权限状态") } } // // // 停止监听网络状态 // func stopListeningNetwork() { // NetworkReachabilityManager.default?.stopListening() // } 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.wallpapaer.hd.live.app", "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.wallpapaer.hd.live.app", "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 WA_limitsVCViewController:MTGNewInterstitialBidAdDelegate{ // func newInterstitialBidAdShowSuccess(_ adManager: MTGNewInterstitialBidAdManager) { // print("广告展示成功") // } func newInterstitialBidAdResourceLoadSuccess(_ adManager: MTGNewInterstitialBidAdManager) { print("资源加载成功,表示可播放状态") } func newInterstitialBidAdLoadSuccess(_ adManager: MTGNewInterstitialBidAdManager) { print("广告加载成功") StartManager.shared.shelfNumber = "开屏加载" StartManager.shared.succeed = true StartManager.shared.loadTime = self.adLoadTime StartManager.shared.adPlatform = "mbridge" StartManager.shared.countryCode = ALSdk.shared().configuration.countryCode StartManager.shared.adId = self.idad StartManager.shared.platformResponseTime = 0.0 // StartManager.shared.ecpm = Float(ad.revenue) StartManager.shared.dsp = "" StartManager.shared.network = "" self.setPostload() } func newInterstitialBidAdLoadFail(_ error: any Error, adManager: MTGNewInterstitialBidAdManager) { print("-----\(error)") // print(" 广告加载失败") } func newInterstitialBidAdShowSuccess(withBidToken bidToken: String, adManager: MTGNewInterstitialBidAdManager) { print("广告展示成功") } func newInterstitialBidAdShowFail(_ error: any Error, adManager: MTGNewInterstitialBidAdManager) { print("广告展示失败") let userDefaults = UserDefaults.standard if userDefaults.bool(forKey: "iswindows"){ let appDelegate = UIApplication.shared.delegate appDelegate?.window??.rootViewController = WA_RootNAV(rootViewController: WA_playerVC()) }else{ WA_TabbarCommon.TabBarController() } } func newInterstitialBidAdPlayCompleted(_ adManager: MTGNewInterstitialBidAdManager) { print("广告播放完全播放回调") } func newInterstitialBidAdEndCardShowSuccess(_ adManager: MTGNewInterstitialBidAdManager) { print("视频播放完成后展示结果页") } func newInterstitialBidAdClicked(_ adManager: MTGNewInterstitialBidAdManager) { print("广告被点击") } // 广告被关闭 func newInterstitialBidAdDidClosed(_ adManager: MTGNewInterstitialBidAdManager) { // print("广告被关闭") let userDefaults = UserDefaults.standard if userDefaults.bool(forKey: "iswindows"){ let appDelegate = UIApplication.shared.delegate appDelegate?.window??.rootViewController = WA_RootNAV(rootViewController: WA_playerVC()) }else{ WA_TabbarCommon.TabBarController() } } // // /** // * 在取消展示广告后并将控件返回到您的应用时调用 // * @param converted - 视频是否播放完整 // */ // func newInterstitialAdDismissed(withConverted converted: Bool, adManager: MTGNewInterstitialAdManager) { //// log(NSStringFromSelector(#function)) // } // // // 广告被关闭 // func newInterstitialAdDidClosed(_ adManager: MTGNewInterstitialAdManager) { //// log(NSStringFromSelector(#function)) // } // // /** // * 如果设置了插屏奖励,您将收到此回调 // * @param rewardedOrNot 是否达到了可奖励状态 // * @param alertWindowStatus 支持的类型列表 // * 注意:您可以根据该回调决定是否给予奖励 // */ // func newInterstitialAdRewarded(_ rewardedOrNot: Bool, alertWindowStatus: MTGNIAlertWindowStatus, adManager: MTGNewInterstitialAdManager) { //// log(NSStringFromSelector(#function)) // } } //extension WA_limitsVCViewController: MAAdDelegate //{ // func createInterstitialAd() { // // let randomString = getRandomString() // // if StartManager.shared.adId == nil{ // StartManager.shared.adId = randomString ?? "789b377f3ac14010e" // 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 // // let logMessage = """ // deviceId: \(StartManager.shared.devicID ?? "") // localIp: \(StartManager.shared.localIP ?? "") // "remoteIp": \(StartManager.shared.publicIP ?? ""), // "linkId": "", // "packageName": "com.wallpapaer.hd.live.app", // "gaid": \(StartManager.shared.idfaid ?? ""), // "dataId": "", // "shelfNumber": "开屏展示", // "succeed": \(StartManager.shared.succeed), // "loadTime": \(StartManager.shared.loadTime ?? 0), // "adPlatform": \(StartManager.shared.adPlatform ?? ""), // "countryCode": \(StartManager.shared.countryCode ?? ""), // "adId": \(StartManager.shared.adId ?? ""), // "platformResponseTime": \(StartManager.shared.platformResponseTime ?? 0.0), // "getIpResponseTime": \(StartManager.shared.getIpResponseTime ?? 0.0), // "ecpm": \(StartManager.shared.ecpm ?? 0.0), // "dsp": \(StartManager.shared.dsp ?? ""), // "network": \(StartManager.shared.network ?? "") // """ // // AppDelegate.shared.addLogMessage(logMessage) // // 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() // WA_TabbarCommon.TabBarController() // } // // // /// 当广告无法显示时调用的方法 // func didFail(toDisplay ad: MAAd, withError error: MAError) { // // 广告无法显示,建议加载下一个广告 // interstitialAd.load() // } // // // // //}