MacOS开发

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

2020-08-31  本文已影响0人  voyager3

思路:
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()

上一篇下一篇

猜你喜欢

热点阅读