update ios
This commit is contained in:
@@ -6,4 +6,5 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
BASE_BUNDLE_IDENTIFIER=hiddify
|
BASE_BUNDLE_IDENTIFIER=hiddify
|
||||||
|
SERVICE_IDENTIFIER=com.hiddify.app
|
||||||
DEVELOPMENT_TEAM=3JFTY5BP58
|
DEVELOPMENT_TEAM=3JFTY5BP58
|
||||||
|
|||||||
@@ -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 */,
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
18
ios/Runner/Extensions/Bundle+Properties.swift
Normal file
18
ios/Runner/Extensions/Bundle+Properties.swift
Normal 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)!
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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([
|
||||||
|
|||||||
@@ -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?
|
||||||
|
|
||||||
|
|||||||
@@ -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?
|
||||||
|
|
||||||
|
|||||||
@@ -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?],
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user