FirmwareUpdateVC.swift 11.1 KB
//
//  FirmwareUpdateVC.swift
//  Twear
//
//  Created by yangbin on 2021/12/25.
//

import UIKit
import Alamofire
import HandyJSON
import SSZipArchive
import MBProgressHUD

class FirmwareUpdateVC: UIViewController, XMLParserDelegate {
    
    @IBOutlet weak var updateBtn: UIButton!
    @IBOutlet weak var updateImageView: UIImageView!
    @IBOutlet weak var deviceImageView: UIImageView!
    @IBOutlet weak var updateLabel: UILabel!
    @IBOutlet weak var progressLabel: UILabel!
    @IBOutlet weak var versionLabel: UILabel!
    
    var latestVersion: String = ""
    var downLoadUrlPath: String = ""
    var id: String = ""
    var device = CurDevice
    
    
    var downloadRequest: DownloadRequest? //下载请求对象
    
    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        UIApplication.shared.isIdleTimerDisabled = false
    }
    
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        let navController = navigationController as? ZCNavigationController
        navController?.enableScreenEdgePanGestureRecognizer(true)
    }
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.setNavigationBarHidden(false, animated: true)
    }
    
    override func navigationShouldPop() -> Bool {
        if !IsDailSyncing {
            return true
        } else {
            MBProgressHUD.showh(LocString("正在升级中,请稍后..."))
            return false
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        title = LocString("固件升级")
        UIApplication.shared.isIdleTimerDisabled = true
        if device.name.contains("P8GT") {
            deviceImageView.image = UIImage(named: "P8GT_icon")
        } else if device.name.contains("Watch 8") {
            deviceImageView.image = UIImage(named: "Watch7_icon")
        } else if device.name.contains("S7 NO.1") {
            deviceImageView.image = UIImage(named: "S7_NO.1_icon")
        } else if device.name.contains("hq7") {
            deviceImageView.image = UIImage(named: "hq7_icon")
        } else {
            deviceImageView.image = UIImage(named: "bracelet_icon")
        }
        
        Alamofire.SessionManager.default.session.configuration.requestCachePolicy = .reloadIgnoringLocalCacheData
   
        BluetoothManager.shared.getFirmwareVersion(isAlert: false) {[weak self] version, type, updateDic, error in
//            if latestVer == "" {
//            }
            self?.device = CurDevice
            if let least = updateDic["least"], let file = updateDic["file"], let id = updateDic["id"] {
                self?.latestVersion = least
                self?.id = id
                self?.downLoadUrlPath = file
                self?.checkUpdate(isUpdate: true)
            } else {
                self?.checkUpdate(isUpdate: false)
            }

//            self?.queryLatestVersion()
            
        }
    }
    
    
    func updateUserInteraction(_ isSyncing: Bool) {
//        collectionView.isUserInteractionEnabled = !isSyncing
        IsDailSyncing = isSyncing
        let navController = navigationController as? ZCNavigationController
        navController?.enableScreenEdgePanGestureRecognizer(!isSyncing)
    }
    
//    func queryLatestVersion() {
//        Alamofire.request("http://hodafone.com.cn/qwear/update/\(device.type)/version.xml").responseData { responseData in
//            if let data = responseData.data {
//                self.parseXML(data)
//            }
//        }
//    }
    
    private func checkUpdate(isUpdate: Bool) {
        if isUpdate {
            updateBtn.isUserInteractionEnabled = true
            updateBtn.backgroundColor = UIColor.rgbColorFromHex(0x00993E)
            let string = NSMutableAttributedString(string: "\(LocString("发现新版本")):v \(latestVersion)")
            string.addAttributes([.foregroundColor: UIColor.rgbColorFromHex(0x00993E)], range: NSMakeRange("\(LocString("发现新版本")):".count, string.string.length-"\(LocString("发现新版本")):".count))
            versionLabel.attributedText = string
        } else {
            updateBtn.isUserInteractionEnabled = false
            updateBtn.backgroundColor = UIColor.rgbColorFromHex(0xCBCBCB)
            let str1 = LocString("当前已是最新版本")
            let string = NSMutableAttributedString(string: "\(str1)\nv \(device.version)")
            string.addAttributes([.foregroundColor: UIColor.rgbColorFromHex(0x00993E)], range: NSMakeRange(str1.count, string.string.count-str1.count))
            versionLabel.attributedText = string
        }
    }
    
    
    @IBAction func update(_ sender: UIButton) {
        print("开始更新")
        updateBtn.isUserInteractionEnabled = false
        updateBtn.backgroundColor = UIColor.rgbColorFromHex(0xCBCBCB)
        deviceImageView.isHidden = true
        updateLabel.isHidden = false
        progressLabel.isHidden = false
        downloadUpdateFile()
    }
    
    func downloadUpdateFile() {
//        let url = URL(string: "http://hodafone.com.cn/qwear/update/\(id)/\(downLoadUrlPath)")
//        let version = latestVersion
//        var filePath = ""
        let unzipPath = ""
//        let dest: DownloadRequest.DownloadFileDestination = { _, _ in
//            let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0]
//            let fileURL = documentsURL.appendingPathComponent("update/firmware1.bin")
////            unzipPath = documentsURL.path//.appendingPathComponent("update").path
//            return (fileURL, [.removePreviousFile, .createIntermediateDirectories])
//        }
        let destination = DownloadRequest.suggestedDownloadDestination(for: .documentDirectory)
      
        let manager = FileManager.default
        let documentsURL = manager.urls(for: .documentDirectory, in: .userDomainMask)[0]
//        let contentsOfPath = try? manager.contentsOfDirectory(atPath: documentsURL.path)
//        print(contentsOfPath)
        let dPath = documentsURL.appendingPathComponent(downLoadUrlPath).path
        
        if manager.fileExists(atPath: dPath) {
            try? manager.removeItem(atPath: dPath)
//            self.showAlert(title: LocString("提示"), message: LocString("升级失败,请重试"), cancelText: nil)
//            return
        }
        
//        MTB033B_0.1.7.bin
        updateLabel.text = LocString("下载中...")
        Alamofire.download("http://hodafone.com.cn/qwear/update/\(id)/\(downLoadUrlPath)", to: destination).downloadProgress { progress in
            print("下载进度--\(progress.fractionCompleted)")
        }.responseData {[weak self] response in
            if let data = response.value {
                print("下载成功")
                self?.syncFile(response.destinationURL!.path, unzipPath: unzipPath)
//                response.destinationURL
            } else {
                self?.showAlert(title: LocString("提示"), message: LocString("升级失败,请重试"), cancelText: nil)
            }
        }
//开始下载
//        AF.download(url, interceptor: nil, to: dest).downloadProgress(closure: { (progress) in
//
//            debugPrint("-------下载进度: \(progress.fractionCompleted)")
//        }).responseData { (res) in
//            if let data = res.value {
//              //显示图片
//                let image = UIImage(data: data)
//                self.imgGif.image = image
//            }
//        }

    }
    func syncFile(_ path: String, unzipPath: String) {
        let manager = FileManager.default
//        let contentsOfPath = try? manager.contentsOfDirectory(atPath: path)
//        print(contentsOfPath)
        //       path    String    "/var/mobile/Containers/Data/Application/38F71EF2-43E6-415C-85BF-D7F29FFBC772/Documents/update/firmware.bin"
//        print(unzipPath)
//        let attributes = try? manager.attributesOfItem(atPath: path) //结果为Dictionary类型
//        print("文件大小:\(attributes![FileAttributeKey.size]!)")
//        print(NSSearchPathForDirectoriesInDomains(.cachesDirectory, .userDomainMask, true)[0])
//        let success: Bool = SSZipArchive.unzipFile(atPath: path, toDestination: unzipPath)
//        if !success {
//            self.showAlert(title: "", message: "升级失败,请重试")
//            return
//        }

        if !manager.fileExists(atPath: path) {
            self.showAlert(title: LocString("提示"), message: LocString("升级失败,请重试"), cancelText: nil)
            return
        }
//      return
        updateUserInteraction(true)
        updateLabel.text = LocString("正在升级中...")
        BluetoothManager.shared.syncFileWith(path: path, isFirmware: true) {[weak self] progress in
            let n = progress/2 * 2
            self?.updateImageView.image = UIImage(named: "update_\(n)")
            self?.progressLabel.text = "\(progress)%"
        } completion: {[weak self] error in
            self?.updateUserInteraction(false)
            if error == nil {
                self?.updateLabel.text = LocString("升级完成")
                self?.updateBtn.setTitle(LocString("升级完成"), for: .normal)
                self?.updateImageView.image = UIImage(named: "update_100")
                let str1 = LocString("当前已是最新版本")
                let string = NSMutableAttributedString(string: "\(str1)\nv \((self?.latestVersion)!)")
                string.addAttributes([.foregroundColor: UIColor.rgbColorFromHex(0x00993E)], range: NSMakeRange(str1.count, string.string.count-str1.count))
                self?.versionLabel.attributedText = string
                
            } else {
                self?.showAlert(title: LocString("提示"), message: LocString("升级失败,请重试"), cancelText: nil)
            }
        }
    }

//    func parseXML(_ data: Data) {
//        let parser = XMLParser(data: data)
//        parser.delegate = self
//        parser.parse()
//    }
    
//    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {
//        if elementName == "product"{
//            print(attributeDict)
//            if let least = attributeDict["least"] {
//                latestVersion = least
//                checkUpdate()
//            }
//            if let file = attributeDict["file"] {
//                downLoadUrlPath = file
//            }
//            if let id = attributeDict["id"] {
//                self.id = id
//            }
//
//        }
//    }
    
    deinit {
        print("deinit\(NSStringFromClass(type(of: self)))!!!!!!!")
    }
    
}




//    func compareVersion(nowVersion:String,newVersion:String) -> Bool {
//
//        let nowArray = nowVersion.split(separator: ".")
//
//        let newArray = newVersion.split(separator: ".")
//
//        let big = nowArray.count > newArray.count ? newArray.count : nowArray.count
//
//        for index in 0...big - 1 {
//
//            let first = nowArray[index]
//            let second = newArray[index]
//            if Int(first)! < Int(second)!  {
//                return true
//            }
//        }
//        return false
//    }