From: Alessio Nossa Date: Sat, 29 Jan 2022 16:17:05 +0000 (+0100) Subject: WireguardApp: iOS: Moved tunnelsManager initialization to AppDelegate X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ceabb4ea341ef0e792c5d0f06c6128d1e91ad522;p=thirdparty%2Fwireguard-apple.git WireguardApp: iOS: Moved tunnelsManager initialization to AppDelegate Signed-off-by: Alessio Nossa --- diff --git a/Sources/WireGuardApp/UI/iOS/AppDelegate.swift b/Sources/WireGuardApp/UI/iOS/AppDelegate.swift index 4ab3b30..4172b33 100644 --- a/Sources/WireGuardApp/UI/iOS/AppDelegate.swift +++ b/Sources/WireGuardApp/UI/iOS/AppDelegate.swift @@ -11,6 +11,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var mainVC: MainViewController? var isLaunchedForSpecificAction = false + var tunnelsManager: TunnelsManager? + + static let tunnelsManagerReadyNotificationName: Notification.Name = Notification.Name(rawValue: "com.wireguard.ios.tunnelsManagerReadyNotification") + func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { Logger.configureGlobal(tagged: "APP", withFilePath: FileManager.logFileURL?.path) @@ -29,6 +33,25 @@ class AppDelegate: UIResponder, UIApplicationDelegate { self.mainVC = mainVC + // Create the tunnels manager, and when it's ready, inform tunnelsListVC + TunnelsManager.create { [weak self] result in + guard let self = self else { return } + + switch result { + case .failure(let error): + ErrorPresenter.showErrorAlert(error: error, from: self.mainVC) + case .success(let tunnelsManager): + self.tunnelsManager = tunnelsManager + self.mainVC?.tunnelsListVC?.setTunnelsManager(tunnelsManager: tunnelsManager) + + tunnelsManager.activationDelegate = self.mainVC + + NotificationCenter.default.post(name: AppDelegate.tunnelsManagerReadyNotificationName, + object: self, + userInfo: nil) + } + } + return true } diff --git a/Sources/WireGuardApp/UI/iOS/ViewController/MainViewController.swift b/Sources/WireGuardApp/UI/iOS/ViewController/MainViewController.swift index b780517..6aab559 100644 --- a/Sources/WireGuardApp/UI/iOS/ViewController/MainViewController.swift +++ b/Sources/WireGuardApp/UI/iOS/ViewController/MainViewController.swift @@ -5,7 +5,9 @@ import UIKit class MainViewController: UISplitViewController { - var tunnelsManager: TunnelsManager? + var tunnelsManager: TunnelsManager? { + return (UIApplication.shared.delegate as? AppDelegate)?.tunnelsManager + } var onTunnelsManagerReady: ((TunnelsManager) -> Void)? var tunnelsListVC: TunnelsListTableViewController? @@ -42,29 +44,24 @@ class MainViewController: UISplitViewController { // On iPad, always show both masterVC and detailVC, even in portrait mode, like the Settings app preferredDisplayMode = .allVisible - // Create the tunnels manager, and when it's ready, inform tunnelsListVC - TunnelsManager.create { [weak self] result in - guard let self = self else { return } - - switch result { - case .failure(let error): - ErrorPresenter.showErrorAlert(error: error, from: self) - case .success(let tunnelsManager): - self.tunnelsManager = tunnelsManager - self.tunnelsListVC?.setTunnelsManager(tunnelsManager: tunnelsManager) - - tunnelsManager.activationDelegate = self - - self.onTunnelsManagerReady?(tunnelsManager) - self.onTunnelsManagerReady = nil - } - } + NotificationCenter.default.addObserver(self, selector: #selector(handleTunnelsManagerReady(_:)), + name: AppDelegate.tunnelsManagerReadyNotificationName, object: nil) } func allTunnelNames() -> [String]? { guard let tunnelsManager = self.tunnelsManager else { return nil } return tunnelsManager.mapTunnels { $0.name } } + + @objc + func handleTunnelsManagerReady(_ notification: Notification) { + guard let tunnelsManager = self.tunnelsManager else { return } + + self.onTunnelsManagerReady?(tunnelsManager) + self.onTunnelsManagerReady = nil + + NotificationCenter.default.removeObserver(self, name: AppDelegate.tunnelsManagerReadyNotificationName, object: nil) + } } extension MainViewController: TunnelsManagerActivationDelegate {