Sync SSR-local

1. 更新 ss-locla
2. 现在开启软件自动检查更新了(bug UI会卡住一下,是异步的问题,待查)
3. 菜单添加检查更新按钮
This commit is contained in:
qinyuhang
2017-01-09 20:05:16 +08:00
parent 615b80c7fc
commit 6576ffd0cc
9 changed files with 130 additions and 7 deletions
@@ -16,6 +16,7 @@
0880CE401D6FE6D900BD39E2 /* example-gui-config.json in Resources */ = {isa = PBXBuildFile; fileRef = 0880CE3F1D6FE6D900BD39E2 /* example-gui-config.json */; };
088EC3971D5F5B8600E40791 /* whitelist.pac in Resources */ = {isa = PBXBuildFile; fileRef = 088EC3961D5F5B8600E40791 /* whitelist.pac */; };
088EC3991D5F5BA300E40791 /* whiteiplist.pac in Resources */ = {isa = PBXBuildFile; fileRef = 088EC3981D5F5BA300E40791 /* whiteiplist.pac */; };
08BDBB481E2361BD00C4BBC2 /* VersionChecker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 08BDBB471E2361BD00C4BBC2 /* VersionChecker.swift */; };
258E511BA910B0521B24DAB8 /* Pods_ShadowsocksX_NG.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 283ED1A8E9B711AC65670031 /* Pods_ShadowsocksX_NG.framework */; };
9B07EFA71D048BBB0052D9DF /* ss-local in Resources */ = {isa = PBXBuildFile; fileRef = 9B07EFA61D048BBB0052D9DF /* ss-local */; };
9B07EFAC1D048E880052D9DF /* menu_icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 9B07EFA81D048E880052D9DF /* menu_icon@2x.png */; };
@@ -114,6 +115,7 @@
088EC3961D5F5B8600E40791 /* whitelist.pac */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = whitelist.pac; sourceTree = "<group>"; };
088EC3981D5F5BA300E40791 /* whiteiplist.pac */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = whiteiplist.pac; sourceTree = "<group>"; };
08AF56C01D6AFA7C00DC4F46 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/PreferencesWindowController.strings"; sourceTree = "<group>"; };
08BDBB471E2361BD00C4BBC2 /* VersionChecker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VersionChecker.swift; sourceTree = "<group>"; };
19083CFCED87354F006967FF /* Pods_ShadowsocksX_NGUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShadowsocksX_NGUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; };
1E7783AEDB4A3BDDC9FF16AC /* libPods-proxy_conf_helper.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-proxy_conf_helper.a"; sourceTree = BUILT_PRODUCTS_DIR; };
283ED1A8E9B711AC65670031 /* Pods_ShadowsocksX_NG.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_ShadowsocksX_NG.framework; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -322,6 +324,7 @@
9B0BFFEF1D0460A70040E62B /* Info.plist */,
9BEEF06D1D04DCE400FC52B3 /* ServerProfile.swift */,
9BEEF06F1D04DDB100FC52B3 /* ServerProfileManager.swift */,
08BDBB471E2361BD00C4BBC2 /* VersionChecker.swift */,
083BF8381D82759600831C68 /* StatusItemView.swift */,
083BF83A1D8275A800831C68 /* SystemThemeChangeHelper.swift */,
9BEEF0771D04FE8A00FC52B3 /* LaunchAgentUtils.swift */,
@@ -688,6 +691,7 @@
08805F191D878CA5009B53E7 /* PingTest.swift in Sources */,
9B3FFF1E1D0732660019A709 /* Utils.m in Sources */,
9B3FFF321D08CEE40019A709 /* SWBQRCodeWindowController.m in Sources */,
08BDBB481E2361BD00C4BBC2 /* VersionChecker.swift in Sources */,
083BF8371D82742200831C68 /* PingClient.swift in Sources */,
083BF8361D82742200831C68 /* NetWorkMonitor.swift in Sources */,
083BF8331D82731900831C68 /* SimplePing.m in Sources */,
+15
View File
@@ -48,6 +48,7 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
@IBOutlet weak var lanchAtLoginMenuItem: NSMenuItem!
@IBOutlet weak var connectAtLaunchMenuItem: NSMenuItem!
@IBOutlet weak var ShowNetworkSpeedItem: NSMenuItem!
@IBOutlet weak var checkUpdateMenuItem: NSMenuItem!
// MARK: Variables
var statusItemView:StatusItemView!
@@ -206,6 +207,8 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
if defaults.bool(forKey: "ConnectAtLaunch") {
toggleRunning(toggleRunningMenuItem)
}
// Version Check!
checkForUpdate(mustShowAlert: false)
}
func applicationWillTerminate(_ aNotification: Notification) {
@@ -468,6 +471,10 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
NSWorkspace.shared().open(URL(string: "https://github.com/qinyuhang/ShadowsocksX-NG/issues")!)
}
@IBAction func checkForUpdate(_ sender: NSMenuItem) {
checkForUpdate(mustShowAlert: true)
}
@IBAction func showAbout(_ sender: NSMenuItem) {
NSApp.orderFrontStandardAboutPanel(sender);
NSApp.activate(ignoringOtherApps: true)
@@ -720,6 +727,14 @@ class AppDelegate: NSObject, NSApplicationDelegate, NSUserNotificationCenterDele
// }
}
func checkForUpdate(mustShowAlert: Bool) -> Void {
DispatchQueue.global().async {
DispatchQueue.main.async {
_ = VersionChecker().checkNewVersion(showAlert: mustShowAlert)
}
}
}
// MARK:
func handleURLEvent(_ event: NSAppleEventDescriptor, withReplyEvent replyEvent: NSAppleEventDescriptor) {
+9 -2
View File
@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11201" systemVersion="16A323" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="11762" systemVersion="16D17a" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11201"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="11762"/>
</dependencies>
<objects>
<customObject id="-2" userLabel="File's Owner" customClass="NSApplication">
@@ -17,6 +17,7 @@
<outlet property="RunningStatusMenuItem" destination="fzk-mE-CEV" id="R4x-gK-Qcw"/>
<outlet property="ShowNetworkSpeedItem" destination="a3h-uQ-DuO" id="OLq-K8-rEO"/>
<outlet property="autoModeMenuItem" destination="r07-Gu-aEz" id="9aH-pQ-Rgi"/>
<outlet property="checkUpdateMenuItem" destination="wyZ-4G-qg9" id="Sva-xA-VQY"/>
<outlet property="connectAtLaunchMenuItem" destination="aB3-cf-5j0" id="kW6-UF-38P"/>
<outlet property="exportAllServerProfileItem" destination="6k0-gn-DQv" id="1xA-cd-5Ia"/>
<outlet property="globalModeMenuItem" destination="Mw3-Jm-eXA" id="ar5-Yx-3ze"/>
@@ -214,6 +215,12 @@
<action selector="feedback:" target="Voe-Tx-rLC" id="ogn-lf-bqE"/>
</connections>
</menuItem>
<menuItem title="Check Updates" id="wyZ-4G-qg9">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="checkForUpdate:" target="Voe-Tx-rLC" id="HSc-jw-aqr"/>
</connections>
</menuItem>
<menuItem title="About" id="LgB-6g-Gba">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
@@ -293,7 +293,7 @@
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="NO" translatesAutoresizingMaskIntoConstraints="NO" id="8zX-44-xj8">
<rect key="frame" x="55" y="105" width="46" height="17"/>
<rect key="frame" x="55" y="102" width="46" height="17"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Group:" id="j0N-8s-9Z3">
<font key="font" metaFont="system"/>
<color key="textColor" name="labelColor" catalog="System" colorSpace="catalog"/>
@@ -309,7 +309,7 @@
<constraint firstItem="KdT-hY-ALS" firstAttribute="leading" secondItem="CbS-wf-XMN" secondAttribute="leading" id="7wS-bA-EZx"/>
<constraint firstItem="R4F-j7-GkK" firstAttribute="leading" secondItem="ef4-8J-eFn" secondAttribute="leading" id="8H4-fq-Si2"/>
<constraint firstItem="P1H-Vl-P4W" firstAttribute="leading" secondItem="8zX-44-xj8" secondAttribute="trailing" constant="12" id="9Nc-BF-7f1"/>
<constraint firstItem="8zX-44-xj8" firstAttribute="top" secondItem="EgC-0w-FPq" secondAttribute="bottom" constant="21" id="E6W-yf-hGQ"/>
<constraint firstItem="8zX-44-xj8" firstAttribute="top" secondItem="EgC-0w-FPq" secondAttribute="bottom" constant="24" id="E6W-yf-hGQ"/>
<constraint firstItem="q3C-S0-iNn" firstAttribute="top" secondItem="ZXA-oi-Zv3" secondAttribute="bottom" constant="20" id="FEG-Xh-U87"/>
<constraint firstItem="6ha-OP-X4G" firstAttribute="top" secondItem="dl9-Pk-Krw" secondAttribute="bottom" constant="22" id="FMk-4S-m3v"/>
<constraint firstItem="CbS-wf-XMN" firstAttribute="leading" secondItem="q3C-S0-iNn" secondAttribute="leading" id="FNr-O1-HJY"/>
@@ -331,7 +331,7 @@
<constraint firstItem="P1H-Vl-P4W" firstAttribute="trailing" secondItem="9CP-zt-WuH" secondAttribute="trailing" id="QGr-BM-E7I"/>
<constraint firstItem="ZXA-oi-Zv3" firstAttribute="trailing" secondItem="q3C-S0-iNn" secondAttribute="trailing" id="QwO-x4-05P"/>
<constraint firstItem="5ze-PG-cOA" firstAttribute="trailing" secondItem="CbS-wf-XMN" secondAttribute="trailing" id="Riv-KQ-heB"/>
<constraint firstItem="8zX-44-xj8" firstAttribute="bottom" secondItem="P1H-Vl-P4W" secondAttribute="bottom" constant="-5" id="SiB-oY-d4m"/>
<constraint firstItem="8zX-44-xj8" firstAttribute="bottom" secondItem="P1H-Vl-P4W" secondAttribute="bottom" constant="-2" id="SiB-oY-d4m"/>
<constraint firstItem="ZXA-oi-Zv3" firstAttribute="leading" secondItem="Qfe-Ql-iCO" secondAttribute="trailing" constant="8" symbolic="YES" id="ThC-cn-3Ti"/>
<constraint firstItem="5ze-PG-cOA" firstAttribute="leading" secondItem="CbS-wf-XMN" secondAttribute="leading" id="WQF-hJ-RpZ"/>
<constraint firstItem="Qfe-Ql-iCO" firstAttribute="baseline" secondItem="ZXA-oi-Zv3" secondAttribute="baseline" id="WTh-JA-YlZ"/>
+1 -1
View File
@@ -48,7 +48,7 @@
</dict>
</array>
<key>CFBundleVersion</key>
<string>2</string>
<string>3</string>
<key>LSApplicationCategoryType</key>
<string>public.app-category.utilities</string>
<key>LSMinimumSystemVersion</key>
+95
View File
@@ -0,0 +1,95 @@
//
// 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/shadowsocksr/ShadowsocksX-NG/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 checkNewVersion(showAlert: Bool) -> Bool {
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)!)!
}
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()
localData = NSDictionary(contentsOfFile: _VERSION_XML_LOCAL)!
do{
try onlineData = getOnlineData()
}catch{
_ = showAlertView(Title: "网络错误", SubTitle: "由于网络错误无法检查更新", ConfirmBtn: "确认", CancelBtn: "")
return false
}
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
}
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
}
}
}
Binary file not shown.
@@ -100,3 +100,5 @@
/* Class = "NSMenuItem"; title = "HTTP Proxy Preference ..."; ObjectID = "uEp-Gz-cu0"; */
"uEp-Gz-cu0.title" = "HTTP代理设置...";
"wyZ-4G-qg9.title" = "检查更新";
@@ -62,5 +62,5 @@
/* Class = "NSTextFieldCell"; title = "obfs-param:"; ObjectID = "aQv-HP-iKY"; */
"aQv-HP-iKY.title" = "混淆参数:";
/**/
"j0N-8s-9Z3.title" = "分组:"
"j0N-8s-9Z3.title" = "分组:";