Update On Sat Jul 6 20:29:38 CEST 2024

This commit is contained in:
github-action[bot]
2024-07-06 20:29:38 +02:00
parent 06deae9882
commit 9e781f8d94
89 changed files with 2270 additions and 1471 deletions

View File

@@ -35,8 +35,6 @@ do
echo "appdmg V2rayU-64.dmg"
rm -f V2rayU-64.dmg
appdmg appdmg.json "V2rayU-64.dmg"
#rm -fr release/V2rayU.app
./sign_update "V2rayU-64.dmg"
break
;;
@@ -48,8 +46,6 @@ do
echo "appdmg V2rayU-arm64.dmg"
rm -f V2rayU-arm64.dmg
appdmg appdmg.json "V2rayU-arm64.dmg"
#rm -fr release/V2rayU.app
./sign_update "V2rayU-64.dmg"
break
;;

View File

@@ -1,10 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>compileBitcode</key>
<false/>
<key>method</key>
<string>development</string>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>method</key>
<dict/>
<key>development</key>
<true/>
</dict>
</plist>

View File

@@ -1,13 +0,0 @@
#!/bin/bash
# publish.sh
# V2rayU
#
# Created by yanue on 2019/7/18.
# Copyright © 2019 yanue. All rights reserved.
read -p "请输入版本描述: " release_note
#pushRelease ${release_note}
generateAppcast ${release_note}
echo "Done"

View File

@@ -13,26 +13,60 @@ APP_TITLE="${APP_NAME} - V${APP_Version}"
AppCastDir=$HOME/swift/appcast
function updatePlistVersion() {
echo "Updating plist version..."
buildString=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${BASE_DIR}/V2rayU/${INFOPLIST_FILE}")
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildString" "${BASE_DIR}/V2rayU/${INFOPLIST_FILE}"
if [ $? -eq 0 ]; then
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $buildString" "${BASE_DIR}/V2rayU/${INFOPLIST_FILE}"
if [ $? -ne 0 ]; then
echo "Error: Failed to set CFBundleVersion"
exit 1
fi
else
echo "Error: Failed to read CFBundleShortVersionString"
exit 1
fi
}
function build() {
echo "Building V2rayU."${APP_Version}
echo "Building V2rayU version ${APP_Version}"
echo "Cleaning up old archive & app..."
rm -rf ${V2rayU_ARCHIVE} ${V2rayU_RELEASE}
if [ $? -ne 0 ]; then
echo "Error: Failed to clean up old archive & app"
exit 1
fi
echo "Building archive... please wait a minute"
xcodebuild -workspace ${BASE_DIR}/V2rayU.xcworkspace -config Release -scheme V2rayU -archivePath ${V2rayU_ARCHIVE} archive
if [ $? -ne 0 ]; then
echo "Error: Failed to build archive"
exit 1
fi
echo "Exporting archive..."
xcodebuild -archivePath ${V2rayU_ARCHIVE} -exportArchive -exportPath ${V2rayU_RELEASE} -exportOptionsPlist ./build.plist
if [ $? -ne 0 ]; then
echo "Error: Failed to export archive"
exit 1
fi
echo "Cleaning up archive..."
rm -rf ${V2rayU_ARCHIVE}
if [ $? -ne 0 ]; then
echo "Error: Failed to clean up archive"
exit 1
fi
echo "Setting permissions for resources..."
chmod -R 755 "${V2rayU_RELEASE}/${APP_NAME}.app/Contents/Resources/v2ray-core"
chmod -R 755 "${V2rayU_RELEASE}/${APP_NAME}.app/Contents/Resources/unzip.sh"
if [ $? -ne 0 ]; then
echo "Error: Failed to set permissions for resources"
exit 1
fi
echo "Build and export completed successfully."
}
function createDmg() {
@@ -209,9 +243,6 @@ function createDmgByAppdmg() {
echo ${BUILD_DIR}/appdmg.json
appdmg appdmg.json ${DMG_FINAL}
# appcast sign update
${AppCastDir}/bin/sign_update ${DMG_FINAL}
# umount "/Volumes/${APP_NAME}"
}
@@ -256,7 +287,7 @@ function makeDmg() {
}
#makeDmg
createDmgByAppdmg
echo 'done'

View File

@@ -1,23 +0,0 @@
#!/bin/sh
# sign.sh
# V2rayU
#
# Created by yanue on 2023/8/1.
# Copyright © 2023 yanue. All rights reserved.
set -ex
TOKEN=$1
release_id=$2
echo "token $TOKEN, release ${RELEASE_ID}"
curl -X "PATCH" "https://api.appcenter.ms/v0.1/apps/yanue/V2rayU/releases/${release_id}" \
-H "X-API-Token: $TOKEN" \
-H 'Content-Type: application/json; charset=utf-8' \
-d '{
"release_notes": "test",
"metadata": {
"ed_signature": "PW8pDnr5VZkmC93gZjUDlHI8gkJSspPoDU3DdhsMkps"
}
}'

Binary file not shown.

View File

@@ -10,8 +10,7 @@ target 'V2rayU' do
# Pods for V2rayU
pod 'FirebaseAnalytics', '~> 10.24.0'
pod 'FirebaseCrashlytics'
pod 'Alamofire'
pod 'SwiftyJSON'
pod 'SwiftyJSON'/
# master branch
pod 'Preferences', :git => 'https://github.com/sindresorhus/Preferences.git'
pod 'QRCoder'
@@ -21,11 +20,11 @@ target 'V2rayU' do
end
# fix libarclite_macosx.a need min deploy target 10.14
# fix libarclite_macosx.a need min deploy target 11.0
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['MACOSX_DEPLOYMENT_TARGET'] = '10.14'
config.build_settings['MACOSX_DEPLOYMENT_TARGET'] = '11.0'
end
end
end

View File

@@ -1,5 +1,4 @@
PODS:
- Alamofire (4.8.2)
- FirebaseAnalytics (10.24.0):
- FirebaseAnalytics/AdIdSupport (= 10.24.0)
- FirebaseCore (~> 10.0)
@@ -112,26 +111,22 @@ PODS:
- PromisesSwift (2.4.0):
- PromisesObjC (= 2.4.0)
- QRCoder (1.1.0)
- Sparkle (2.6.2)
- Swifter (1.4.7)
- SwiftyJSON (5.0.0)
- Yams (5.0.6)
DEPENDENCIES:
- Alamofire
- FirebaseAnalytics (~> 10.24.0)
- FirebaseCrashlytics
- MASShortcut
- Preferences (from `https://github.com/sindresorhus/Preferences.git`)
- QRCoder
- Sparkle (~> 2.0)
- Swifter
- SwiftyJSON
- Yams
SPEC REPOS:
https://github.com/CocoaPods/Specs.git:
- Alamofire
- FirebaseAnalytics
- FirebaseCore
- FirebaseCoreExtension
@@ -148,7 +143,6 @@ SPEC REPOS:
- PromisesObjC
- PromisesSwift
- QRCoder
- Sparkle
- Swifter
- SwiftyJSON
- Yams
@@ -163,7 +157,6 @@ CHECKOUT OPTIONS:
:git: https://github.com/sindresorhus/Preferences.git
SPEC CHECKSUMS:
Alamofire: ae5c501addb7afdbb13687d7f2f722c78734c2d3
FirebaseAnalytics: b5efc493eb0f40ec560b04a472e3e1a15d39ca13
FirebaseCore: 11dc8a16dfb7c5e3c3f45ba0e191a33ac4f50894
FirebaseCoreExtension: af5fd85e817ea9d19f9a2659a376cf9cf99f03c0
@@ -181,11 +174,10 @@ SPEC CHECKSUMS:
PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
PromisesSwift: 9d77319bbe72ebf6d872900551f7eeba9bce2851
QRCoder: cbd2bee531cc86d286df7942334cfed94c803ae4
Sparkle: a62c7dc4f410ced73beb2169cf1d3cc3f028a295
Swifter: 2327ef5d872c638aebab79646ce494af508b0c8f
SwiftyJSON: 36413e04c44ee145039d332b4f4e2d3e8d6c4db7
Yams: e10dae147f517ed57ecae37c5e8681bdf8fcab65
PODFILE CHECKSUM: 071aabe40b11d56fb50a9b83f6ed47079838bdee
PODFILE CHECKSUM: d61ad825ad5d61b2b98237544e21946c9babe3a0
COCOAPODS: 1.15.2

View File

@@ -25,7 +25,6 @@
664EB377216C9A5F00B6AE0D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 664EB376216C9A5F00B6AE0D /* Assets.xcassets */; };
664EB392216CA9E800B6AE0D /* ConfigWindow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 664EB390216CA9E800B6AE0D /* ConfigWindow.swift */; };
6662C20B240EA782000AF6CD /* PreferenceDns.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6662C209240EA782000AF6CD /* PreferenceDns.xib */; };
667029CA21AF8E7A0079EF41 /* Sparkle.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 667029C921AF8E7A0079EF41 /* Sparkle.framework */; };
667029D321AFB86E0079EF41 /* QrcodeWindow.xib in Resources */ = {isa = PBXBuildFile; fileRef = 667029D121AFB86E0079EF41 /* QrcodeWindow.xib */; };
66784AFC2170486D00AD307F /* Util.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66784AFB2170486D00AD307F /* Util.swift */; };
667ECE722A9A05EC009B00EC /* main.swift in Sources */ = {isa = PBXBuildFile; fileRef = 667ECE712A9A05EC009B00EC /* main.swift */; };
@@ -110,15 +109,11 @@
6608D9DD2182C92D00A0E0DD /* v2rayOutbound.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = v2rayOutbound.swift; sourceTree = "<group>"; };
6608D9E12182C9C100A0E0DD /* v2rayStream.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = v2rayStream.swift; sourceTree = "<group>"; };
660D0E59216E0158000C2922 /* V2rayServer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; lineEnding = 0; path = V2rayServer.swift; sourceTree = "<group>"; usesTabs = 0; wrapsLines = 0; };
66107B8722DEDBE4002FFB60 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
66107B8922DEE445002FFB60 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; };
6618372823E9BF1A000F7410 /* ToastWindow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ToastWindow.swift; sourceTree = "<group>"; };
6618372D23E9BF73000F7410 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/ToastWindow.xib; sourceTree = "<group>"; };
66193A8523EE45B200289B6A /* PreferenceRouting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PreferenceRouting.swift; sourceTree = "<group>"; };
66193A8823EE46BC00289B6A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = V2rayU/Base.lproj/PreferenceRouting.xib; sourceTree = SOURCE_ROOT; };
66193A9323EF1EF600289B6A /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "../zh-Hans.lproj/PreferenceRouting.strings"; sourceTree = "<group>"; };
66193A9523EF1EFA00289B6A /* zh-HK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-HK"; path = "../zh-HK.lproj/PreferenceRouting.strings"; sourceTree = "<group>"; };
6625848D2AB745E700DFDC1E /* sign.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = sign.sh; sourceTree = "<group>"; };
6625848E2AB746D500DFDC1E /* appdmg.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = appdmg.sh; sourceTree = "<group>"; };
662F0ACE2AB720C700884C17 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = ../en.lproj/PreferenceGeneral.strings; sourceTree = "<group>"; };
663F040525ED4B2C00687600 /* V2rayLaunch.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = V2rayLaunch.swift; sourceTree = "<group>"; };
@@ -126,19 +121,17 @@
664B95DD217062A500DBC941 /* Alamofire */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Alamofire; path = Pods/Alamofire; sourceTree = "<group>"; };
664BAC462C2DB0E100654FB7 /* V2rayRouting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = V2rayRouting.swift; sourceTree = "<group>"; };
664BAC482C314CD600654FB7 /* AppVersion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppVersion.swift; sourceTree = "<group>"; };
664BAC4F2C394AA000654FB7 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "../zh-Hans.lproj/PreferenceRouting.strings"; sourceTree = "<group>"; };
664EB371216C9A5E00B6AE0D /* V2rayU.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = V2rayU.app; sourceTree = BUILT_PRODUCTS_DIR; };
664EB374216C9A5E00B6AE0D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
664EB376216C9A5F00B6AE0D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
664EB379216C9A5F00B6AE0D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/MainMenu.xib; sourceTree = "<group>"; };
664EB37B216C9A5F00B6AE0D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
664EB390216CA9E800B6AE0D /* ConfigWindow.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConfigWindow.swift; sourceTree = "<group>"; };
664FC05321A70C4300048FE3 /* build.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = build.plist; sourceTree = "<group>"; };
6653C20422E0A2B700754D66 /* publish.sh */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = publish.sh; sourceTree = "<group>"; };
665DC9BA22A542F90062337B /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = System/Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
6662C20A240EA782000AF6CD /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = V2rayU/Base.lproj/PreferenceDns.xib; sourceTree = SOURCE_ROOT; };
6662C20C240EA794000AF6CD /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "../zh-Hans.lproj/PreferenceDns.strings"; sourceTree = "<group>"; };
6662C20D240EA797000AF6CD /* zh-HK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-HK"; path = "../zh-HK.lproj/PreferenceDns.strings"; sourceTree = "<group>"; };
667029C921AF8E7A0079EF41 /* Sparkle.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Sparkle.framework; path = "../../Downloads/Sparkle-1.21.0/Sparkle.framework"; sourceTree = "<group>"; };
667029D221AFB86E0079EF41 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/QrcodeWindow.xib; sourceTree = "<group>"; };
66784AFB2170486D00AD307F /* Util.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Util.swift; sourceTree = "<group>"; };
667ECE6F2A9A05EB009B00EC /* V2rayUTool */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = V2rayUTool; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -154,7 +147,9 @@
669A73AC233776B900807CF9 /* zh-HK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-HK"; path = "../zh-HK.lproj/PreferenceGeneral.strings"; sourceTree = "<group>"; };
669A73AD233776B900807CF9 /* zh-HK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-HK"; path = "../zh-HK.lproj/PreferencePac.strings"; sourceTree = "<group>"; };
669A73AE233776B900807CF9 /* zh-HK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-HK"; path = "../zh-HK.lproj/PreferenceSubscription.strings"; sourceTree = "<group>"; };
669A73AF233776B900807CF9 /* zh-HK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-HK"; path = "zh-HK.lproj/Localizable.strings"; sourceTree = "<group>"; };
66A358662C39517B00914A25 /* zh-HK */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-HK"; path = "zh-HK.lproj/Localizable.strings"; sourceTree = "<group>"; };
66A358672C39517F00914A25 /* zh-Hans */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "zh-Hans"; path = "zh-Hans.lproj/Localizable.strings"; sourceTree = "<group>"; };
66A358682C3959AE00914A25 /* build.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; path = build.plist; sourceTree = "<group>"; };
66A5CE4521706B5A009B08B2 /* Pods_V2rayU.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Pods_V2rayU.framework; sourceTree = BUILT_PRODUCTS_DIR; };
66A77BE2268225790097A126 /* v2ray-core */ = {isa = PBXFileReference; lastKnownFileType = folder; name = "v2ray-core"; path = "Build/v2ray-core"; sourceTree = "<group>"; };
66ACB19F21757D5B005B5881 /* MainMenu.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainMenu.swift; sourceTree = "<group>"; };
@@ -205,7 +200,6 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
667029CA21AF8E7A0079EF41 /* Sparkle.framework in Frameworks */,
66973EB721797719001FEA1E /* ServiceManagement.framework in Frameworks */,
F260898E336CFA5EAB07ADC9 /* Pods_V2rayU.framework in Frameworks */,
);
@@ -313,12 +307,10 @@
66FEAD44217D75D7009DECF9 /* Build */ = {
isa = PBXGroup;
children = (
66A358682C3959AE00914A25 /* build.plist */,
6625848E2AB746D500DFDC1E /* appdmg.sh */,
6625848D2AB745E700DFDC1E /* sign.sh */,
664FC05321A70C4300048FE3 /* build.plist */,
66FEAD45217D75FC009DECF9 /* release.sh */,
6D6DFD93CE866018306A090E /* pac */,
6653C20422E0A2B700754D66 /* publish.sh */,
6D6DF927AC79EEF7378C192A /* appdmg.json */,
);
path = Build;
@@ -360,7 +352,6 @@
children = (
665DC9BA22A542F90062337B /* AppKit.framework */,
664666A021CBD6C60094F0B7 /* libPods-V2rayUTool.a */,
667029C921AF8E7A0079EF41 /* Sparkle.framework */,
66973EB621797719001FEA1E /* ServiceManagement.framework */,
66A5CE4521706B5A009B08B2 /* Pods_V2rayU.framework */,
664B95DD217062A500DBC941 /* Alamofire */,
@@ -595,9 +586,9 @@
66107B8822DEDBE4002FFB60 /* Localizable.strings */ = {
isa = PBXVariantGroup;
children = (
66107B8722DEDBE4002FFB60 /* zh-Hans */,
66107B8922DEE445002FFB60 /* en */,
669A73AF233776B900807CF9 /* zh-HK */,
66A358662C39517B00914A25 /* zh-HK */,
66A358672C39517F00914A25 /* zh-Hans */,
);
name = Localizable.strings;
sourceTree = "<group>";
@@ -614,8 +605,7 @@
isa = PBXVariantGroup;
children = (
66193A8823EE46BC00289B6A /* Base */,
66193A9323EF1EF600289B6A /* zh-Hans */,
66193A9523EF1EFA00289B6A /* zh-HK */,
664BAC4F2C394AA000654FB7 /* zh-Hans */,
);
name = PreferenceRouting.xib;
sourceTree = "<group>";
@@ -844,14 +834,15 @@
buildSettings = {
ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 4.0.0;
CURRENT_PROJECT_VERSION = 4.2.0;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DEVELOPMENT_TEAM = RJYEH6TCJD;
ENABLE_ONLY_ACTIVE_RESOURCES = YES;
INFOPLIST_FILE = V2rayU/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = V2rayU;
@@ -860,7 +851,7 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 4.0.0;
MARKETING_VERSION = 4.2.0;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = net.yanue.V2rayU;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -878,14 +869,15 @@
buildSettings = {
ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = NO;
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 4.0.0;
CURRENT_PROJECT_VERSION = 4.2.0;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = "";
DEVELOPMENT_TEAM = RJYEH6TCJD;
ENABLE_ONLY_ACTIVE_RESOURCES = YES;
INFOPLIST_FILE = V2rayU/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = V2rayU;
@@ -894,7 +886,7 @@
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 11.0;
MARKETING_VERSION = 4.0.0;
MARKETING_VERSION = 4.2.0;
ONLY_ACTIVE_ARCH = NO;
PRODUCT_BUNDLE_IDENTIFIER = net.yanue.V2rayU;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -912,8 +904,9 @@
ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = "";
DEVELOPMENT_TEAM = RJYEH6TCJD;
ENABLE_HARDENED_RUNTIME = YES;
MACOSX_DEPLOYMENT_TARGET = 11.0;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -927,8 +920,9 @@
ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = "";
DEVELOPMENT_TEAM = RJYEH6TCJD;
ENABLE_HARDENED_RUNTIME = YES;
MACOSX_DEPLOYMENT_TARGET = 11.0;
PRODUCT_NAME = "$(TARGET_NAME)";

View File

@@ -45,6 +45,16 @@ struct GithubAsset: Codable {
}
}
struct GithubError: Codable {
let message: String
let documentationUrl: String
enum CodingKeys: String, CodingKey {
case message
case documentationUrl = "documentation_url"
}
}
let V2rayUpdater = AppCheckController()
// AppCheckController -
@@ -169,22 +179,46 @@ class AppCheckController: NSWindowController {
}
}
} catch {
print("Error decoding JSON: \(error)")
DispatchQueue.main.async {
// update progress text
self.bindData.progressText = "Check failed: \(error)"
var title = "Check failed!"
var toast = "\(error)"
if isMainland {
title = "检查失败"
toast = "\(error)";
//
do {
let decoder = JSONDecoder()
// try decode data
let data: GithubError = try decoder.decode(GithubError.self, from: data)
DispatchQueue.main.async {
// update progress text
self.bindData.progressText = "Check failed: \(error)"
var title = "Check failed!"
if isMainland {
title = "检查失败"
}
var toast = "\(data.message)\n\(data.documentationUrl)";
// open dialog
alertDialog(title: title, message: toast)
// sleep 2s
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
// close window
self.closeWindow()
}
}
// open dialog
alertDialog(title: title, message: toast)
// sleep 2s
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
// close window
self.closeWindow()
} catch {
print("Error decoding JSON: \(error)")
DispatchQueue.main.async {
// update progress text
self.bindData.progressText = "Check failed: \(error)"
var title = "Check failed!"
var toast = "\(error)"
if isMainland {
title = "检查失败"
toast = "\(error)";
}
// open dialog
alertDialog(title: title, message: toast)
// sleep 2s
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
// close window
self.closeWindow()
}
}
}
}
@@ -258,7 +292,7 @@ class AppVersionController: NSWindowController {
let window = NSWindow(contentRect: NSRect(x: 0, y: 0, width: 500, height: 300),
styleMask: [.titled, .closable, .resizable],
backing: .buffered, defer: false)
window.title = "Software Update"
window.title = "V2rayU Update"
window.contentView = contentView
super.init(window: window)
@@ -272,19 +306,37 @@ class AppVersionController: NSWindowController {
}
func show(release: GithubRelease) {
bindData.title = "A new version of V2rayU is available!"
bindData.description = "V2rayU \(appVersion) is now available—you have \(release.tagName). Would you like to download it now?"
bindData.releaseNotes = release.name + "\n" + release.body
self.release = release
print("bindData.releaseNotes", bindData.releaseNotes)
// bring window to front
window?.orderFrontRegardless()
// center position
window?.center()
// make window key
window?.makeKeyAndOrderFront(nil)
// activate app
NSApp.activate(ignoringOtherApps: true)
DispatchQueue.main.async {
self.release = release
if isMainland {
self.bindData.title = "A new version of V2rayU is available!"
if release.prerelease{
self.bindData.description = "V2rayU \(release.tagName) preview is now available, you have \(appVersion). Would you like to download it now?"
} else {
self.bindData.description = "V2rayU \(release.tagName) is now available, you have \(appVersion). Would you like to download it now?"
}
self.bindData.releaseNotes = release.name + "\n" + release.body
} else {
self.bindData.title = "V2rayU 有新版本上线了!"
if release.prerelease {
self.bindData.description = "V2rayU 已上线 \(release.tagName) 预览版,您有的版本 \(appVersion) —,需要立即下载吗?"
} else {
self.bindData.description = "V2rayU 已上线 \(release.tagName),您有的版本 \(appVersion) —,需要立即下载吗?"
}
self.bindData.releaseNotes = release.name + "\n" + release.body
self.bindData.releaseNodesTitle = "更新日志"
self.bindData.skipVersion = "跳过此版本"
self.bindData.installUpdate = "安装此版本"
}
// bring window to front
self.window?.orderFrontRegardless()
// center position
self.window?.center()
// make window key
self.window?.makeKeyAndOrderFront(nil)
// activate app
NSApp.activate(ignoringOtherApps: true)
}
}
required init?(coder: NSCoder) {
@@ -309,10 +361,10 @@ class AppVersionController: NSWindowController {
func skipAction() {
print("Skip action")
// UserDefaults
UserDefaults.standard.set(release.tagName, forKey: "skipAppVersion")
//
DispatchQueue.main.async {
// UserDefaults
UserDefaults.standard.set(self.release.tagName, forKey: "skipAppVersion")
//
self.window?.close()
}
}
@@ -320,8 +372,10 @@ class AppVersionController: NSWindowController {
class BindData: ObservableObject {
@Published var title = "A new version of V2rayU App is available!"
@Published var description = ""
@Published var releaseNotes = """
"""
@Published var releaseNotes = ""
@Published var releaseNodesTitle = "Release Notes:"
@Published var skipVersion = "Skip This Version!"
@Published var installUpdate = "Install Update!"
}
struct ContentView: View {
@@ -347,7 +401,7 @@ class AppVersionController: NSWindowController {
Text(bindData.description)
.padding(.trailing, 20)
Text("Release Notes:")
Text(bindData.releaseNodesTitle)
.font(.headline)
.bold()
.padding(.top, 20)
@@ -364,22 +418,25 @@ class AppVersionController: NSWindowController {
Spacer(minLength: 20) // margin 40
}
HStack {
Button(bindData.skipVersion) {
skipAction()
}
Spacer()
Button(bindData.installUpdate) {
installAction()
}
.padding(.trailing, 20)
.keyboardShortcut(.defaultAction)
}
.padding(.top,20)
.padding(.bottom,20)
}
}
HStack {
Button("Skip This Version") {
skipAction()
}
Spacer()
Button("Install Update") {
installAction()
}
.keyboardShortcut(.defaultAction)
}
.padding(20)
}
.frame(width: 500, height: 300)
}

View File

@@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="21225" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="32700.99.1234" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES" customObjectInstantitationMethod="direct">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="21225"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="22690"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@@ -51,7 +51,7 @@
<autoresizingMask key="autoresizingMask"/>
</scroller>
</scrollView>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LeF-Sd-TXL">
<textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" allowsCharacterPickerTouchBarItem="YES" translatesAutoresizingMaskIntoConstraints="NO" id="LeF-Sd-TXL">
<rect key="frame" x="18" y="319" width="295" height="21"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES"/>
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" alignment="left" title="V2ray Dns Json Text:" id="W0g-B7-neT">
@@ -82,7 +82,7 @@
<action selector="save:" target="-2" id="ec3-n0-TCm"/>
</connections>
</button>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="f4X-IX-Vz3" userLabel="Set the rules line by line: domain or ip">
<textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="f4X-IX-Vz3" userLabel="Set the rules line by line: domain or ip">
<rect key="frame" x="18" y="22" width="251" height="17"/>
<autoresizingMask key="autoresizingMask"/>
<textFieldCell key="cell" lineBreakMode="clipping" title="* Please input v2ray DnsObject json text" id="yfy-JP-THq" userLabel="Set the rules line by line: domain or ip">
@@ -91,7 +91,7 @@
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="HDw-wR-poM">
<textField focusRingType="none" horizontalHuggingPriority="251" verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="HDw-wR-poM">
<rect key="frame" x="18" y="343" width="424" height="17"/>
<autoresizingMask key="autoresizingMask"/>
<textFieldCell key="cell" lineBreakMode="clipping" alignment="center" id="ztP-ok-6QX">

View File

@@ -4,14 +4,14 @@
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleIconFile</key>
<string>AppIcon</string>
<key>CFBundleGetInfoString</key>
<string></string>
<key>CFBundleDisplayName</key>
<true/>
<key>CFBundleExecutable</key>
<string>$(EXECUTABLE_NAME)</string>
<key>CFBundleGetInfoString</key>
<string></string>
<key>CFBundleIconFile</key>
<string>AppIcon</string>
<key>CFBundleIdentifier</key>
<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>
<key>CFBundleInfoDictionaryVersion</key>

View File

@@ -6,8 +6,6 @@
// Copyright © 2019 yanue. All rights reserved.
//
import SwiftyJSON
// ping and choose fastest v2ray
var inPing = false
var inPingCurrent = false

View File

@@ -8,7 +8,6 @@
import Cocoa
import Preferences
import SwiftyJSON
final class PreferenceSubscribeViewController: NSViewController, PreferencePane, NSTabViewDelegate {
let preferencePaneIdentifier = PreferencePane.Identifier.subscribeTab

View File

@@ -9,7 +9,6 @@
import Cocoa
import SystemConfiguration
import Swifter
import Alamofire
let LAUNCH_AGENT_NAME = "yanue.v2rayu.v2ray-core"
let AppResourcesPath = Bundle.main.bundlePath + "/Contents/Resources"

View File

@@ -7,7 +7,6 @@
//
import Cocoa
import SwiftyJSON
// ----- v2ray server manager -----
class V2rayServer: NSObject {

View File

@@ -7,7 +7,6 @@
//
import Cocoa
import SwiftyJSON
import Yams
// ----- v2ray subscribe manager -----

View File

@@ -5,4 +5,3 @@
Created by yanue on 2019/7/17.
Copyright © 2019 yanue. All rights reserved.
*/
// Localizable App Name是App在英语环境环境下显示的名称

View File

@@ -5,4 +5,3 @@
Created by yanue on 2019/7/17.
Copyright © 2019 yanue. All rights reserved.
*/
// Localizable App Name是App在英语环境环境下显示的名称

View File

@@ -1,45 +1,45 @@
/* Class = "NSTextFieldCell"; title = "Domain Strategy:"; ObjectID = "22k-l7-G7a"; */
"22k-l7-G7a.title" = "域名策略:";
/* Class = "NSTextFieldCell"; title = "Block:"; ObjectID = "0Cd-bg-07K"; */
"0Cd-bg-07K.title" = "Block:";
/* Class = "NSMenuItem"; title = "Bypassing LAN and mainland address"; ObjectID = "3qq-dt-TS9"; */
"3qq-dt-TS9.title" = "绕过局域网和大陆地址";
/* Class = "NSMenuItem"; title = "IPOnDemand"; ObjectID = "2ST-s0-RrI"; */
"2ST-s0-RrI.title" = "IPOnDemand";
/* Class = "NSTextFieldCell"; title = "Routing Rule:"; ObjectID = "4rB-9k-291"; */
"4rB-9k-291.title" = "路由模式:";
/* Class = "NSTextFieldCell"; title = "Direct:"; ObjectID = "3hZ-qS-PUG"; */
"3hZ-qS-PUG.title" = "Direct:";
/* Class = "NSButtonCell"; title = "save"; ObjectID = "8g2-Nj-m07"; */
"8g2-Nj-m07.title" = "保存";
"8g2-Nj-m07.title" = "save";
/* Class = "NSMenuItem"; title = "IPIfNonMatch"; ObjectID = "92h-JU-wqn"; */
"92h-JU-wqn.title" = "IPIfNonMatch";
/* Class = "NSTextFieldCell"; title = "Rouing Rules"; ObjectID = "E4W-rN-0eq"; */
"E4W-rN-0eq.title" = "Rouing Rules";
/* Class = "NSMenuItem"; title = "Bypassing the LAN Address"; ObjectID = "CoE-cp-7fn"; */
"CoE-cp-7fn.title" = "绕过局域网地址";
/* Class = "NSTextFieldCell"; title = "Custom Rule Name"; ObjectID = "Ecy-wl-v5i"; */
"Ecy-wl-v5i.title" = "Custom Rule Name";
/* Class = "NSMenuItem"; title = "Bypassing mainland address"; ObjectID = "EaD-tR-ldB"; */
"EaD-tR-ldB.title" = "绕过大陆地址";
/* Class = "NSTextFieldCell"; title = "Routing Rule:"; ObjectID = "J2T-Pf-s5D"; */
"J2T-Pf-s5D.title" = "Routing Rule:";
/* Class = "NSMenuItem"; title = "IPOnDemand"; ObjectID = "Js7-cb-bWa"; */
"Js7-cb-bWa.title" = "IPOnDemand";
/* Class = "NSMenuItem"; title = "AsIs"; ObjectID = "Kl2-gr-bsh"; */
"Kl2-gr-bsh.title" = "AsIs";
/* Class = "NSMenuItem"; title = "AsIs"; ObjectID = "LX1-ye-51i"; */
"LX1-ye-51i.title" = "AsIs";
/* Class = "NSTextFieldCell"; title = "Custom Rule JSON Text"; ObjectID = "Q0v-Ic-TRt"; */
"Q0v-Ic-TRt.title" = "Custom Rule JSON Text";
/* Class = "NSButtonCell"; title = "load default"; ObjectID = "RSN-g5-vmP"; */
"RSN-g5-vmP.title" = "load default";
/* Class = "NSTextFieldCell"; title = "Domain Strategy:"; ObjectID = "Qp3-K0-xA9"; */
"Qp3-K0-xA9.title" = "Domain Strategy:";
/* Class = "NSTextFieldCell"; title = "* Set the rules line by line: domain or ip"; ObjectID = "ccq-gn-C6Z"; */
"ccq-gn-C6Z.title" = "*按行设置域名或ip";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "YQ1-7i-YOl"; */
"YQ1-7i-YOl.title" = "Text Cell";
/* Class = "NSTabViewItem"; label = "Block"; ObjectID = "nsT-BW-R2Z"; */
"nsT-BW-R2Z.label" = "阻止ip或域名";
/* Class = "NSTextFieldCell"; title = "Proxy:"; ObjectID = "cfS-8I-8Au"; */
"cfS-8I-8Au.title" = "Proxy:";
/* Class = "NSTabViewItem"; label = "Proxy"; ObjectID = "pnL-Z8-fIK"; */
"pnL-Z8-fIK.label" = "代理ip或域名";
/* Class = "NSMenuItem"; title = "IPIfNonMatch"; ObjectID = "dSb-GT-n2n"; */
"dSb-GT-n2n.title" = "IPIfNonMatch";
/* Class = "NSTabViewItem"; label = "Direct"; ObjectID = "yc0-Po-cG1"; */
"yc0-Po-cG1.label" = "直连ip或域名";
/* Class = "NSTextFieldCell"; title = "like: { \"domainStrategy\": \"IPOnDemand\", \"rules\": []}"; ObjectID = "ejH-X7-8Fb"; */
"ejH-X7-8Fb.title" = "like: { \"domainStrategy\": \"IPOnDemand\", \"rules\": []}";
/* Class = "NSMenuItem"; title = "Global"; ObjectID = "zLf-pT-xlm"; */
"zLf-pT-xlm.title" = "全局";
/* Class = "NSTextFieldCell"; title = "* Set the rules line by line: domain or ip"; ObjectID = "ymo-ds-No9"; */
"ymo-ds-No9.title" = "* Set the rules line by line: domain or ip";

View File

@@ -1,45 +1,45 @@
/* Class = "NSTextFieldCell"; title = "Domain Strategy:"; ObjectID = "22k-l7-G7a"; */
"22k-l7-G7a.title" = "域名策略:";
/* Class = "NSTextFieldCell"; title = "Block:"; ObjectID = "0Cd-bg-07K"; */
"0Cd-bg-07K.title" = "阻止ip或域名:";
/* Class = "NSMenuItem"; title = "Bypassing LAN and mainland address"; ObjectID = "3qq-dt-TS9"; */
"3qq-dt-TS9.title" = "绕过局域网和大陆地址";
/* Class = "NSMenuItem"; title = "IPOnDemand"; ObjectID = "2ST-s0-RrI"; */
"2ST-s0-RrI.title" = "IPOnDemand";
/* Class = "NSTextFieldCell"; title = "Routing Rule:"; ObjectID = "4rB-9k-291"; */
"4rB-9k-291.title" = "路由模式:";
/* Class = "NSTextFieldCell"; title = "Direct:"; ObjectID = "3hZ-qS-PUG"; */
"3hZ-qS-PUG.title" = "直连ip或域名:";
/* Class = "NSButtonCell"; title = "save"; ObjectID = "8g2-Nj-m07"; */
"8g2-Nj-m07.title" = "保存";
/* Class = "NSMenuItem"; title = "IPIfNonMatch"; ObjectID = "92h-JU-wqn"; */
"92h-JU-wqn.title" = "IPIfNonMatch";
/* Class = "NSTextFieldCell"; title = "Rouing Rules"; ObjectID = "E4W-rN-0eq"; */
"E4W-rN-0eq.title" = "路由规则列表";
/* Class = "NSMenuItem"; title = "Bypassing the LAN Address"; ObjectID = "CoE-cp-7fn"; */
"CoE-cp-7fn.title" = "绕过局域网地址";
/* Class = "NSTextFieldCell"; title = "Custom Rule Name"; ObjectID = "Ecy-wl-v5i"; */
"Ecy-wl-v5i.title" = "自定义路由名称";
/* Class = "NSMenuItem"; title = "Bypassing mainland address"; ObjectID = "EaD-tR-ldB"; */
"EaD-tR-ldB.title" = "绕过大陆地址";
/* Class = "NSTextFieldCell"; title = "Routing Rule:"; ObjectID = "J2T-Pf-s5D"; */
"J2T-Pf-s5D.title" = "路由规则:";
/* Class = "NSMenuItem"; title = "IPOnDemand"; ObjectID = "Js7-cb-bWa"; */
"Js7-cb-bWa.title" = "IPOnDemand";
/* Class = "NSMenuItem"; title = "AsIs"; ObjectID = "Kl2-gr-bsh"; */
"Kl2-gr-bsh.title" = "AsIs";
/* Class = "NSMenuItem"; title = "AsIs"; ObjectID = "LX1-ye-51i"; */
"LX1-ye-51i.title" = "AsIs";
/* Class = "NSTextFieldCell"; title = "Custom Rule JSON Text"; ObjectID = "Q0v-Ic-TRt"; */
"Q0v-Ic-TRt.title" = "自定义路由 json 内容";
/* Class = "NSButtonCell"; title = "load default"; ObjectID = "RSN-g5-vmP"; */
"RSN-g5-vmP.title" = "load default";
/* Class = "NSTextFieldCell"; title = "Domain Strategy:"; ObjectID = "Qp3-K0-xA9"; */
"Qp3-K0-xA9.title" = "域名策略:";
/* Class = "NSTextFieldCell"; title = "* Set the rules line by line: domain or ip"; ObjectID = "ccq-gn-C6Z"; */
"ccq-gn-C6Z.title" = "*按行设置域名或ip";
/* Class = "NSTextFieldCell"; title = "Text Cell"; ObjectID = "YQ1-7i-YOl"; */
"YQ1-7i-YOl.title" = "";
/* Class = "NSTabViewItem"; label = "Block"; ObjectID = "nsT-BW-R2Z"; */
"nsT-BW-R2Z.label" = "阻止ip或域名";
/* Class = "NSTextFieldCell"; title = "Proxy:"; ObjectID = "cfS-8I-8Au"; */
"cfS-8I-8Au.title" = "代理ip或域名:";
/* Class = "NSTabViewItem"; label = "Proxy"; ObjectID = "pnL-Z8-fIK"; */
"pnL-Z8-fIK.label" = "代理ip或域名";
/* Class = "NSMenuItem"; title = "IPIfNonMatch"; ObjectID = "dSb-GT-n2n"; */
"dSb-GT-n2n.title" = "IPIfNonMatch";
/* Class = "NSTabViewItem"; label = "Direct"; ObjectID = "yc0-Po-cG1"; */
"yc0-Po-cG1.label" = "直连ip或域名";
/* Class = "NSTextFieldCell"; title = "like: { \"domainStrategy\": \"IPOnDemand\", \"rules\": []}"; ObjectID = "ejH-X7-8Fb"; */
"ejH-X7-8Fb.title" = "例如: { \"domainStrategy\": \"IPOnDemand\", \"rules\": []}";
/* Class = "NSMenuItem"; title = "Global"; ObjectID = "zLf-pT-xlm"; */
"zLf-pT-xlm.title" = "全局";
/* Class = "NSTextFieldCell"; title = "* Set the rules line by line: domain or ip"; ObjectID = "ymo-ds-No9"; */
"ymo-ds-No9.title" = "* 按行设置域名或ip";