update ios

This commit is contained in:
hiddify
2023-12-26 22:26:06 +03:30
parent 887b561c92
commit 38348feb25
13 changed files with 96 additions and 43 deletions

View File

@@ -6,4 +6,5 @@
// //
BASE_BUNDLE_IDENTIFIER=hiddify BASE_BUNDLE_IDENTIFIER=hiddify
SERVICE_IDENTIFIER=com.hiddify.app
DEVELOPMENT_TEAM=3JFTY5BP58 DEVELOPMENT_TEAM=3JFTY5BP58

View File

@@ -27,16 +27,13 @@
03E392D02ADDF1BD000ADF15 /* FilePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E392CE2ADDEFC8000ADF15 /* FilePath.swift */; }; 03E392D02ADDF1BD000ADF15 /* FilePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E392CE2ADDEFC8000ADF15 /* FilePath.swift */; };
03E392D22ADDF1F4000ADF15 /* ExtensionPlatformInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E392D12ADDF1F4000ADF15 /* ExtensionPlatformInterface.swift */; }; 03E392D22ADDF1F4000ADF15 /* ExtensionPlatformInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E392D12ADDF1F4000ADF15 /* ExtensionPlatformInterface.swift */; };
03E392D42ADDF262000ADF15 /* Extension+RunBlocking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E392D32ADDF262000ADF15 /* Extension+RunBlocking.swift */; }; 03E392D42ADDF262000ADF15 /* Extension+RunBlocking.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E392D32ADDF262000ADF15 /* Extension+RunBlocking.swift */; };
073695732B39DA23007249BE /* Libcore.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 073695722B39DA23007249BE /* Libcore.xcframework */; };
073695782B39DB2B007249BE /* Libcore.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 073695722B39DA23007249BE /* Libcore.xcframework */; }; 073695782B39DB2B007249BE /* Libcore.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 073695722B39DA23007249BE /* Libcore.xcframework */; };
0736957B2B39DE78007249BE /* Libcore.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0736957A2B39DE78007249BE /* Libcore.xcframework */; }; 073695882B3AC757007249BE /* Libcore.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 073695722B39DA23007249BE /* Libcore.xcframework */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
0736957C2B39DE78007249BE /* Libcore.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0736957A2B39DE78007249BE /* Libcore.xcframework */; }; 0736958B2B3AC96D007249BE /* Bundle+Properties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0736958A2B3AC96D007249BE /* Bundle+Properties.swift */; };
075637BA2B01583F005AFB8E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 60F1D4AAC33ACF5C8307310D /* Pods_Runner.framework */; }; 075637BA2B01583F005AFB8E /* Pods_Runner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 60F1D4AAC33ACF5C8307310D /* Pods_Runner.framework */; };
075637BB2B01583F005AFB8E /* Pods_Runner.framework in Embed Frameworks (2 items) */ = {isa = PBXBuildFile; fileRef = 60F1D4AAC33ACF5C8307310D /* Pods_Runner.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 075637BB2B01583F005AFB8E /* Pods_Runner.framework in Embed Frameworks (2 items) */ = {isa = PBXBuildFile; fileRef = 60F1D4AAC33ACF5C8307310D /* Pods_Runner.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
075637BC2B015864005AFB8E /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03E392B72ADDA00E000ADF15 /* NetworkExtension.framework */; }; 075637BC2B015864005AFB8E /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 03E392B72ADDA00E000ADF15 /* NetworkExtension.framework */; };
075637BD2B015864005AFB8E /* NetworkExtension.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 03E392B72ADDA00E000ADF15 /* NetworkExtension.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 075637BD2B015864005AFB8E /* NetworkExtension.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 03E392B72ADDA00E000ADF15 /* NetworkExtension.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
075637C12B015899005AFB8E /* libcore.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = 075637B22B0157CB005AFB8E /* libcore.xcframework */; };
075637C22B015899005AFB8E /* libcore.xcframework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 075637B22B0157CB005AFB8E /* libcore.xcframework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
07A63AD52B1E961E00CAFA4D /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 07A63AD42B1E961E00CAFA4D /* GeneratedPluginRegistrant.m */; }; 07A63AD52B1E961E00CAFA4D /* GeneratedPluginRegistrant.m in Sources */ = {isa = PBXBuildFile; fileRef = 07A63AD42B1E961E00CAFA4D /* GeneratedPluginRegistrant.m */; };
331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; };
3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; };
@@ -82,22 +79,12 @@
dstPath = ""; dstPath = "";
dstSubfolderSpec = 10; dstSubfolderSpec = 10;
files = ( files = (
073695882B3AC757007249BE /* Libcore.xcframework in Embed Frameworks */,
075637BD2B015864005AFB8E /* NetworkExtension.framework in Embed Frameworks */, 075637BD2B015864005AFB8E /* NetworkExtension.framework in Embed Frameworks */,
); );
name = "Embed Frameworks"; name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
075637C32B015899005AFB8E /* Embed Frameworks */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 10;
files = (
075637C22B015899005AFB8E /* libcore.xcframework in Embed Frameworks */,
);
name = "Embed Frameworks";
runOnlyForDeploymentPostprocessing = 0;
};
9705A1C41CF9048500538489 /* Embed Frameworks (2 items) */ = { 9705A1C41CF9048500538489 /* Embed Frameworks (2 items) */ = {
isa = PBXCopyFilesBuildPhase; isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
@@ -142,6 +129,7 @@
0736956E2B3998A2007249BE /* libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libcore.xcframework; path = Frameworks/libcore.xcframework; sourceTree = "<group>"; }; 0736956E2B3998A2007249BE /* libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libcore.xcframework; path = Frameworks/libcore.xcframework; sourceTree = "<group>"; };
073695722B39DA23007249BE /* Libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Libcore.xcframework; path = Frameworks/Libcore.xcframework; sourceTree = "<group>"; }; 073695722B39DA23007249BE /* Libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Libcore.xcframework; path = Frameworks/Libcore.xcframework; sourceTree = "<group>"; };
0736957A2B39DE78007249BE /* Libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Libcore.xcframework; path = Frameworks/Libcore.xcframework; sourceTree = "<group>"; }; 0736957A2B39DE78007249BE /* Libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Libcore.xcframework; path = Frameworks/Libcore.xcframework; sourceTree = "<group>"; };
0736958A2B3AC96D007249BE /* Bundle+Properties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+Properties.swift"; sourceTree = "<group>"; };
075637B22B0157CB005AFB8E /* libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libcore.xcframework; path = ../libcore/bin/libcore.xcframework; sourceTree = "<group>"; }; 075637B22B0157CB005AFB8E /* libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libcore.xcframework; path = ../libcore/bin/libcore.xcframework; sourceTree = "<group>"; };
07A63A832B1E728C00CAFA4D /* Release */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Release; path = ../build/ios/framework/release; sourceTree = "<group>"; }; 07A63A832B1E728C00CAFA4D /* Release */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Release; path = ../build/ios/framework/release; sourceTree = "<group>"; };
07A63A842B1E72AE00CAFA4D /* App.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = App.xcframework; path = ../build/ios/framework/release/App.xcframework; sourceTree = "<group>"; }; 07A63A842B1E72AE00CAFA4D /* App.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = App.xcframework; path = ../build/ios/framework/release/App.xcframework; sourceTree = "<group>"; };
@@ -199,7 +187,6 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
073695782B39DB2B007249BE /* Libcore.xcframework in Frameworks */, 073695782B39DB2B007249BE /* Libcore.xcframework in Frameworks */,
0736957C2B39DE78007249BE /* Libcore.xcframework in Frameworks */,
075637BC2B015864005AFB8E /* NetworkExtension.framework in Frameworks */, 075637BC2B015864005AFB8E /* NetworkExtension.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@@ -208,7 +195,6 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
075637C12B015899005AFB8E /* libcore.xcframework in Frameworks */,
54EA599BF9C050F2827533D5 /* Pods_RunnerTests.framework in Frameworks */, 54EA599BF9C050F2827533D5 /* Pods_RunnerTests.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@@ -217,8 +203,6 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
073695732B39DA23007249BE /* Libcore.xcframework in Frameworks */,
0736957B2B39DE78007249BE /* Libcore.xcframework in Frameworks */,
075637BA2B01583F005AFB8E /* Pods_Runner.framework in Frameworks */, 075637BA2B01583F005AFB8E /* Pods_Runner.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
@@ -240,8 +224,8 @@
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
03B516662AE6B93A00EA47E2 /* MethodHandler.swift */, 03B516662AE6B93A00EA47E2 /* MethodHandler.swift */,
03B5167A2AE79DB400EA47E2 /* FileMethodHandler.swift */,
03B516682AE7306B00EA47E2 /* StatusEventHandler.swift */, 03B516682AE7306B00EA47E2 /* StatusEventHandler.swift */,
03B5167A2AE79DB400EA47E2 /* FileMethodHandler.swift */,
03B5166A2AE7315E00EA47E2 /* AlertsEventHandler.swift */, 03B5166A2AE7315E00EA47E2 /* AlertsEventHandler.swift */,
03B5166C2AE7325500EA47E2 /* LogsEventHandler.swift */, 03B5166C2AE7325500EA47E2 /* LogsEventHandler.swift */,
03B5167C2AE7AC6200EA47E2 /* GroupsEventHandler.swift */, 03B5167C2AE7AC6200EA47E2 /* GroupsEventHandler.swift */,
@@ -289,6 +273,14 @@
path = Shared; path = Shared;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
073695892B3AC954007249BE /* Extensions */ = {
isa = PBXGroup;
children = (
0736958A2B3AC96D007249BE /* Bundle+Properties.swift */,
);
path = Extensions;
sourceTree = "<group>";
};
311A4F4314861E02331B8DAC /* Pods */ = { 311A4F4314861E02331B8DAC /* Pods */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
@@ -350,6 +342,7 @@
97C146F01CF9000F007C117D /* Runner */ = { 97C146F01CF9000F007C117D /* Runner */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
073695892B3AC954007249BE /* Extensions */,
03B5166E2AE7325D00EA47E2 /* Handlers */, 03B5166E2AE7325D00EA47E2 /* Handlers */,
032158B62ADDF8AF008D943B /* VPN */, 032158B62ADDF8AF008D943B /* VPN */,
74858FAE1ED2DC5600515810 /* AppDelegate.swift */, 74858FAE1ED2DC5600515810 /* AppDelegate.swift */,
@@ -436,7 +429,6 @@
331C807D294A63A400263BE5 /* Sources */, 331C807D294A63A400263BE5 /* Sources */,
331C807F294A63A400263BE5 /* Resources */, 331C807F294A63A400263BE5 /* Resources */,
531FE8242BCD501C24C8E9FA /* Frameworks */, 531FE8242BCD501C24C8E9FA /* Frameworks */,
075637C32B015899005AFB8E /* Embed Frameworks */,
); );
buildRules = ( buildRules = (
); );
@@ -681,6 +673,7 @@
74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */,
03B516712AE74CCD00EA47E2 /* VPNConfig.swift in Sources */, 03B516712AE74CCD00EA47E2 /* VPNConfig.swift in Sources */,
03B5166B2AE7315E00EA47E2 /* AlertsEventHandler.swift in Sources */, 03B5166B2AE7315E00EA47E2 /* AlertsEventHandler.swift in Sources */,
0736958B2B3AC96D007249BE /* Bundle+Properties.swift in Sources */,
03B516692AE7306B00EA47E2 /* StatusEventHandler.swift in Sources */, 03B516692AE7306B00EA47E2 /* StatusEventHandler.swift in Sources */,
032158B82ADDF8BF008D943B /* VPNManager.swift in Sources */, 032158B82ADDF8BF008D943B /* VPNManager.swift in Sources */,
03B516672AE6B93A00EA47E2 /* MethodHandler.swift in Sources */, 03B516672AE6B93A00EA47E2 /* MethodHandler.swift in Sources */,

View File

@@ -9,12 +9,9 @@ import Libcore
_ application: UIApplication, _ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
) -> Bool { ) -> Bool {
setupFileManager() setupFileManager()
registerHandlers() registerHandlers()
GeneratedPluginRegistrant.register(with: self) GeneratedPluginRegistrant.register(with: self)
return super.application(application, didFinishLaunchingWithOptions: launchOptions) return super.application(application, didFinishLaunchingWithOptions: launchOptions)
} }

View File

@@ -0,0 +1,18 @@
//
// Bundle+Properties.swift
// Runner
//
// Created by Hiddify on 12/26/23.
//
import Foundation
extension Bundle {
var serviceIdentifier: String {
(infoDictionary?["SERVICE_IDENTIFIER"] as? String)!
}
var baseBundleIdentifier: String {
(infoDictionary?["BASE_BUNDLE_IDENTIFIER"] as? String)!
}
}

View File

@@ -9,11 +9,12 @@ import Foundation
import Combine import Combine
public class AlertsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler { public class AlertsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler {
static let name = "\(FilePath.packageName)/service.alerts" static let name = "\(Bundle.main.serviceIdentifier)/service.alerts"
private var channel: FlutterEventChannel? private var channel: FlutterEventChannel?
private var cancellable: AnyCancellable? private var cancellable: AnyCancellable?
private var cancelBag: Set<AnyCancellable> = []
public static func register(with registrar: FlutterPluginRegistrar) { public static func register(with registrar: FlutterPluginRegistrar) {
let instance = AlertsEventHandler() let instance = AlertsEventHandler()
@@ -22,7 +23,13 @@ public class AlertsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler {
} }
public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {
cancellable = VPNManager.shared.$alert.sink { [events] alert in print("[TLOG] handle start method \(AlertsEventHandler.name)")
NSLog("[TLOG] handle start method \(AlertsEventHandler.name)")
defer {
print("[TLOG] handler end method \(AlertsEventHandler.name)")
NSLog("[TLOG] handler end method \(AlertsEventHandler.name)")
}
VPNManager.shared.$alert.sink { [events] alert in
var data = [ var data = [
"status": "Stopped", "status": "Stopped",
"alert": alert.alert?.rawValue, "alert": alert.alert?.rawValue,
@@ -34,12 +41,12 @@ public class AlertsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler {
} }
} }
events(data) events(data)
} }.store(in: &cancelBag)
return nil return nil
} }
public func onCancel(withArguments arguments: Any?) -> FlutterError? { public func onCancel(withArguments arguments: Any?) -> FlutterError? {
cancellable?.cancel() // cancellable?.cancel()
return nil return nil
} }
} }

View File

@@ -9,7 +9,7 @@ import Foundation
public class FileMethodHandler: NSObject, FlutterPlugin { public class FileMethodHandler: NSObject, FlutterPlugin {
public static let name = "\(FilePath.packageName)/files.method" public static let name = "\(Bundle.main.serviceIdentifier)/files.method"
public static func register(with registrar: FlutterPluginRegistrar) { public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(name: Self.name, binaryMessenger: registrar.messenger()) let channel = FlutterMethodChannel(name: Self.name, binaryMessenger: registrar.messenger())
@@ -21,6 +21,8 @@ public class FileMethodHandler: NSObject, FlutterPlugin {
private var channel: FlutterMethodChannel? private var channel: FlutterMethodChannel?
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
NSLog("[TLOG] handle start method \(call.method)")
defer { NSLog("[TLOG] handler end method \(call.method)") }
switch call.method { switch call.method {
case "get_paths": case "get_paths":
result([ result([

View File

@@ -29,7 +29,7 @@ struct SBGroup: Codable {
public class GroupsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler, LibboxCommandClientHandlerProtocol { public class GroupsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler, LibboxCommandClientHandlerProtocol {
static let name = "\(FilePath.packageName)/groups" static let name = "\(Bundle.main.serviceIdentifier)/groups"
private var channel: FlutterEventChannel? private var channel: FlutterEventChannel?

View File

@@ -8,7 +8,7 @@
import Foundation import Foundation
public class LogsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler { public class LogsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler {
static let name = "\(FilePath.packageName)/service.logs" static let name = "\(Bundle.main.serviceIdentifier)/service.logs"
private var channel: FlutterEventChannel? private var channel: FlutterEventChannel?

View File

@@ -13,7 +13,7 @@ public class MethodHandler: NSObject, FlutterPlugin {
private var cancelBag: Set<AnyCancellable> = [] private var cancelBag: Set<AnyCancellable> = []
public static let name = "\(FilePath.packageName)/method" public static let name = "\(Bundle.main.serviceIdentifier)/method"
public static func register(with registrar: FlutterPluginRegistrar) { public static func register(with registrar: FlutterPluginRegistrar) {
let channel = FlutterMethodChannel(name: Self.name, binaryMessenger: registrar.messenger()) let channel = FlutterMethodChannel(name: Self.name, binaryMessenger: registrar.messenger())
@@ -25,11 +25,20 @@ public class MethodHandler: NSObject, FlutterPlugin {
private var channel: FlutterMethodChannel? private var channel: FlutterMethodChannel?
public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
NSLog("[TLOG] handle start method \(call.method)")
defer { NSLog("[TLOG] handler end method \(call.method)") }
switch call.method { switch call.method {
case "parse_config": case "parse_config":
result(parseConfig(args: call.arguments)) result(parseConfig(args: call.arguments))
case "change_config_options": case "change_config_options":
result(changeConfigOptions(args: call.arguments)) result(changeConfigOptions(args: call.arguments))
case "setup":
Task { [unowned self] in
let res = await setup(args: call.arguments)
await MainActor.run {
result(res)
}
}
case "start": case "start":
Task { [unowned self] in Task { [unowned self] in
let res = await start(args: call.arguments) let res = await start(args: call.arguments)
@@ -80,6 +89,15 @@ public class MethodHandler: NSObject, FlutterPlugin {
return true return true
} }
public func setup(args: Any?) async -> Bool {
do {
try await VPNManager.shared.setup()
} catch {
return false
}
return true
}
public func start(args: Any?) async -> Bool { public func start(args: Any?) async -> Bool {
guard guard
let args = args as? [String:Any?], let args = args as? [String:Any?],

View File

@@ -9,11 +9,12 @@ import Foundation
import Combine import Combine
public class StatusEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler { public class StatusEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler {
static let name = "com.hiddify.app//service.status" static let name = "\(Bundle.main.serviceIdentifier)/service.status"
private var channel: FlutterEventChannel? private var channel: FlutterEventChannel?
private var cancellable: AnyCancellable? private var cancellable: AnyCancellable?
private var cancelBag: Set<AnyCancellable> = []
public static func register(with registrar: FlutterPluginRegistrar) { public static func register(with registrar: FlutterPluginRegistrar) {
let instance = StatusEventHandler() let instance = StatusEventHandler()
@@ -22,7 +23,13 @@ public class StatusEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler {
} }
public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? { public func onListen(withArguments arguments: Any?, eventSink events: @escaping FlutterEventSink) -> FlutterError? {
cancellable = VPNManager.shared.$state.sink { [events] status in print("[TLOG] handle start method \(StatusEventHandler.name)")
NSLog("[TLOG] handle start method \(StatusEventHandler.name)")
defer {
print("[TLOG] handler end method \(StatusEventHandler.name)")
NSLog("[TLOG] handler end method \(StatusEventHandler.name)")
}
VPNManager.shared.$state.sink { [events] status in
switch status { switch status {
case .reasserting, .connecting: case .reasserting, .connecting:
events(["status": "Starting"]) events(["status": "Starting"])
@@ -35,12 +42,12 @@ public class StatusEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler {
@unknown default: @unknown default:
events(["status": "Stopped"]) events(["status": "Stopped"])
} }
} }.store(in: &cancelBag)
return nil return nil
} }
public func onCancel(withArguments arguments: Any?) -> FlutterError? { public func onCancel(withArguments arguments: Any?) -> FlutterError? {
cancellable?.cancel() // cancellable?.cancel()
return nil return nil
} }
} }

View File

@@ -57,9 +57,10 @@
<key>UIViewControllerBasedStatusBarAppearance</key> <key>UIViewControllerBasedStatusBarAppearance</key>
<false/> <false/>
<key>NSCameraUsageDescription</key> <key>NSCameraUsageDescription</key>
<string>This app needs camera access to scan QR codes</string> <string>This app needs camera access to scan QR codes</string>
<key>NSPhotoLibraryUsageDescription</key>
<key>NSPhotoLibraryUsageDescription</key> <string>This app needs photos access to get QR code from photo library</string>
<string>This app needs photos access to get QR code from photo library</string> <key>SERVICE_IDENTIFIER</key>
<string>$(SERVICE_IDENTIFIER)</string>
</dict> </dict>
</plist> </plist>

View File

@@ -94,7 +94,7 @@ class VPNManager: ObservableObject {
} }
let newManager = NETunnelProviderManager() let newManager = NETunnelProviderManager()
let `protocol` = NETunnelProviderProtocol() let `protocol` = NETunnelProviderProtocol()
`protocol`.providerBundleIdentifier = "\(FilePath.packageName).SingBoxPacketTunnel" `protocol`.providerBundleIdentifier = "\(Bundle.main.baseBundleIdentifier).SingBoxPacketTunnel"
`protocol`.serverAddress = "Hiddify" `protocol`.serverAddress = "Hiddify"
newManager.protocolConfiguration = `protocol` newManager.protocolConfiguration = `protocol`
newManager.localizedDescription = "Hiddify" newManager.localizedDescription = "Hiddify"

View File

@@ -28,7 +28,16 @@ class PlatformSingboxService with InfraLogger implements SingboxService {
_statusChannel.receiveBroadcastStream().map(SingboxStatus.fromEvent); _statusChannel.receiveBroadcastStream().map(SingboxStatus.fromEvent);
final alerts = final alerts =
_alertsChannel.receiveBroadcastStream().map(SingboxStatus.fromEvent); _alertsChannel.receiveBroadcastStream().map(SingboxStatus.fromEvent);
loggy.debug("[TLOG] Status first recieved");
final _2 = await alerts.first;
loggy.debug("[TLOG] alert First recieved");
final _1 = await status.first;
loggy.debug("[TLOG] Waiting for first entry");
_status = ValueConnectableStream(Rx.merge([status, alerts])).autoConnect(); _status = ValueConnectableStream(Rx.merge([status, alerts])).autoConnect();
await _status.first; await _status.first;
} }