From 38348feb25bc81c2ea801691d415029064b5cb02 Mon Sep 17 00:00:00 2001 From: hiddify Date: Tue, 26 Dec 2023 22:26:06 +0330 Subject: [PATCH] update ios --- ios/Base.xcconfig | 1 + ios/Runner.xcodeproj/project.pbxproj | 37 ++++++++----------- ios/Runner/AppDelegate.swift | 3 -- ios/Runner/Extensions/Bundle+Properties.swift | 18 +++++++++ ios/Runner/Handlers/AlertsEventHandler.swift | 15 ++++++-- ios/Runner/Handlers/FileMethodHandler.swift | 4 +- ios/Runner/Handlers/GroupsEventHandler.swift | 2 +- ios/Runner/Handlers/LogsEventHandler.swift | 2 +- ios/Runner/Handlers/MethodHandler.swift | 22 ++++++++++- ios/Runner/Handlers/StatusEventHandler.swift | 15 ++++++-- ios/Runner/Info.plist | 9 +++-- ios/Runner/VPN/VPNManager.swift | 2 +- .../service/platform_singbox_service.dart | 9 +++++ 13 files changed, 96 insertions(+), 43 deletions(-) create mode 100644 ios/Runner/Extensions/Bundle+Properties.swift diff --git a/ios/Base.xcconfig b/ios/Base.xcconfig index e716662f..d3699d98 100644 --- a/ios/Base.xcconfig +++ b/ios/Base.xcconfig @@ -6,4 +6,5 @@ // BASE_BUNDLE_IDENTIFIER=hiddify +SERVICE_IDENTIFIER=com.hiddify.app DEVELOPMENT_TEAM=3JFTY5BP58 diff --git a/ios/Runner.xcodeproj/project.pbxproj b/ios/Runner.xcodeproj/project.pbxproj index 6a440dd2..1750afa0 100644 --- a/ios/Runner.xcodeproj/project.pbxproj +++ b/ios/Runner.xcodeproj/project.pbxproj @@ -27,16 +27,13 @@ 03E392D02ADDF1BD000ADF15 /* FilePath.swift in Sources */ = {isa = PBXBuildFile; fileRef = 03E392CE2ADDEFC8000ADF15 /* FilePath.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 */; }; - 073695732B39DA23007249BE /* 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 */; }; - 0736957C2B39DE78007249BE /* 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, ); }; }; + 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 */; }; 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 */; }; 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 */; }; 331C808B294A63AB00263BE5 /* RunnerTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 331C807B294A618700263BE5 /* RunnerTests.swift */; }; 3B3967161E833CAA004F5970 /* AppFrameworkInfo.plist in Resources */ = {isa = PBXBuildFile; fileRef = 3B3967151E833CAA004F5970 /* AppFrameworkInfo.plist */; }; @@ -82,22 +79,12 @@ dstPath = ""; dstSubfolderSpec = 10; files = ( + 073695882B3AC757007249BE /* Libcore.xcframework in Embed Frameworks */, 075637BD2B015864005AFB8E /* NetworkExtension.framework in Embed Frameworks */, ); name = "Embed Frameworks"; 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) */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -142,6 +129,7 @@ 0736956E2B3998A2007249BE /* libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libcore.xcframework; path = Frameworks/libcore.xcframework; sourceTree = ""; }; 073695722B39DA23007249BE /* Libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Libcore.xcframework; path = Frameworks/Libcore.xcframework; sourceTree = ""; }; 0736957A2B39DE78007249BE /* Libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = Libcore.xcframework; path = Frameworks/Libcore.xcframework; sourceTree = ""; }; + 0736958A2B3AC96D007249BE /* Bundle+Properties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Bundle+Properties.swift"; sourceTree = ""; }; 075637B22B0157CB005AFB8E /* libcore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = libcore.xcframework; path = ../libcore/bin/libcore.xcframework; sourceTree = ""; }; 07A63A832B1E728C00CAFA4D /* Release */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Release; path = ../build/ios/framework/release; sourceTree = ""; }; 07A63A842B1E72AE00CAFA4D /* App.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = App.xcframework; path = ../build/ios/framework/release/App.xcframework; sourceTree = ""; }; @@ -199,7 +187,6 @@ buildActionMask = 2147483647; files = ( 073695782B39DB2B007249BE /* Libcore.xcframework in Frameworks */, - 0736957C2B39DE78007249BE /* Libcore.xcframework in Frameworks */, 075637BC2B015864005AFB8E /* NetworkExtension.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -208,7 +195,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 075637C12B015899005AFB8E /* libcore.xcframework in Frameworks */, 54EA599BF9C050F2827533D5 /* Pods_RunnerTests.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -217,8 +203,6 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 073695732B39DA23007249BE /* Libcore.xcframework in Frameworks */, - 0736957B2B39DE78007249BE /* Libcore.xcframework in Frameworks */, 075637BA2B01583F005AFB8E /* Pods_Runner.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -240,8 +224,8 @@ isa = PBXGroup; children = ( 03B516662AE6B93A00EA47E2 /* MethodHandler.swift */, - 03B5167A2AE79DB400EA47E2 /* FileMethodHandler.swift */, 03B516682AE7306B00EA47E2 /* StatusEventHandler.swift */, + 03B5167A2AE79DB400EA47E2 /* FileMethodHandler.swift */, 03B5166A2AE7315E00EA47E2 /* AlertsEventHandler.swift */, 03B5166C2AE7325500EA47E2 /* LogsEventHandler.swift */, 03B5167C2AE7AC6200EA47E2 /* GroupsEventHandler.swift */, @@ -289,6 +273,14 @@ path = Shared; sourceTree = ""; }; + 073695892B3AC954007249BE /* Extensions */ = { + isa = PBXGroup; + children = ( + 0736958A2B3AC96D007249BE /* Bundle+Properties.swift */, + ); + path = Extensions; + sourceTree = ""; + }; 311A4F4314861E02331B8DAC /* Pods */ = { isa = PBXGroup; children = ( @@ -350,6 +342,7 @@ 97C146F01CF9000F007C117D /* Runner */ = { isa = PBXGroup; children = ( + 073695892B3AC954007249BE /* Extensions */, 03B5166E2AE7325D00EA47E2 /* Handlers */, 032158B62ADDF8AF008D943B /* VPN */, 74858FAE1ED2DC5600515810 /* AppDelegate.swift */, @@ -436,7 +429,6 @@ 331C807D294A63A400263BE5 /* Sources */, 331C807F294A63A400263BE5 /* Resources */, 531FE8242BCD501C24C8E9FA /* Frameworks */, - 075637C32B015899005AFB8E /* Embed Frameworks */, ); buildRules = ( ); @@ -681,6 +673,7 @@ 74858FAF1ED2DC5600515810 /* AppDelegate.swift in Sources */, 03B516712AE74CCD00EA47E2 /* VPNConfig.swift in Sources */, 03B5166B2AE7315E00EA47E2 /* AlertsEventHandler.swift in Sources */, + 0736958B2B3AC96D007249BE /* Bundle+Properties.swift in Sources */, 03B516692AE7306B00EA47E2 /* StatusEventHandler.swift in Sources */, 032158B82ADDF8BF008D943B /* VPNManager.swift in Sources */, 03B516672AE6B93A00EA47E2 /* MethodHandler.swift in Sources */, diff --git a/ios/Runner/AppDelegate.swift b/ios/Runner/AppDelegate.swift index ac1a4e09..363905b5 100644 --- a/ios/Runner/AppDelegate.swift +++ b/ios/Runner/AppDelegate.swift @@ -9,12 +9,9 @@ import Libcore _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { - setupFileManager() - registerHandlers() GeneratedPluginRegistrant.register(with: self) - return super.application(application, didFinishLaunchingWithOptions: launchOptions) } diff --git a/ios/Runner/Extensions/Bundle+Properties.swift b/ios/Runner/Extensions/Bundle+Properties.swift new file mode 100644 index 00000000..c92abf7c --- /dev/null +++ b/ios/Runner/Extensions/Bundle+Properties.swift @@ -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)! + } +} diff --git a/ios/Runner/Handlers/AlertsEventHandler.swift b/ios/Runner/Handlers/AlertsEventHandler.swift index 02551c9b..d9f8f6ba 100644 --- a/ios/Runner/Handlers/AlertsEventHandler.swift +++ b/ios/Runner/Handlers/AlertsEventHandler.swift @@ -9,11 +9,12 @@ import Foundation import Combine 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 cancellable: AnyCancellable? + private var cancelBag: Set = [] public static func register(with registrar: FlutterPluginRegistrar) { let instance = AlertsEventHandler() @@ -22,7 +23,13 @@ public class AlertsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler { } 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 = [ "status": "Stopped", "alert": alert.alert?.rawValue, @@ -34,12 +41,12 @@ public class AlertsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler { } } events(data) - } + }.store(in: &cancelBag) return nil } public func onCancel(withArguments arguments: Any?) -> FlutterError? { - cancellable?.cancel() + // cancellable?.cancel() return nil } } diff --git a/ios/Runner/Handlers/FileMethodHandler.swift b/ios/Runner/Handlers/FileMethodHandler.swift index ca230f10..d7d7dc8e 100644 --- a/ios/Runner/Handlers/FileMethodHandler.swift +++ b/ios/Runner/Handlers/FileMethodHandler.swift @@ -9,7 +9,7 @@ import Foundation 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) { let channel = FlutterMethodChannel(name: Self.name, binaryMessenger: registrar.messenger()) @@ -21,6 +21,8 @@ public class FileMethodHandler: NSObject, FlutterPlugin { private var channel: FlutterMethodChannel? 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 { case "get_paths": result([ diff --git a/ios/Runner/Handlers/GroupsEventHandler.swift b/ios/Runner/Handlers/GroupsEventHandler.swift index 4b4901c3..cb842ed7 100644 --- a/ios/Runner/Handlers/GroupsEventHandler.swift +++ b/ios/Runner/Handlers/GroupsEventHandler.swift @@ -29,7 +29,7 @@ struct SBGroup: Codable { public class GroupsEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler, LibboxCommandClientHandlerProtocol { - static let name = "\(FilePath.packageName)/groups" + static let name = "\(Bundle.main.serviceIdentifier)/groups" private var channel: FlutterEventChannel? diff --git a/ios/Runner/Handlers/LogsEventHandler.swift b/ios/Runner/Handlers/LogsEventHandler.swift index 310234c8..85ab83eb 100644 --- a/ios/Runner/Handlers/LogsEventHandler.swift +++ b/ios/Runner/Handlers/LogsEventHandler.swift @@ -8,7 +8,7 @@ import Foundation 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? diff --git a/ios/Runner/Handlers/MethodHandler.swift b/ios/Runner/Handlers/MethodHandler.swift index 1c413b1e..b1c8f62b 100644 --- a/ios/Runner/Handlers/MethodHandler.swift +++ b/ios/Runner/Handlers/MethodHandler.swift @@ -13,23 +13,32 @@ public class MethodHandler: NSObject, FlutterPlugin { private var cancelBag: Set = [] - public static let name = "\(FilePath.packageName)/method" + public static let name = "\(Bundle.main.serviceIdentifier)/method" public static func register(with registrar: FlutterPluginRegistrar) { let channel = FlutterMethodChannel(name: Self.name, binaryMessenger: registrar.messenger()) let instance = MethodHandler() registrar.addMethodCallDelegate(instance, channel: channel) - instance.channel = channel + instance.channel = channel } private var channel: FlutterMethodChannel? 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 { case "parse_config": result(parseConfig(args: call.arguments)) case "change_config_options": 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": Task { [unowned self] in let res = await start(args: call.arguments) @@ -80,6 +89,15 @@ public class MethodHandler: NSObject, FlutterPlugin { 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 { guard let args = args as? [String:Any?], diff --git a/ios/Runner/Handlers/StatusEventHandler.swift b/ios/Runner/Handlers/StatusEventHandler.swift index c696b4ce..6c151154 100644 --- a/ios/Runner/Handlers/StatusEventHandler.swift +++ b/ios/Runner/Handlers/StatusEventHandler.swift @@ -9,11 +9,12 @@ import Foundation import Combine 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 cancellable: AnyCancellable? + private var cancelBag: Set = [] public static func register(with registrar: FlutterPluginRegistrar) { let instance = StatusEventHandler() @@ -22,7 +23,13 @@ public class StatusEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler { } 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 { case .reasserting, .connecting: events(["status": "Starting"]) @@ -35,12 +42,12 @@ public class StatusEventHandler: NSObject, FlutterPlugin, FlutterStreamHandler { @unknown default: events(["status": "Stopped"]) } - } + }.store(in: &cancelBag) return nil } public func onCancel(withArguments arguments: Any?) -> FlutterError? { - cancellable?.cancel() + // cancellable?.cancel() return nil } } diff --git a/ios/Runner/Info.plist b/ios/Runner/Info.plist index a3696f20..5724ee2f 100644 --- a/ios/Runner/Info.plist +++ b/ios/Runner/Info.plist @@ -57,9 +57,10 @@ UIViewControllerBasedStatusBarAppearance NSCameraUsageDescription -This app needs camera access to scan QR codes - -NSPhotoLibraryUsageDescription -This app needs photos access to get QR code from photo library + This app needs camera access to scan QR codes + NSPhotoLibraryUsageDescription + This app needs photos access to get QR code from photo library + SERVICE_IDENTIFIER + $(SERVICE_IDENTIFIER) diff --git a/ios/Runner/VPN/VPNManager.swift b/ios/Runner/VPN/VPNManager.swift index 4af31f0b..670ed557 100644 --- a/ios/Runner/VPN/VPNManager.swift +++ b/ios/Runner/VPN/VPNManager.swift @@ -94,7 +94,7 @@ class VPNManager: ObservableObject { } let newManager = NETunnelProviderManager() let `protocol` = NETunnelProviderProtocol() - `protocol`.providerBundleIdentifier = "\(FilePath.packageName).SingBoxPacketTunnel" + `protocol`.providerBundleIdentifier = "\(Bundle.main.baseBundleIdentifier).SingBoxPacketTunnel" `protocol`.serverAddress = "Hiddify" newManager.protocolConfiguration = `protocol` newManager.localizedDescription = "Hiddify" diff --git a/lib/singbox/service/platform_singbox_service.dart b/lib/singbox/service/platform_singbox_service.dart index e5daaa76..11643a4c 100644 --- a/lib/singbox/service/platform_singbox_service.dart +++ b/lib/singbox/service/platform_singbox_service.dart @@ -28,7 +28,16 @@ class PlatformSingboxService with InfraLogger implements SingboxService { _statusChannel.receiveBroadcastStream().map(SingboxStatus.fromEvent); final alerts = _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(); + await _status.first; }