]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
WireguardApp: iOS: Moved tunnelsManager initialization to AppDelegate
authorAlessio Nossa <alessio.nossa@gmail.com>
Sat, 29 Jan 2022 16:17:05 +0000 (17:17 +0100)
committerAlessio Nossa <alessio.nossa@gmail.com>
Tue, 1 Feb 2022 19:13:13 +0000 (20:13 +0100)
Signed-off-by: Alessio Nossa <alessio.nossa@gmail.com>
Sources/WireGuardApp/UI/iOS/AppDelegate.swift
Sources/WireGuardApp/UI/iOS/ViewController/MainViewController.swift

index 4ab3b303f6084c32e6260b90842291f28d75e8fc..4172b33aac3ee80cc1efd380fdbd891e6401bc7e 100644 (file)
@@ -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
     }
 
index b7805172ed8cb65142b822b69138c8356732fa73..6aab559086731fbae34375513886924e3cfab53c 100644 (file)
@@ -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 {