mirror of
https://github.com/qinyuhang/ShadowsocksX-NG-R.git
synced 2026-09-30 07:14:05 +00:00
163 lines
6.4 KiB
Swift
163 lines
6.4 KiB
Swift
//
|
|
// VersionChecker.swift
|
|
// ShadowsocksX-NG
|
|
//
|
|
// Created by 秦宇航 on 2017/1/9.
|
|
// Copyright © 2017年 qinyuhang. All rights reserved.
|
|
//
|
|
|
|
import Foundation
|
|
|
|
let _VERSION_XML_URL = "https://raw.githubusercontent.com/qinyuhang/ShadowsocksX-NG-R/develop/ShadowsocksX-NG/Info.plist"
|
|
let _VERSION_XML_LOCAL:String = Bundle.main.bundlePath + "/Contents/Info.plist"
|
|
|
|
class VersionChecker: NSObject {
|
|
var haveNewVersion: Bool = false
|
|
enum versionError: Error {
|
|
case CanNotGetOnlineData
|
|
}
|
|
func saveFile(fromURL: String, toPath: String, withName: String) -> Bool {
|
|
let manager = FileManager.default
|
|
let url = URL(string:fromURL)!
|
|
do {
|
|
let st = try String(contentsOf: url, encoding: String.Encoding.utf8)
|
|
print(st)
|
|
let data = st.data(using: String.Encoding.utf8)
|
|
manager.createFile( atPath: toPath + withName , contents: data, attributes: nil)
|
|
return true
|
|
|
|
} catch {
|
|
print(error)
|
|
return false
|
|
}
|
|
}
|
|
func showAlertView(Title: String, SubTitle: String, ConfirmBtn: String, CancelBtn: String) -> Int {
|
|
let alertView = NSAlert()
|
|
alertView.messageText = Title
|
|
alertView.informativeText = SubTitle
|
|
alertView.addButton(withTitle: ConfirmBtn)
|
|
if CancelBtn != "" {
|
|
alertView.addButton(withTitle: CancelBtn)
|
|
}
|
|
let action = alertView.runModal()
|
|
return action
|
|
}
|
|
func parserVersionString(strIn: String) -> Array<Int>{
|
|
var strTmp = strIn.substring(to: (strIn.range(of: "-")?.lowerBound)!)
|
|
if !strTmp.hasSuffix(".") {
|
|
strTmp += "."
|
|
}
|
|
var ret = [Int]()
|
|
|
|
repeat {
|
|
ret.append(Int(strTmp.substring(to: strTmp.range(of: ".")!.lowerBound))!)
|
|
print(strTmp.substring(to: strTmp.range(of: ".")!.lowerBound))
|
|
strTmp = strTmp.substring(from: strTmp.range(of: ".")!.upperBound)
|
|
} while(strTmp.range(of: ".") != nil);
|
|
|
|
return ret
|
|
}
|
|
func checkNewVersion() -> [String:Any] {
|
|
// return
|
|
// newVersion: Bool,
|
|
// error: String,
|
|
// alertTitle: String,
|
|
// alertSubtitle: String,
|
|
// alertConfirmBtn: String,
|
|
// alertCancelBtn: String
|
|
let showAlert: Bool = true
|
|
func getOnlineData() throws -> NSDictionary{
|
|
guard NSDictionary(contentsOf: URL(string:_VERSION_XML_URL)!) != nil else {
|
|
throw versionError.CanNotGetOnlineData
|
|
}
|
|
return NSDictionary(contentsOf: URL(string:_VERSION_XML_URL)!)!
|
|
}
|
|
|
|
var localData: NSDictionary = NSDictionary()
|
|
var onlineData: NSDictionary = NSDictionary()
|
|
|
|
localData = NSDictionary(contentsOfFile: _VERSION_XML_LOCAL)!
|
|
do{
|
|
try onlineData = getOnlineData()
|
|
}catch{
|
|
return ["newVersion" : false,
|
|
"error": "network error",
|
|
"Title": "网络错误",
|
|
"SubTitle": "由于网络错误无法检查更新",
|
|
"ConfirmBtn": "确认",
|
|
"CancelBtn": ""
|
|
]
|
|
}
|
|
|
|
let versionString:String = onlineData["CFBundleShortVersionString"] as! String
|
|
let buildString:String = onlineData["CFBundleVersion"] as! String
|
|
let currentVersionString:String = localData["CFBundleShortVersionString"] as! String
|
|
let currentBuildString:String = localData["CFBundleVersion"] as! String
|
|
var subtitle:String
|
|
if (versionString == currentVersionString){
|
|
|
|
if buildString == currentBuildString {
|
|
|
|
subtitle = "当前版本 " + currentVersionString + " build " + currentBuildString
|
|
return ["newVersion" : false,
|
|
"error": "",
|
|
"Title": "已是最新版本!",
|
|
"SubTitle": subtitle,
|
|
"ConfirmBtn": "确认",
|
|
"CancelBtn": ""
|
|
]
|
|
}
|
|
else {
|
|
haveNewVersion = true
|
|
|
|
subtitle = "新版本为 " + versionString + " build " + buildString + "\n" + "当前版本 " + currentVersionString + " build " + currentBuildString
|
|
return ["newVersion" : true,
|
|
"error": "",
|
|
"Title": "软件有更新!",
|
|
"SubTitle": subtitle,
|
|
"ConfirmBtn": "前往下载",
|
|
"CancelBtn": "取消"
|
|
]
|
|
}
|
|
}
|
|
else{
|
|
// 处理如果本地版本竟然比远程还新
|
|
|
|
var versionArr = parserVersionString(strIn: onlineData["CFBundleShortVersionString"] as! String)
|
|
var currentVersionArr = parserVersionString(strIn: localData["CFBundleShortVersionString"] as! String)
|
|
|
|
// 做补0处理
|
|
while (max(versionArr.count, currentVersionArr.count) != min(versionArr.count, currentVersionArr.count)) {
|
|
if (versionArr.count < currentVersionArr.count) {
|
|
versionArr.append(0)
|
|
}
|
|
else {
|
|
currentVersionArr.append(0)
|
|
}
|
|
}
|
|
|
|
for i in 0...(currentVersionArr.count - 1) {
|
|
if versionArr[i] > currentVersionArr[i] {
|
|
haveNewVersion = true
|
|
subtitle = "新版本为 " + versionString + " build " + buildString + "\n" + "当前版本 " + currentVersionString + " build " + currentBuildString
|
|
return ["newVersion" : true,
|
|
"error": "",
|
|
"Title": "软件有更新!",
|
|
"SubTitle": subtitle,
|
|
"ConfirmBtn": "前往下载",
|
|
"CancelBtn": "取消"
|
|
]
|
|
}
|
|
}
|
|
subtitle = "当前版本 " + currentVersionString + " build " + currentBuildString + "\n" + "远端版本 " + versionString + " build " + buildString
|
|
return ["newVersion" : false,
|
|
"error": "",
|
|
"Title": "已是最新版本!",
|
|
"SubTitle": subtitle,
|
|
"ConfirmBtn": "确认",
|
|
"CancelBtn": ""
|
|
]
|
|
}
|
|
}
|
|
}
|