Skip to content

Commit

Permalink
修复
Browse files Browse the repository at this point in the history
  • Loading branch information
yanue committed Jan 2, 2025
1 parent fc30a88 commit 2d687c9
Show file tree
Hide file tree
Showing 10 changed files with 172 additions and 204 deletions.
64 changes: 36 additions & 28 deletions V2rayU.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

72 changes: 38 additions & 34 deletions V2rayU/AppState.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import SwiftUI
import Combine
import SwiftUI

enum RunMode: String {
case global
Expand All @@ -26,16 +26,16 @@ final class AppState: ObservableObject {
static let shared = AppState() // 单例实例

@Published var pingURL: URL = URL(string: "http://www.gstatic.com/generate_204")!

@Published var runMode: RunMode = .off

@Published var launchAtLogin: Bool = true
@Published var checkForUpdates: Bool = true
@Published var autoUpdateServers: Bool = true
@Published var selectFastestServer: Bool = true
@Published var enableStat = true

@Published var logLevel = V2rayLog.logLevel.info
@Published var logLevel = V2rayLogLevel.info
@Published var socksPort = 1080
@Published var socksHost = "127.0.0.1"
@Published var httpPort = 1087
Expand All @@ -45,33 +45,33 @@ final class AppState: ObservableObject {
@Published var enableMux = false
@Published var mux = 8
@Published var dnsJson = ""

private var cancellables = Set<AnyCancellable>()

init() {
self.runMode = UserDefaults.getEnum(forKey: .runMode, type: RunMode.self, defaultValue: .off)
self.enableMux = UserDefaults.getBool(forKey: .enableMux)
self.enableUdp = UserDefaults.getBool(forKey: .enableUdp)
self.enableSniffing = UserDefaults.getBool(forKey: .enableSniffing)
self.enableStat = UserDefaults.getBool(forKey: .enableStat)

self.httpPort = UserDefaults.getInt(forKey: .localHttpPort, defaultValue: 1087)
self.httpHost = UserDefaults.get(forKey: .localHttpHost, defaultValue: "127.0.0.1")
self.socksPort = UserDefaults.getInt(forKey: .localSockPort,defaultValue: 1080)
self.socksHost = UserDefaults.get(forKey: .localSockHost, defaultValue: "127.0.0.1")
self.mux = UserDefaults.getInt(forKey: .muxConcurrent, defaultValue: 8)

self.logLevel = UserDefaults.getEnum(forKey: .v2rayLogLevel, type: V2rayLog.logLevel.self, defaultValue: .info)

self.launchAtLogin = UserDefaults.getBool(forKey: .autoLaunch)
self.autoUpdateServers = UserDefaults.getBool(forKey: .autoUpdateServers)
self.checkForUpdates = UserDefaults.getBool(forKey: .autoCheckVersion)
self.selectFastestServer = UserDefaults.getBool(forKey: .autoSelectFastestServer)
print("AppState init", self.launchAtLogin, self.autoUpdateServers, self.checkForUpdates, self.selectFastestServer)
self.setupBindings()
runMode = UserDefaults.getEnum(forKey: .runMode, type: RunMode.self, defaultValue: .off)
enableMux = UserDefaults.getBool(forKey: .enableMux)
enableUdp = UserDefaults.getBool(forKey: .enableUdp)
enableSniffing = UserDefaults.getBool(forKey: .enableSniffing)
enableStat = UserDefaults.getBool(forKey: .enableStat)

httpPort = UserDefaults.getInt(forKey: .localHttpPort, defaultValue: 1087)
httpHost = UserDefaults.get(forKey: .localHttpHost, defaultValue: "127.0.0.1")
socksPort = UserDefaults.getInt(forKey: .localSockPort, defaultValue: 1080)
socksHost = UserDefaults.get(forKey: .localSockHost, defaultValue: "127.0.0.1")
mux = UserDefaults.getInt(forKey: .muxConcurrent, defaultValue: 8)

logLevel = UserDefaults.getEnum(forKey: .v2rayLogLevel, type: V2rayLogLevel.self, defaultValue: .info)

launchAtLogin = UserDefaults.getBool(forKey: .autoLaunch)
autoUpdateServers = UserDefaults.getBool(forKey: .autoUpdateServers)
checkForUpdates = UserDefaults.getBool(forKey: .autoCheckVersion)
selectFastestServer = UserDefaults.getBool(forKey: .autoSelectFastestServer)
print("AppState init", launchAtLogin, autoUpdateServers, checkForUpdates, selectFastestServer)

setupBindings()
}

private func setupBindings() {
$runMode
.sink { mode in
Expand All @@ -84,7 +84,7 @@ final class AppState: ObservableObject {
UserDefaults.setBool(forKey: .autoLaunch, value: launch)
}
.store(in: &cancellables)

$autoUpdateServers
.sink { _bool in
UserDefaults.setBool(forKey: .autoUpdateServers, value: _bool)
Expand All @@ -96,16 +96,16 @@ final class AppState: ObservableObject {
UserDefaults.setBool(forKey: .autoCheckVersion, value: _bool)
}
.store(in: &cancellables)

$selectFastestServer
.sink { _bool in
UserDefaults.setBool(forKey: .autoSelectFastestServer, value: _bool)
}
.store(in: &cancellables)

$logLevel
.sink { level in
UserDefaults.set(forKey: .v2rayLogLevel, value: level)
UserDefaults.set(forKey: .v2rayLogLevel, value: level.rawValue)
}
.store(in: &cancellables)

Expand Down Expand Up @@ -162,11 +162,15 @@ final class AppState: ObservableObject {
UserDefaults.set(forKey: .v2rayDnsJson, value: json)
}
.store(in: &cancellables)

$enableStat
.sink { enabled in
UserDefaults.setBool(forKey: .enableStat, value: enabled)
}
.store(in: &cancellables)
}


func setRunMode(mode: RunMode) async {
self.runMode = mode
runMode = mode
}

}
16 changes: 8 additions & 8 deletions V2rayU/Handler/Share/TrojanUri.swift
Original file line number Diff line number Diff line change
Expand Up @@ -72,10 +72,10 @@ class TrojanUri: BaseShareUri {
profile.password = password

let query = url.queryParams()
profile.network = query.getEnum("type", V2rayStreamNetwork.self, defaultValue: .tcp)
profile.security = query.getEnum("security", V2rayStreamSecurity.self, defaultValue: .tls)
profile.sni = query.getString("sni", defaultValue: profile.address)
profile.fingerprint = query.getEnum("fp", V2rayStreamFingerprint.self, defaultValue: .chrome)
profile.network = query.getEnum(forKey: "type", type: V2rayStreamNetwork.self, defaultValue: .tcp)
profile.security = query.getEnum(forKey: "security", type: V2rayStreamSecurity.self, defaultValue: .tls)
profile.sni = query.getString(forKey: "sni", defaultValue: profile.address)
profile.fingerprint = query.getEnum(forKey: "fp", type: V2rayStreamFingerprint.self, defaultValue: .chrome)
// security 不能为 none
if profile.security == .none {
profile.security = .tls
Expand All @@ -87,15 +87,15 @@ class TrojanUri: BaseShareUri {
// 判断 network 类型
switch profile.network {
case .tcp:
profile.headerType = query.getEnum("headerType", V2rayStreamHeaderType.self, defaultValue: .none)
profile.headerType = query.getEnum(forKey: "headerType", type: V2rayHeaderType.self, defaultValue: .none)
break
case .ws, .h2:
profile.host = query.getString("host", defaultValue: profile.address)
profile.path = query.getString("path", defaultValue: "/")
profile.host = query.getString(forKey: "host", defaultValue: profile.address)
profile.path = query.getString(forKey: "path", defaultValue: "/")
break
case .grpc:
// grpcServiceName: 先从 query 中获取 serviceName,如果没有则获取 path,如果都没有则默认为 "/"
profile.path = query.getString("serviceName", defaultValue: query.getString("path", defaultValue: "/"))
profile.path = query.getString(forKey: "serviceName", defaultValue: query.getString(forKey: "path", defaultValue: "/"))
break
default:
break
Expand Down
40 changes: 19 additions & 21 deletions V2rayU/Handler/Share/VlessUri.swift
Original file line number Diff line number Diff line change
Expand Up @@ -83,15 +83,13 @@ class VlessUri: BaseShareUri {
case .domainsocket:
queryItems.append(URLQueryItem(name: "path", value: self.profile.path))
break
case kcp:
case .kcp:
queryItems.append(URLQueryItem(name: "seed", value: self.profile.path))
queryItems.append(URLQueryItem(name: "headerType", value: self.profile.headerType.rawValue))
break
case .quic:
queryItems.append(URLQueryItem(name: "path", value: self.profile.path))
break
default:
break
}
uri.queryItems = queryItems

Expand All @@ -112,39 +110,39 @@ class VlessUri: BaseShareUri {
self.profile.port = Int(port)
self.profile.password = password
let query = url.queryParams()
self.profile.network = query.getEnum("type", V2rayStreamNetwork.self, defaultValue: .tcp)
self.profile.security = query.getEnum("security", V2rayStreamSecurity.self, defaultValue: .xtls)
self.profile.sni = query.getString("sni", defaultValue: host)
self.profile.fingerprint = query.getEnum("fp", V2rayStreamFingerprint.self, defaultValue: .chrome)
self.profile.network = query.getEnum(forKey: "type",type: V2rayStreamNetwork.self, defaultValue: .tcp)
self.profile.security = query.getEnum(forKey: "security", type: V2rayStreamSecurity.self, defaultValue: .xtls)
self.profile.sni = query.getString(forKey: "sni", defaultValue: host)
self.profile.fingerprint = query.getEnum(forKey: "fp", type: V2rayStreamFingerprint.self, defaultValue: .chrome)

switch self.profile.network {
case .tcp:
self.profile.headerType = query.getEnum("headerType", V2rayHeaderType.self, defaultValue: .none)
self.profile.headerType = query.getEnum(forKey: "headerType", type: V2rayHeaderType.self, defaultValue: .none)
break
case .xhttp:
self.profile.path = query.getString("path", defaultValue: "/")
self.profile.host = query.getString("host", defaultValue: host)
self.profile.path = query.getString(forKey: "path", defaultValue: "/")
self.profile.host = query.getString(forKey: "host", defaultValue: host)
break
case .ws:
self.profile.path = query.getString("path", defaultValue: "/")
self.profile.host = query.getString("host", defaultValue: host)
self.profile.path = query.getString(forKey: "path", defaultValue: "/")
self.profile.host = query.getString(forKey: "host", defaultValue: host)
break
case .h2:
self.profile.host = query.getString("host", defaultValue: host)
self.profile.path = query.getString("path", defaultValue: "/")
self.profile.host = query.getString(forKey: "host", defaultValue: host)
self.profile.path = query.getString(forKey: "path", defaultValue: "/")
break
case .grpc:
self.profile.path = query.getString("serviceName", defaultValue: "/")
self.profile.path = query.getString(forKey: "serviceName", defaultValue: "/")
break
case .domainsocket:
self.profile.path = query.getString("path", defaultValue: "/")
self.profile.path = query.getString(forKey: "path", defaultValue: "/")
break
case .kcp:
self.profile.path = query.getString("seed", defaultValue: "")
self.profile.headerType = query.getEnum("headerType", V2rayHeaderType.self, defaultValue: .none)
self.profile.path = query.getString(forKey: "seed", defaultValue: "")
self.profile.headerType = query.getEnum(forKey: "headerType",type: V2rayHeaderType.self, defaultValue: .none)
break
case .quic:
self.profile.path = query.getString("path", defaultValue: "/")
self.profile.path = query.getString(forKey: "path", defaultValue: "/")
break
default:
break
Expand All @@ -160,8 +158,8 @@ class VlessUri: BaseShareUri {

switch self.profile.security {
case .reality: // reality
self.profile.publicKey = query.getString("pbk", defaultValue: "")
self.profile.shortId = query.getString("sid", defaultValue: "")
self.profile.publicKey = query.getString(forKey: "pbk", defaultValue: "")
self.profile.shortId = query.getString(forKey: "sid", defaultValue: "")
default:
break
}
Expand Down
91 changes: 16 additions & 75 deletions V2rayU/Handler/Share/VmessUri.swift
Original file line number Diff line number Diff line change
Expand Up @@ -188,99 +188,40 @@ class VmessUri: BaseShareUri {

// params
let query = url.queryParams()
profile.network = query.getEnum("network", V2rayStreamNetwork.self, defaultValue: .tcp)
profile.security = query.getEnum("tls", V2rayStreamSecurity.self, defaultValue: .tls)
profile.sni = query.getString("tlsServer", defaultValue: query.getString("sni", defaultValue: profile.address))
profile.fingerprint = query.getEnum("fp", V2rayStreamFingerprint.self, defaultValue: .none)
profile.allowInsecure = query.getString("allowInsecure", defaultValue: "1") == "1" ? true : false
profile.alterId = query.getInt("aid", defaultValue: 0)
profile.remark = query.getString("remark", defaultValue: "vmess")
profile.network = query.getEnum(forKey: "network", type: V2rayStreamNetwork.self, defaultValue: .tcp)
profile.security = query.getEnum(forKey: "tls", type: V2rayStreamSecurity.self, defaultValue: .tls)
profile.sni = query.getString(forKey: "tlsServer", defaultValue: query.getString(forKey: "sni", defaultValue: profile.address))
profile.fingerprint = query.getEnum(forKey: "fp", type: V2rayStreamFingerprint.self, defaultValue: .none)
profile.allowInsecure = query.getString(forKey: "allowInsecure", defaultValue: "1") == "1" ? true : false
profile.alterId = query.getInt(forKey: "aid", defaultValue: 0)
profile.remark = query.getString(forKey: "remark", defaultValue: "vmess")
switch profile.network {
case .tcp:
break
case .ws:
profile.path = query.getString("wsPath", defaultValue: "/")
profile.host = query.getString("wsHost", defaultValue: profile.address)
profile.path = query.getString(forKey: "wsPath", defaultValue: "/")
profile.host = query.getString(forKey: "wsHost", defaultValue: profile.address)
break
case .h2:
profile.path = query.getString("h2Path", defaultValue: "/")
profile.host = query.getString("h2Host", defaultValue: profile.address)
profile.path = query.getString(forKey: "h2Path", defaultValue: "/")
profile.host = query.getString(forKey: "h2Host", defaultValue: profile.address)
break
case .kcp:
profile.headerType = query.getEnum("kcpHeader", V2rayHeaderType.self, defaultValue: .none)
profile.path = query.getString("seed", defaultValue: "") // seed
profile.uplinkCapacity = query.getInt("uplinkCapacity", defaultValue: 5)
profile.downlinkCapacity = query.getInt("downlinkCapacity", defaultValue: 20)
profile.headerType = query.getEnum(forKey: "kcpHeader", type: V2rayHeaderType.self, defaultValue: .none)
profile.path = query.getString(forKey: "seed", defaultValue: "") // seed
break
case .grpc:
profile.path = query.getString("serviceName", defaultValue: "/")
profile.path = query.getString(forKey: "serviceName", defaultValue: "/")
break
case .quic:
profile.path = query.getString("path", defaultValue: "/")
profile.path = query.getString(forKey: "path", defaultValue: "/")
break
case .domainsocket:
profile.path = query.getString("path", defaultValue: "/")
profile.path = query.getString(forKey: "path", defaultValue: "/")
break
default:
break
}

for item in queryItems {
let value = item.value as? String ?? ""
switch item.key {
case "network":
profile.network = V2rayStreamNetwork(rawValue: value) ?? .tcp
break
case "h2path":
profile.path = value
break
case "h2host":
profile.host = value
break
case "aid":
profile.alterId = Int(value) ?? 0
break
case "tls":
profile.security = V2rayStreamSecurity(rawValue: value) ?? .tls
break
case "allowInsecure":
profile.allowInsecure = value == "1" ? true : false
break
case "tlsServer":
profile.sni = value
break
case "sni":
profile.sni = value
break
case "fp":
profile.fingerprint = V2rayStreamFingerprint(rawValue: value) ?? .none
break
case "type":
profile.headerType = V2rayHeaderType(rawValue: value) ?? .none
break
case "alpn":
profile.alpn = V2rayStreamAlpn(rawValue: value) ?? .none
break
case "encryption":
profile.encryption = value
break
case "kcpHeader":
// type 是所有传输方式的伪装类型
profile.headerType = V2rayHeaderType(rawValue: value) ?? .none
break
case "remark":
profile.remark = value
break
case "serviceName":
profile.path = value
break
case "seed":
profile.path = value
break
default:
break
}
}
}

/**
Expand Down
4 changes: 2 additions & 2 deletions V2rayU/Handler/V2rayConfigHandler.swift
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ class V2rayConfigHandler {
self.enableUdp = UserDefaults.getBool(forKey: .enableUdp)
self.enableSniffing = UserDefaults.getBool(forKey: .enableSniffing)

self.httpPort = UserDefaults.get(forKey: .localHttpPort) ?? "1087"
self.httpPort = UserDefaults.get(forKey: .localHttpPort,defaultValue: "1087") ?? "1087"
self.httpHost = UserDefaults.get(forKey: .localHttpHost) ?? "127.0.0.1"
self.socksPort = UserDefaults.get(forKey: .localSockPort) ?? "1080"
self.socksHost = UserDefaults.get(forKey: .localSockHost) ?? "127.0.0.1"
Expand Down Expand Up @@ -76,7 +76,7 @@ class V2rayConfigHandler {

func combine(_outbounds: [V2rayOutbound]) {
// base
self.v2ray.log.loglevel = V2rayLog.logLevel(rawValue: UserDefaults.get(forKey: .v2rayLogLevel) ?? "info") ?? V2rayLog.logLevel.info
self.v2ray.log.loglevel = V2rayLogLevel(rawValue: UserDefaults.get(forKey: .v2rayLogLevel)) ?? V2rayLogLevel.info

// ------------------------------------- inbound start ---------------------------------------------
var inSocks = V2rayInbound()
Expand Down
Loading

0 comments on commit 2d687c9

Please sign in to comment.