update ios
This commit is contained in:
@@ -6,4 +6,5 @@
|
||||
//
|
||||
|
||||
BASE_BUNDLE_IDENTIFIER=hiddify
|
||||
SERVICE_IDENTIFIER=com.hiddify.app
|
||||
DEVELOPMENT_TEAM=3JFTY5BP58
|
||||
|
||||
@@ -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 = "<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>"; };
|
||||
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>"; };
|
||||
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>"; };
|
||||
@@ -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 = "<group>";
|
||||
};
|
||||
073695892B3AC954007249BE /* Extensions */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
0736958A2B3AC96D007249BE /* Bundle+Properties.swift */,
|
||||
);
|
||||
path = Extensions;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
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 */,
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
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
|
||||
|
||||
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<AnyCancellable> = []
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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([
|
||||
|
||||
@@ -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?
|
||||
|
||||
|
||||
@@ -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?
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ public class MethodHandler: NSObject, FlutterPlugin {
|
||||
|
||||
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) {
|
||||
let channel = FlutterMethodChannel(name: Self.name, binaryMessenger: registrar.messenger())
|
||||
@@ -25,11 +25,20 @@ public class MethodHandler: 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 "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?],
|
||||
|
||||
@@ -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<AnyCancellable> = []
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,8 +58,9 @@
|
||||
<false/>
|
||||
<key>NSCameraUsageDescription</key>
|
||||
<string>This app needs camera access to scan QR codes</string>
|
||||
|
||||
<key>NSPhotoLibraryUsageDescription</key>
|
||||
<string>This app needs photos access to get QR code from photo library</string>
|
||||
<key>SERVICE_IDENTIFIER</key>
|
||||
<string>$(SERVICE_IDENTIFIER)</string>
|
||||
</dict>
|
||||
</plist>
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user