CNLiveLaunchAdController.swift 11.9 KB
//
//  CNLiveLaunchAdController.swift
//  metaCode
//
//  Created by zx on 2025/4/22.
//

import Foundation
import YYImage

class CNLiveLaunchAdController:UIViewController,URLSessionTaskDelegate{
    
    lazy var bgView :YYAnimatedImageView = {
        let bottomNavView = YYAnimatedImageView(frame: self.view.bounds)
        bottomNavView.contentMode = .scaleToFill
        let tap = UITapGestureRecognizer(target: self, action: #selector(singleTap))
        bottomNavView.addGestureRecognizer(tap)
        return bottomNavView
    }()

    lazy var skipBtn: UIButton = {
        var height:CGFloat = 149.0
        if keyWindow?.safeAreaInsets.bottom ?? 0 > 0.0{
            height = 149.0 + get_system_tabbar_ui_offsetHeight()
        }
        
        let  closeBtn = UIButton(type: .custom)
        closeBtn.frame = CGRect(x: KSreenWidth - 79, y: KSreenHeight-height, width: 69, height: 32)
        closeBtn.backgroundColor = UIColor(red: 51, green: 51, blue: 51, alpha: 0.2)
        closeBtn.layer.cornerRadius = 16
        closeBtn.layer.masksToBounds = true
        closeBtn.titleLabel?.font = Font_13
        closeBtn.setTitleColor(.lightGray, for: .normal)
        closeBtn.addTarget(self, action: #selector(skipAction), for: .touchUpInside)
        closeBtn.contentHorizontalAlignment = .center
        return closeBtn
    }()

    lazy var advImg :UIImageView = {
        let iconImgView = UIImageView(frame: CGRect(x: KSreenWidth-35, y: KStatusBarHeight+5, width: 21, height: 12))
        iconImgView.image = UIImage(named: "Launch_AdTip")
        return iconImgView
    }()

    var clicked = false
    
    // 定时器管理属性(必须强引用)
    var timer: DispatchSourceTimer?
    
    /// 清理旧广告图片及配置
    func deleteOldImage() {
        // 1. 安全获取旧图片URL(处理空值)
        let oldUrl = UserDefaults.standard.string(forKey: "wjjAdv_imageUrl") ?? ""
        
        // 2. 存在有效URL时执行清理
        if !oldUrl.isEmpty {
            // 3. 检查图片缓存是否存在
            if let image = CNOSAdImgDownloadManager.getOSImage(with: oldUrl){//,let image = UIImage(data: cachedImageData) {
                // 4. 异步执行资源清理(避免阻塞主线程)
                DispatchQueue.global(qos: .utility).async {
                    CNOSAdImgDownloadManager.clearOSImage(with: oldUrl)
                    print("🗑 成功清理旧广告图片: \(oldUrl)")
                }
            }
        }
        
        // 5. 原子化操作用户配置(线程安全)
        UserDefaults.standard.perform {_ in 
            // 6. 使用removeObject替代空字符串更符合语义
            UserDefaults.standard.removeObject(forKey: "wjjAdv_imageUrl")
            
            // 7. 清理相关配置(根据业务需求添加)
            UserDefaults.standard.removeObject(forKey: "wjjAdv_duration")
            UserDefaults.standard.removeObject(forKey: "wjjAdv_isOpenExternal")
            UserDefaults.standard.removeObject(forKey: "wjjAdv_linkUrl")
            UserDefaults.standard.removeObject(forKey: "wjjAdv_Id")
        }
        
        // 8. 使用现代化同步方法(iOS 12+)
        if #available(iOS 12.0, *) {
            UserDefaults.standard.synchronize()
        }
    }

    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        CNLiveAdViewModel.shared.getAdData { result, status in
            if status == .success{
                if let tempAdv = result as? NSDictionary{
                    if let adv = tempAdv["openScreenAdv"] as? NSDictionary{
                        let modifyStatus = adv["modifyStatus"] as? Int
                        let oldModifyStatus = UserDefaults.standard.integer(forKey: "wjjAdv_modifyStatus")
                        let imageUrl = UserDefaults.standard.string(forKey: "wjjAdv_imageUrl")
//                        let localImage = CNOSAdImgDownloadManager.getOSImage(with: imageUrl)
                        var localImage:UIImage?
                        if let localImg = CNOSAdImgDownloadManager.getOSImage(with: imageUrl){//,let localImg = UIImage(data: cachedImageData){
                            localImage = localImg
                        }
                        
                        if (modifyStatus==oldModifyStatus && (modifyStatus != 0) && ((imageUrl?.count ?? 0 == 0) || (localImage != nil))) {
                            print("无变化")
                        } else {
                            var advImgUrl: String?
                            if #available(iOS 11.0, *) {
                                if isiPhoneXSeries{
                                    advImgUrl = adv["iosImg1"] as? String
                                    print("isiPhoneXSeries")
                                } else {
                                    advImgUrl = adv["iosImg2"] as? String
                                }
                            } else {
                                advImgUrl = adv["iosImg2"] as? String
                            }
                            advImgUrl = advImgUrl?.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)
                            
                            if advImgUrl?.count ?? 0 > 0{
                                if let newImage =  CNOSAdImgDownloadManager.getOSImage(with: advImgUrl!) {
                                    UserDefaults.standard.set(adv["duration"] as? Int ?? 0, forKey: "wjjAdv_duration")//时长
                                    UserDefaults.standard.set(adv["wjjAdv"] as? Bool ?? false, forKey: "wjjAdv_isOpenExternal")//是否外部
                                    let linkUrl = adv["url"] as? String ?? ""
                                    UserDefaults.standard.set(linkUrl, forKey: "wjjAdv_linkUrl")//点击链接
                                    UserDefaults.standard.set(adv["id"] as? String ?? "", forKey: "wjjAdv_Id")//id
                                    UserDefaults.standard.set(modifyStatus, forKey: "wjjAdv_modifyStatus")//版本号
                                    UserDefaults.standard.set(advImgUrl, forKey: "wjjAdv_imageUrl")//图片url
                                    UserDefaults.standard.synchronize()
                                } else {
                                    //下载
                                    CNOSAdImgDownloadManager.downloadOSAdImg(with: advImgUrl!) {
                                        if let oldImageUrl = UserDefaults.standard.string(forKey: "wjjAdv_imageUrl"), oldImageUrl != advImgUrl! {
                                            self.deleteOldImage()
                                        }
                                        
                                        UserDefaults.standard.set(adv["duration"] as? Int ?? 0, forKey: "wjjAdv_duration")//时长
                                        UserDefaults.standard.set(adv["wjjAdv"] as? Bool ?? false, forKey: "wjjAdv_isOpenExternal")//是否外部
                                        let linkUrl = adv["url"] as? String ?? ""
                                        UserDefaults.standard.set(linkUrl, forKey: "wjjAdv_linkUrl")//点击链接
                                        UserDefaults.standard.set(adv["id"] as? String ?? "", forKey: "wjjAdv_Id")//id
                                        UserDefaults.standard.set(modifyStatus, forKey: "wjjAdv_modifyStatus")//版本号
                                        UserDefaults.standard.set(advImgUrl, forKey: "wjjAdv_imageUrl")//图片url
                                        UserDefaults.standard.synchronize()
                                    }
                                }
                            } else {
                                // 无广告
                                self.deleteOldImage()
                            }
                        }
                    }
                } else {
                    // 无广告
                    self.deleteOldImage()
                }
            }
        }
        
        // 判断本地是否存在广告图片
        if  let newImage = CNOSAdImgDownloadManager.getOSImage(with: UserDefaults.standard.string(forKey: "wjjAdv_imageUrl")){//}, let newImage = YYImage(data: data){
//            let g = YYAnimatedImageView(image: newImage)
//            print("YYImage:\(g.image)")
//            let f = YYImage.animatedImage(withAnimatedGIFData: data)
//            let b = YYImage.gif(data: data)
//            let c = UIImage.sd_image(withGIFData: data)
//            let a = UIImage(data: data)
//            let d = YYFrameImage(data: data)
//            let e = YYImage(smallGIFData: data, scale: 1)
//            let newImage = CNOSAdImgDownloadManager.getOSImage(with: UserDefaults.standard.string(forKey: "wjjAdv_imageUrl")){
            // 显示广告
//            let yyImage = newImage as? YYImage
//            print("YYImage:\(newImage),UIImage:\(c)")
            bgView.isUserInteractionEnabled = true
            bgView.addSubview(advImg)
            bgView.addSubview(skipBtn)
//            let gif = YYImage(named: "123.gif")
            bgView.image = newImage//g.image//e//c//gif//newImage//yyImage
            bgView.autoPlayAnimatedImage = true
            bgView.startAnimating()
            let duration = UserDefaults.standard.integer(forKey: "wjjAdv_duration")
            if duration > 0 {
                var second = duration > 1000 ? duration / 1000 : duration
                second += 1
                skipBtn.setTitle("跳过 \(second)", for: .normal)
                
                let queue = DispatchQueue.global(qos: .default)
                // 2. 创建定时器源(自动配置队列)
                timer = DispatchSource.makeTimerSource(flags: .strict, queue: queue)
                // 3. 配置定时器参数(立即触发,间隔1秒,零误差)
                timer?.schedule(deadline: .now(), repeating: .seconds(1))
                // 4. 设置事件处理器(使用弱引用避免循环引用)
                timer?.setEventHandler { [weak self] in
                    guard let self = self else { return }
                    
                    // 定时器触发逻辑
                    if !self.clicked {
                        second -= 1
                        if second == 0 {
                            self.enterMainUI()
                            timer?.cancel()
                        } else {
                            DispatchQueue.main.async {
                                self.skipBtn.setTitle("跳过 \(second)", for: .normal)
                            }
                        }
                    }
                }
                timer?.resume()
            } else {
                // 显示主页面
                self.enterMainUI()
            }
            view.addSubview(bgView)
        }else {
            
            self.enterMainUI()
        }
    
    }
    func enterMainUI(){
        // 显示主页面
        DispatchQueue.main.async {
            let tabbarVC = CNLiveBaseTabBarViewController.init()
            let delegate = UIApplication.shared.delegate as! AppDelegate
            delegate.window?.rootViewController = tabbarVC
        }
    }
    
    
    @objc func skipAction(){
        self.clicked = true
        self.enterMainUI()
    }
    
    @objc func singleTap(){
        //暂时点击不跳转
//        var idStr = ""
//        if let tempId = UserDefaults.standard.object(forKey: "wjjAdv_Id") as? String{
//            idStr = tempId
//        }
//        let channel = "kp_\(idStr)"
//        self.clicked = true
//        let tempAdvLinkUrl = UserDefaults.standard.object(forKey: "wjjAdv_linkUrl") as? String
//        //"http://wjjh5.cnlive.com/cnSpecialBlockList.html?channelName=tg_sxzgzt&id=1&isShowTitle=true&isWjjReport=true&pageId=10155"
//        let advLinkUrl = tempAdvLinkUrl?.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines)//去除掉首尾的空白字符和换行字符
//        self.enterMainUI()
    }
    
    deinit {
        print("lauchAdVC deinit")
    }
}