Update On Tue May 28 20:30:13 CEST 2024

This commit is contained in:
github-action[bot]
2024-05-28 20:30:14 +02:00
parent 929efb55e1
commit 55db66563f
35 changed files with 2944 additions and 1102 deletions

View File

@@ -60,4 +60,4 @@ SPEC CHECKSUMS:
PODFILE CHECKSUM: 3e6393519555a41d4672846cccbb38ef2c16f21f
COCOAPODS: 1.12.1
COCOAPODS: 1.15.2

View File

@@ -3,7 +3,7 @@
archiveVersion = 1;
classes = {
};
objectVersion = 51;
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
@@ -756,7 +756,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.14;
MACOSX_DEPLOYMENT_TARGET = 10.15;
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
@@ -815,7 +815,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
MACOSX_DEPLOYMENT_TARGET = 10.14;
MACOSX_DEPLOYMENT_TARGET = 10.15;
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
SDKROOT = macosx;
@@ -833,12 +833,13 @@
ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 4.1.0;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = RJYEH6TCJD;
DEVELOPMENT_TEAM = "";
ENABLE_ONLY_ACTIVE_RESOURCES = YES;
INFOPLIST_FILE = V2rayU/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = V2rayU;
@@ -846,7 +847,7 @@
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.14;
MACOSX_DEPLOYMENT_TARGET = 10.15;
MARKETING_VERSION = 4.1.0;
ONLY_ACTIVE_ARCH = YES;
PRODUCT_BUNDLE_IDENTIFIER = net.yanue.V2rayU;
@@ -855,7 +856,7 @@
SKIP_INSTALL = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Common/V2rayU-Bridging-header.h";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
SWIFT_VERSION = 4.2;
SWIFT_VERSION = 5.0;
};
name = Debug;
};
@@ -866,12 +867,13 @@
ALLOW_TARGET_PLATFORM_SPECIALIZATION = YES;
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_IDENTITY = "Apple Development";
"CODE_SIGN_IDENTITY[sdk=macosx*]" = "-";
CODE_SIGN_STYLE = Automatic;
COMBINE_HIDPI_IMAGES = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 4.1.0;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = RJYEH6TCJD;
DEVELOPMENT_TEAM = "";
ENABLE_ONLY_ACTIVE_RESOURCES = YES;
INFOPLIST_FILE = V2rayU/Info.plist;
INFOPLIST_KEY_CFBundleDisplayName = V2rayU;
@@ -879,7 +881,7 @@
"$(inherited)",
"@executable_path/../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = 10.14;
MACOSX_DEPLOYMENT_TARGET = 10.15;
MARKETING_VERSION = 4.1.0;
ONLY_ACTIVE_ARCH = NO;
PRODUCT_BUNDLE_IDENTIFIER = net.yanue.V2rayU;
@@ -888,7 +890,7 @@
SKIP_INSTALL = NO;
SWIFT_OBJC_BRIDGING_HEADER = "Common/V2rayU-Bridging-header.h";
SWIFT_SWIFT3_OBJC_INFERENCE = Default;
SWIFT_VERSION = 4.2;
SWIFT_VERSION = 5.0;
};
name = Release;
};
@@ -899,9 +901,9 @@
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = RJYEH6TCJD;
DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = YES;
MACOSX_DEPLOYMENT_TARGET = 10.14;
MACOSX_DEPLOYMENT_TARGET = 10.15;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
};
@@ -914,9 +916,9 @@
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = RJYEH6TCJD;
DEVELOPMENT_TEAM = "";
ENABLE_HARDENED_RUNTIME = YES;
MACOSX_DEPLOYMENT_TARGET = 10.14;
MACOSX_DEPLOYMENT_TARGET = 10.15;
PRODUCT_NAME = "$(TARGET_NAME)";
SWIFT_VERSION = 5.0;
};

View File

@@ -18,9 +18,7 @@ let second: Double = 1000000
let pingURL = URL(string: "http://www.gstatic.com/generate_204")!
class PingSpeed: NSObject {
let lock = NSLock()
let semaphore = DispatchSemaphore(value: 30) // work pool
var group = DispatchGroup()
func pingAll() {
NSLog("ping start")
@@ -28,6 +26,7 @@ class PingSpeed: NSObject {
NSLog("ping inPing")
return
}
// make sure core file
V2rayLaunch.checkV2rayCore()
// in ping
@@ -51,26 +50,47 @@ class PingSpeed: NSObject {
DispatchQueue.main.async {
menuController.setStatusMenuTip(pingTip: pingTip)
}
let thread = Thread{
self.runTask(items: itemList)
}
thread.start()
}
func runTask(items: [V2rayItem]) {
self.group = DispatchGroup()
let pingQueue = DispatchQueue(label: "pingQueue", qos: .background, attributes: .concurrent)
for item in items {
self.group.enter() // DispatchGroup
pingQueue.async {
// ,
self.semaphore.wait()
// run ping by async queue
self.pingEachServer(item: item)
Task {
do {
try await pingTaskGroup(items: itemList)
} catch let error {
NSLog("pingTaskGroup error: \(error)")
}
}
self.group.wait() //
print("All tasks finished")
}
func pingTaskGroup(items: [V2rayItem]) async throws {
await withThrowingTaskGroup(of: Int.self) { group in
for item in items {
group.addTask {
do {
await self.semaphore.wait()
defer {
self.semaphore.signal()
}
try await self.pingEachServer(item: item)
} catch let error {
NSLog("pingEachServer error: \(error)")
}
return 1
}
}
}
print("pingTaskGroup end")
self.pingEnd()
}
func pingEachServer(item: V2rayItem) async throws {
NSLog("ping \(item.name) - \(item.remark)")
if !item.isValid {
return
}
// ping
let t = PingServer(item: item)
try await t.doPing()
}
func pingEnd() {
inPing = false
let langStr = Locale.current.languageCode
var pingTip: String = ""
@@ -79,33 +99,14 @@ class PingSpeed: NSObject {
} else {
pingTip = "Ping"
}
print("pingTaskGroup pingEnd", pingTip)
DispatchQueue.main.async {
menuController.setStatusMenuTip(pingTip: pingTip)
}
DispatchQueue.main.async {
menuController.showServers()
}
// kill
killAllPing()
}
func pingEachServer(item: V2rayItem) {
NSLog("ping \(item.name) - \(item.remark)")
if !item.isValid {
// refresh servers
ping.pingEnd(item: item)
return
}
// ping
PingServer(item: item).doPing()
}
func pingEnd(item: V2rayItem) {
lock.lock()
self.semaphore.signal() //
self.group.leave() // DispatchGroup
lock.unlock()
}
}
class PingServer: NSObject, URLSessionDataDelegate {
@@ -120,7 +121,7 @@ class PingServer: NSObject, URLSessionDataDelegate {
super.init() // can actually be omitted in this example because will happen automatically.
}
func doPing() {
func doPing() async throws {
let (_, _bindPort) = getUsablePort(port: uint16(Int.random(in: 9000 ... 36500)))
NSLog("doPing: \(item.name)-\(item.remark) - \(_bindPort)")
@@ -154,10 +155,13 @@ class PingServer: NSObject, URLSessionDataDelegate {
// sleep for wait v2ray process instanse
usleep(useconds_t(2 * second))
// url request
let session = URLSession(configuration: getProxyUrlSessionConfigure(httpProxyPort: bindPort), delegate: self, delegateQueue: nil)
let task = session.dataTask(with: URLRequest(url: pingURL))
task.resume()
do {
let (_,_) = try await session.data(for: URLRequest(url: pingURL))
} catch let error {
// failed to write file bad permissions, bad filename, missing permissions, or more likely it can't be converted to the encoding
NSLog("session request fail: \(error)")
}
}
func createV2rayJsonFileForPing() {
@@ -226,9 +230,6 @@ class PingServer: NSObject, URLSessionDataDelegate {
} catch let error {
print("remove ping config error: \(error)")
}
// refresh servers
ping.pingEnd(item: item)
}
}
@@ -241,17 +242,34 @@ class PingCurrent: NSObject, URLSessionDataDelegate {
super.init() // can actually be omitted in this example because will happen automatically.
}
func doPing() {
func doPing() {
Task {
do {
try await _doPing()
pingCurrentEnd()
} catch let error {
NSLog("doPing error: \(error)")
}
}
}
func _doPing() async throws {
inPingCurrent = true
usleep(useconds_t(1 * second))
NSLog("PingCurrent start: try=\(tryPing),item=\(item.remark)")
// set URLSessionDataDelegate
let config = getProxyUrlSessionConfigure()
config.timeoutIntervalForRequest = 3
// url request
let session = URLSession(configuration: config, delegate: self, delegateQueue: nil)
let task = session.dataTask(with: URLRequest(url: pingURL))
task.resume()
tryPing += 1
do {
let (data, response) = try await session.data(for: URLRequest(url: pingURL))
print("doPing: ", data, response)
} catch let error {
// failed to write file bad permissions, bad filename, missing permissions, or more likely it can't be converted to the encoding
NSLog("save json file fail: \(error)")
}
}
// MARK: - URLSessionDataDelegate
@@ -272,7 +290,6 @@ class PingCurrent: NSObject, URLSessionDataDelegate {
}
// save
item.store()
pingCurrentEnd()
}
func pingCurrentEnd() {

View File

@@ -235,10 +235,9 @@ class V2raySubItem: NSObject, NSCoding {
let NOTIFY_UPDATE_SubSync = Notification.Name(rawValue: "NOTIFY_UPDATE_SubSync")
class V2raySubSync: NSObject {
let lock = NSLock()
var V2raySubSyncing = false
var group = DispatchGroup()
let semaphore = DispatchSemaphore(value: 2) // work pool
static var shared = V2raySubSync()
// Initialization
override init() {
@@ -255,27 +254,42 @@ class V2raySubSync: NSObject {
self.V2raySubSyncing = true
NSLog("V2raySubSync start")
let thread = Thread {
V2raySubscription.loadConfig()
let list = V2raySubscription.list()
V2raySubscription.loadConfig()
let list = V2raySubscription.list()
if list.count == 0 {
self.logTip(title: "fail: ", uri: "", informativeText: " please add Subscription Url")
if list.count == 0 {
self.logTip(title: "fail: ", uri: "", informativeText: " please add Subscription Url")
}
// sync queue with DispatchGroup
Task {
do {
try await self.syncTaskGroup(items: list)
} catch let error {
NSLog("pingTaskGroup error: \(error)")
}
// sync queue with DispatchGroup
self.group = DispatchGroup()
let subQueue = DispatchQueue(label: "subQueue", qos: .background)
for item in list {
subQueue.sync {
self.group.enter()
self.dlFromUrl(url: item.url, subscribe: item.name)
}
}
func syncTaskGroup(items: [V2raySubItem]) async throws {
await withThrowingTaskGroup(of: Int.self) { group in
for item in items {
group.addTask {
do {
await self.semaphore.wait()
defer {
self.semaphore.signal()
}
try await self.dlFromUrl(url: item.url, subscribe: item.name)
} catch let error {
NSLog("syncTaskGroup error: \(error)")
}
return 1
}
}
self.group.wait()
NSLog("V2raySubSync end")
self.refreshMenu()
}
thread.start()
print("syncTaskGroup end")
self.refreshMenu()
}
func refreshMenu() {
@@ -293,40 +307,27 @@ class V2raySubSync: NSObject {
}
}
func importEnd(url: String, subscribe: String) {
self.group.leave()
}
public func dlFromUrl(url: String, subscribe: String) {
public func dlFromUrl(url: String, subscribe: String) async throws {
logTip(title: "loading from : ", uri: "", informativeText: url + "\n\n")
guard let reqUrl = URL(string: url) else {
logTip(title: "loading from : ", uri: "", informativeText: "url is not valid: " + url + "\n\n")
self.importEnd(url: url, subscribe: subscribe)
return
}
// url request with proxy
let session = URLSession(configuration: getProxyUrlSessionConfigure())
let task = session.dataTask(with: URLRequest(url: reqUrl)){(data: Data?, response: URLResponse?, error: Error?) in
defer {
self.importEnd(url: url, subscribe: subscribe)
}
if error != nil {
self.logTip(title: "loading fail: ", uri: url, informativeText: "error: \(String(describing: error))")
do {
let (data, _) = try await session.data(for: URLRequest(url: reqUrl))
if let outputStr = String(data: data, encoding: String.Encoding.utf8) {
self.handle(base64Str: outputStr, subscribe: subscribe, url: url)
} else {
if data != nil {
if let outputStr = String(data: data!, encoding: String.Encoding.utf8) {
self.handle(base64Str: outputStr, subscribe: subscribe, url: url)
} else {
self.logTip(title: "loading fail: ", uri: url, informativeText: "data is nil")
}
} else {
self.logTip(title: "loading fail: ", uri: url, informativeText: "data is nil")
}
self.logTip(title: "loading fail: ", uri: url, informativeText: "data is nil")
}
} catch let error {
// failed to write file bad permissions, bad filename, missing permissions, or more likely it can't be converted to the encoding
NSLog("save json file fail: \(error)")
}
task.resume()
}
func handle(base64Str: String, subscribe: String, url: String) {