mirror of
https://github.com/qinyuhang/ShadowsocksX-NG-R.git
synced 2026-10-20 06:24:32 +00:00
Sync SSR-local
1. 更新 ss-locla 2. 现在开启软件自动检查更新了(bug UI会卡住一下,是异步的问题,待查) 3. 菜单添加检查更新按钮
This commit is contained in:
@@ -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 */,
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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"/>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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" = "分组:";
|
||||
|
||||
|
||||
Reference in New Issue
Block a user