diff --git a/swift/apple/FirezoneNetworkExtension/ConfigurationManager.swift b/swift/apple/FirezoneNetworkExtension/ConfigurationManager.swift index 2d87cfcf3..bb89f888c 100644 --- a/swift/apple/FirezoneNetworkExtension/ConfigurationManager.swift +++ b/swift/apple/FirezoneNetworkExtension/ConfigurationManager.swift @@ -21,16 +21,26 @@ class ConfigurationManager { // can cause deadlocks in rare cases. private var userDict: [String: Any?] - private var managedDict: [String: Any?] { - userDefaults.dictionary(forKey: managedDictKey) ?? [:] - } + private var managedDict: [String: Any?] private init() { userDefaults = UserDefaults.standard userDict = userDefaults.dictionary(forKey: userDictKey) ?? [:] + managedDict = userDefaults.dictionary(forKey: managedDictKey) ?? [:] migrateFirezoneId() Telemetry.firezoneId = userDict[Configuration.Keys.firezoneId] as? String + + NotificationCenter.default.addObserver( + self, + selector: #selector(handleUserDefaultsChanged), + name: UserDefaults.didChangeNotification, + object: userDefaults + ) + } + + deinit { + NotificationCenter.default.removeObserver(self, name: UserDefaults.didChangeNotification, object: userDefaults) } // Save user-settable configuration @@ -69,6 +79,10 @@ class ConfigurationManager { setFirezoneId(UUID().uuidString) } + @objc private func handleUserDefaultsChanged(_ notification: Notification) { + self.managedDict = userDefaults.dictionary(forKey: managedDictKey) ?? [:] + } + private func saveUserDict() { userDefaults.set(userDict, forKey: userDictKey) } diff --git a/swift/apple/FirezoneNetworkExtension/PacketTunnelProvider.swift b/swift/apple/FirezoneNetworkExtension/PacketTunnelProvider.swift index cd47665a2..0edd92bb4 100644 --- a/swift/apple/FirezoneNetworkExtension/PacketTunnelProvider.swift +++ b/swift/apple/FirezoneNetworkExtension/PacketTunnelProvider.swift @@ -176,8 +176,8 @@ class PacketTunnelProvider: NEPacketTunnelProvider { completionHandler?(configurationPayload) case .setConfiguration(let configuration): - self.configuration = configuration ConfigurationManager.shared.setConfiguration(configuration) + self.configuration = ConfigurationManager.shared.toConfiguration() completionHandler?(nil) case .signOut: