From 6a4bff3cd5010ed17f5762396279ed735d50c997 Mon Sep 17 00:00:00 2001 From: qinyuhang Date: Fri, 13 Jan 2017 13:06:07 +0800 Subject: [PATCH] refactor check update possible bug: when the NSAlert view is pop up click the menu bar may cause crash, digging bug. --- ShadowsocksX-NG/AppDelegate.swift | 10 +++- ShadowsocksX-NG/VersionChecker.swift | 83 ++++++++++++++++------------ 2 files changed, 56 insertions(+), 37 deletions(-) diff --git a/ShadowsocksX-NG/AppDelegate.swift b/ShadowsocksX-NG/AppDelegate.swift index 2af7a3f..6321403 100644 --- a/ShadowsocksX-NG/AppDelegate.swift +++ b/ShadowsocksX-NG/AppDelegate.swift @@ -712,9 +712,17 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele } func checkForUpdate(mustShowAlert: Bool) -> Void { + let versionChecker = VersionChecker() DispatchQueue.global().async { + let newVersion = versionChecker.checkNewVersion() DispatchQueue.main.async { - _ = VersionChecker().checkNewVersion(showAlert: mustShowAlert) + if (mustShowAlert || newVersion["newVersion"] as! Bool){ + let alertResult = versionChecker.showAlertView(Title: newVersion["Title"] as! String, SubTitle: newVersion["SubTitle"] as! String, ConfirmBtn: newVersion["ConfirmBtn"] as! String, CancelBtn: newVersion["CancelBtn"] as! String) + print(alertResult) + if (newVersion["newVersion"] as! Bool && alertResult == 1000){ + NSWorkspace.shared().open(URL(string: "https://github.com/shadowsocksr/ShadowsocksX-NG/releases")!) + } + } } } } diff --git a/ShadowsocksX-NG/VersionChecker.swift b/ShadowsocksX-NG/VersionChecker.swift index b0b7a32..5483b8b 100644 --- a/ShadowsocksX-NG/VersionChecker.swift +++ b/ShadowsocksX-NG/VersionChecker.swift @@ -31,8 +31,26 @@ class VersionChecker: NSObject { return false } } - func checkNewVersion(showAlert: Bool) -> Bool { - + 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 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 @@ -40,18 +58,6 @@ class VersionChecker: NSObject { return NSDictionary(contentsOf: URL(string:_VERSION_XML_URL)!)! } - 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 - } - var localData: NSDictionary = NSDictionary() var onlineData: NSDictionary = NSDictionary() @@ -59,37 +65,42 @@ class VersionChecker: NSObject { do{ try onlineData = getOnlineData() }catch{ - _ = showAlertView(Title: "网络错误", SubTitle: "由于网络错误无法检查更新", ConfirmBtn: "确认", CancelBtn: "") - return false + return ["newVersion" : false, + "error": "network error", + "Title": "网络错误", + "SubTitle": "由于网络错误无法检查更新", + "ConfirmBtn": "确认", + "CancelBtn": "" + ] } if (onlineData["CFBundleShortVersionString"] as! String == localData["CFBundleShortVersionString"] as! String && onlineData["CFBundleVersion"] as! String == localData["CFBundleVersion"] as! String){ - if showAlert { - let currentVersionString:String = localData["CFBundleShortVersionString"] as! String - let currentBuildString:String = localData["CFBundleVersion"] as! String - _ = showAlertView(Title: "已是最新版本!", SubTitle: "当前版本 " + currentVersionString + " build " + currentBuildString, ConfirmBtn: "确认", CancelBtn: "") - } - return false + + let currentVersionString:String = localData["CFBundleShortVersionString"] as! String + let currentBuildString:String = localData["CFBundleVersion"] as! String + let subtitle = "当前版本 " + currentVersionString + " build " + currentBuildString + return ["newVersion" : false, + "error": "", + "Title": "已是最新版本!", + "SubTitle": subtitle, + "ConfirmBtn": "确认", + "CancelBtn": "" + ] } else{ haveNewVersion = true - // 弹窗提示有软件更新 + 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 - let action = showAlertView(Title: "软件有更新!", SubTitle: "新版本为 " + versionString + " build " + buildString + "\n" + "当前版本 " + currentVersionString + " build " + currentBuildString, ConfirmBtn: "前往下载", CancelBtn: "取消") - switch action { - case 1000: - // go to download - NSWorkspace.shared().open(URL(string: "https://github.com/shadowsocksr/ShadowsocksX-NG/releases")!) - break - case 1001: - // cancel - break - default: - break - } - return true + let subtitle = "新版本为 " + versionString + " build " + buildString + "\n" + "当前版本 " + currentVersionString + " build " + currentBuildString + return ["newVersion" : true, + "error": "", + "Title": "软件有更新!", + "SubTitle": subtitle, + "ConfirmBtn": "前往下载", + "CancelBtn": "取消" + ] } } }