mirror of
https://github.com/bolucat/Archive.git
synced 2025-09-26 20:21:35 +08:00
Update On Tue May 28 20:30:13 CEST 2024
This commit is contained in:
@@ -60,4 +60,4 @@ SPEC CHECKSUMS:
|
||||
|
||||
PODFILE CHECKSUM: 3e6393519555a41d4672846cccbb38ef2c16f21f
|
||||
|
||||
COCOAPODS: 1.12.1
|
||||
COCOAPODS: 1.15.2
|
||||
|
@@ -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;
|
||||
};
|
||||
|
@@ -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() {
|
||||
|
@@ -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) {
|
||||
|
Reference in New Issue
Block a user