// // WA_LIVEVC.swift // wallpaper_project import UIKit import JXSegmentedView import MJRefresh import FirebaseAnalytics import AppLovinSDK import Alamofire import FirebaseRemoteConfig import MTGSDKNewInterstitial import MTGSDKBidding import MTGSDK class WA_LIVEVC: WA_RootVC { @IBOutlet weak var collectionView: UICollectionView! var wallpapers = [WA_3DModel]() var currentPage: Int = 1 // 当前页数 let pageSize: Int = 10 // 每页加载的数量 var isback:Bool = false // 顶部刷新 let header = MJRefreshNormalHeader() // 底部刷新 let footer = MJRefreshAutoNormalFooter() var interstitialAd: MAInterstitialAd! var retryAttempt = 0.0 var remoteConfig: RemoteConfig! var isadshow:Bool = false var bidToken:String? var newInterstitialAdManager:MTGNewInterstitialBidAdManager? override func viewDidLoad() { super.viewDidLoad() // self.createInterstitialAd() self.view.backgroundColor = .white setCollectionView() Analytics.logEvent("in_live", parameters: nil) setRefresh() } @IBAction func back(_ sender: Any) { isback = true // if self.isadshow == true{ // DispatchQueue.main.asyncAfter(wallDeadline: .now() + 0.5) { // if self.interstitialAd.isReady { // self.interstitialAd.show() // Analytics.logEvent("details_load_success", parameters: nil) // self.setPostSHOW() // let logMessage = """ // deviceId: \(StartManager.shared.devicID ?? "") // localIp: \(StartManager.shared.localIP ?? "") // "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) // }else{ // self.navigationController?.popViewController(animated: true) // } // } // }else{ // self.navigationController?.popViewController(animated: true) // } // navigationController?.popViewController(animated: true) let issureready = newInterstitialAdManager?.isAdReady() if self.isadshow == true{ if ((issureready) != nil) { newInterstitialAdManager?.show(from: self) self.setPostSHOW() }else{ self.navigationController?.popViewController(animated: true) } }else{ self.navigationController?.popViewController(animated: true) } } @objc func setRefresh(){ refreshData() header.setRefreshingTarget(self, refreshingAction: #selector(WA_LIVEVC.setRefresh)) // 现在的版本要用mj_header header.setTitle("pull-to-refresh", for: .idle) header.setTitle("Release updates", for: .pulling) header.setTitle("Refreshing...", for: .refreshing) self.collectionView.mj_header = header // 上拉刷新 footer.setRefreshingTarget(self, refreshingAction: #selector(WA_LIVEVC.loadMoreData)) footer.setTitle("Pull up loading", for: .idle) footer.setTitle("Release Load", for: .pulling) footer.setTitle("Loading...", for: .refreshing) self.collectionView.mj_footer = footer header.beginRefreshing() // footer.beginRefreshing() } func setCollectionView(){ collectionView.delegate = self collectionView.dataSource = self // 设置 collection view 的布局 let layout = CustomCollectionViewFlowLayout() collectionView.collectionViewLayout = layout layout.scrollDirection = .vertical collectionView.register(UINib(nibName: "WA_WallpaperCollectionCell", bundle: nil), forCellWithReuseIdentifier: "WA_WallpaperCollectionCell") } // 下拉刷新 @objc func refreshData() { currentPage = 1 setJsondata() } // 上拉加载更多 @objc func loadMoreData() { currentPage += 1 setJsondata() } func setJsondata(){ // 读取 JSON 文件并解析 if let path = Bundle.main.path(forResource: "live", ofType: "json") { do { let data = try Data(contentsOf: URL(fileURLWithPath: path), options: .mappedIfSafe) // 使用 MJExtension 解析 JSON 数据 let jsonArray = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as? [[String: Any]] if let jsonArray = jsonArray { // 使用 MJExtension 将 JSON 数组转换为模型数组 let wallpapersarr = (WA_3DModel.mj_objectArray(withKeyValuesArray: jsonArray) as? [WA_3DModel])! if currentPage == 1 { // 只取前10条数据 let firstTenWallpapers = Array(wallpapersarr.prefix(10)) self.wallpapers = firstTenWallpapers collectionView.reloadData() collectionView.mj_header?.endRefreshing() } else { // 上拉加载更多 let startIndex = currentPage * pageSize let moreWallpapers = Array(wallpapersarr.prefix(startIndex)) DispatchQueue.main.asyncAfter(deadline: .now() + 1.5){ self.wallpapers = moreWallpapers self.collectionView.reloadData() self.collectionView.mj_footer?.endRefreshing() } } } } catch { print("Error reading JSON file:", error.localizedDescription) } } else { print("JSON file not found.") } } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) navigationController?.navigationBar.isHidden = true // 初始化 Remote Config remoteConfig = RemoteConfig.remoteConfig() // 设置最小获取间隔(开发期间可以设置较小的值) let settings = RemoteConfigSettings() settings.minimumFetchInterval = 0 remoteConfig.configSettings = settings // Fetch 配置值 remoteConfig.setDefaults(fromPlist: "isopen") // Fetch 配置值 // fetchRemoteConfig() let param = MTGBiddingRequestParameter(placementId: "1650177", unitId: "3519003", basePrice: nil) MTGBiddingRequest.getBidWith(param) { bidResponse in if bidResponse.success{ self.bidToken = bidResponse.bidToken bidResponse.notifyWin() self.newInterstitialAdManager = MTGNewInterstitialBidAdManager(placementId: "1650177", unitId: "3519003", delegate: self) StartManager.shared.ecpm = Float(bidResponse.price) self.newInterstitialAdManager?.loadAd(withBidToken:self.bidToken!) self.fetchRemoteConfig() }else{ // WA_TabbarCommon.TabBarController() } } } ///是否有广告 func fetchRemoteConfig() { let localVersion = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as? String ?? "0.0" remoteConfig.fetch{ (status, error) -> Void in if status == .success { 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{ self.isadshow = false }else{ if valueopen { self.isadshow = true } else { self.isadshow = false } } } } } } else { print("Config not fetched") if let error = error { print("Error: \(error.localizedDescription)") } } } } 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": "", "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": "", "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)") } } } } //extension WA_LIVEVC:JXSegmentedListContainerViewListDelegate{ // func listView() -> UIView { // return view // } //} extension WA_LIVEVC:UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout{ func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return self.wallpapers.count } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "WA_WallpaperCollectionCell", for: indexPath)as!WA_WallpaperCollectionCell cell.model = self.wallpapers[indexPath.row] return cell } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { let vc = WA_LiveVideoVC() vc.model = self.wallpapers[indexPath.row] navigationController?.pushViewController(vc, animated: true) } } extension WA_LIVEVC:MTGNewInterstitialBidAdDelegate{ // func newInterstitialBidAdShowSuccess(_ adManager: MTGNewInterstitialBidAdManager) { // print("广告展示成功") // } func newInterstitialBidAdResourceLoadSuccess(_ adManager: MTGNewInterstitialBidAdManager) { print("资源加载成功,表示可播放状态") } func newInterstitialBidAdLoadSuccess(_ adManager: MTGNewInterstitialBidAdManager) { print("广告加载成功") StartManager.shared.succeed = true // StartManager.shared.loadTime = self.adLoadTime StartManager.shared.adPlatform = "mbridge" StartManager.shared.countryCode = ALSdk.shared().configuration.countryCode StartManager.shared.adId = "1636952" StartManager.shared.platformResponseTime = 0 // StartManager.shared.ecpm = Float(ad.revenue) StartManager.shared.dsp = "" StartManager.shared.network = "" 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("广告展示失败") self.navigationController?.popViewController(animated: true) } func newInterstitialBidAdPlayCompleted(_ adManager: MTGNewInterstitialBidAdManager) { print("广告播放完全播放回调") } func newInterstitialBidAdEndCardShowSuccess(_ adManager: MTGNewInterstitialBidAdManager) { print("视频播放完成后展示结果页") } func newInterstitialBidAdClicked(_ adManager: MTGNewInterstitialBidAdManager) { print("广告被点击") } // 广告被关闭 func newInterstitialBidAdDidClosed(_ adManager: MTGNewInterstitialBidAdManager) { print("广告被关闭") self.navigationController?.popViewController(animated: true) } } //extension WA_LIVEVC: MAAdDelegate //{ // func createInterstitialAd() // { // interstitialAd = MAInterstitialAd(adUnitIdentifier: "880a042774979c3c") // interstitialAd.delegate = self // // // Load the first ad // interstitialAd.load() // } // // // MARK: MAAdDelegate Protocol // // func didLoad(_ ad: MAAd) // { // // Interstitial ad is ready to be shown. 'interstitialAd.isReady' will now return 'true' // // // Reset retry attempt // retryAttempt = 0 // StartManager.shared.succeed = true //// StartManager.shared.loadTime = self.adLoadTime // StartManager.shared.adPlatform = "MAX" // StartManager.shared.countryCode = ALSdk.shared().configuration.countryCode // StartManager.shared.adId = "880a042774979c3c" // StartManager.shared.platformResponseTime = ad.requestLatency // StartManager.shared.ecpm = Float(ad.revenue) // StartManager.shared.dsp = ad.dspName // StartManager.shared.network = ad.networkName // // // setPostload() // } // // func didFailToLoadAd(forAdUnitIdentifier adUnitIdentifier: String, withError error: MAError) // { // // Interstitial ad failed to load // // We recommend retrying with exponentially higher delays up to a maximum delay (in this case 64 seconds) // // retryAttempt += 1 // let delaySec = pow(2.0, min(6.0, retryAttempt)) // // DispatchQueue.main.asyncAfter(deadline: .now() + delaySec) { // self.interstitialAd.load() // } // } // // func didDisplay(_ ad: MAAd) // { // // Pause your app's background audio // } // // func didClick(_ ad: MAAd) {} // // func didHide(_ ad: MAAd) // { // // Resume your app's background audio // // Interstitial ad is hidden. Pre-load the next ad // interstitialAd.load() // self.navigationController?.popViewController(animated: true) // } // // func didFail(toDisplay ad: MAAd, withError error: MAError) // { // // Interstitial ad failed to display. We recommend loading the next ad // interstitialAd.load() // } //}