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
SERVICE_IDENTIFIER=com.hiddify.app
DEVELOPMENT_TEAM=3JFTY5BP58

View File

@@ -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 */,

View File

@@ -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)
}

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
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
}
}

View File

@@ -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([

View File

@@ -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?

View File

@@ -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?

View File

@@ -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?],

View File

@@ -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
}
}

View File

@@ -57,9 +57,10 @@
<key>UIViewControllerBasedStatusBarAppearance</key>
<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>
<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>

View File

@@ -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"

View File

@@ -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;
}