美文网首页MacOS开发
MacOS开发笔记22-应用下载更新

MacOS开发笔记22-应用下载更新

作者: voyager3 | 来源:发表于2020-08-31 18:09 被阅读0次

    思路:
    1.版本更新配置文件(plist,xml,或者txt能解析的格式文件),再制作一个dmg文件,放置在服务器上
    2.每次启动APP更新配置文件,和本地版本相比较是否需要更新
    3.如果需要更新,则配置全局变量shoudUpdate为true,否则为false
    4.下载dmg文件
    5.在需要更新的地方,触发打开dmg文件
    6.弹出安装窗口后,退出当前应用

    具体的代码如下:

    import Cocoa
    import Alamofire
    
    let castPath = "http://xxxxx/cast.plist"
    let dmgPath = "https://xxxxx/YourProjectName.dmg"
    
    let castName = "cast.plist"
    let dmgName = "YourProjectName.dmg"
    
    let bashPath = "/bin/bash"
    
    let tempDirectory = "Caches"
    
    class APPUpdate: Any {
        var shouldUpdate = false
        static var shared: APPUpdate = {
            var instance = APPUpdate()
            return instance
        }()
        
        func downLoadCast() {
            let destination : DownloadRequest.Destination = { _, response in
                let library : String = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true)[0]
                var documentURL = URL(fileURLWithPath: library)
                documentURL.appendPathComponent(tempDirectory)
                let fileUrl = documentURL.appendingPathComponent(castName)
                return (fileUrl , [.removePreviousFile, .createIntermediateDirectories])
            }
            AF.download(castPath, to: destination).downloadProgress { progress in
            }.validate().responseData {response in
    let library : String = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true)[0]
                var documentURL = URL(fileURLWithPath: library)
                documentURL.appendPathComponent(tempDirectory)
                let fileUrl = documentURL.appendingPathComponent(castName)
                let fileManager = FileManager.default
                if fileManager.fileExists(atPath:fileUrl.path) {
                   let dic : NSDictionary = NSDictionary(contentsOfFile:fileUrl.path)!
                   let version : String = dic["version"] as! String
                   
                   let current = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String
                   self.shouldUpdate = self.checkUdpate(version, location: current)
                   if self.shouldUpdate == true {
                       self.downLoadDmg()
                   }else{
                       do {
                           try fileManager.removeItem(atPath: fileUrl.path)
                       } catch let error as NSError {
                           print("删除YourProjectName.dmg失败 \(error.debugDescription)")
                       }
                   }
                }
            }
        }
        
        func checkUdpate(_ current:String,location:String) -> Bool {
            var update = false
            let clv = Array(location.split(separator: "."))
            let csv = Array(current.split(separator: "."))
            if clv.count != 3 || csv.count != 3 {
                return update
            }
            for (i,item) in clv.enumerated() {
                let update_item = csv[i]
                let locationInt = Int(item)!
                let updateInt = Int(update_item)!
                if locationInt < updateInt {
                    update = true
                    break
                }
            }
            return update
        }
        
        func doUpdate() {
            let library : String = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true)[0]
            var documentURL = URL(fileURLWithPath: library)
            documentURL.appendPathComponent(tempDirectory)
            let result = doCmd(cmd: "cd \(documentURL.path);open \(dmgName)")
            print("doCmd result : \(String(describing: result))")
        }
        
        func doCmd(cmd:String) -> String? {
            
            let task = Process()
            task.launchPath = bashPath
            let arr = NSArray.init(objects: "-c",cmd)
            task.arguments = arr as? [String]
            
            let pipe = Pipe()
            task.standardOutput = pipe
            task.standardError = pipe
            
            let fileHandle = pipe.fileHandleForReading
            task.launch()
            let taskData = fileHandle.readDataToEndOfFile()
            
            self.shouldUpdate = false
            
            return NSString(data: taskData, encoding: String.Encoding.utf8.rawValue) as String?
        }
        
        func downLoadDmg() {
            let destination : DownloadRequest.Destination = { _, response in
                let library : String = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true)[0]
                var documentURL = URL(fileURLWithPath: library)
                documentURL.appendPathComponent(tempDirectory)
                let fileUrl = documentURL.appendingPathComponent(dmgName)
                return (fileUrl , [.removePreviousFile, .createIntermediateDirectories])
            }
            AF.download(dmgPath, to: destination).downloadProgress { progress in
            }.validate().responseData {response in
                let library : String = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true)[0]
                var documentURL = URL(fileURLWithPath: library)
                documentURL.appendPathComponent(tempDirectory)
                let fileUrl = documentURL.appendingPathComponent(dmgName)
                print("下载dmg完成 - \(fileUrl)")
            }
        }
        
    }
    

    使用代码示例:
    1.判断是否需要更新

    
    if (APPUpdate.shared.shouldUpdate == true) {
        //your code
    }
    
    

    2.更新

    
    APPUpdate.shared.doUpdate()
    
    

    相关文章

      网友评论

        本文标题:MacOS开发笔记22-应用下载更新

        本文链接:https://www.haomeiwen.com/subject/mhkpsktx.html