Kaynağa Gözat

Sync app appearance with macOS on launch

Detect light/dark via AppleInterfaceStyle (global domain). On each launch,
align NSApp appearance, saved toggle preference, and UI palette with the
current system appearance so Light macOS opens in light mode; in-app toggle
still works for the session.

Made-with: Cursor
huzaifahayat12 1 hafta önce
ebeveyn
işleme
6b23f7fd94

+ 11 - 3
meetings_app/AppDelegate.swift

@@ -12,9 +12,10 @@ class AppDelegate: NSObject, NSApplicationDelegate {
12 12
     private let darkModeDefaultsKey = "settings.darkModeEnabled"
13 13
 
14 14
     func applicationDidFinishLaunching(_ aNotification: Notification) {
15
-        // Match saved preference (defaults to dark if never set).
16
-        let hasValue = UserDefaults.standard.object(forKey: darkModeDefaultsKey) != nil
17
-        let darkEnabled = hasValue ? UserDefaults.standard.bool(forKey: darkModeDefaultsKey) : true
15
+        // Always sync to current macOS appearance on launch.
16
+        // (User can still toggle in-app later.)
17
+        let darkEnabled = systemPrefersDarkMode()
18
+        UserDefaults.standard.set(darkEnabled, forKey: darkModeDefaultsKey)
18 19
         NSApp.appearance = NSAppearance(named: darkEnabled ? .darkAqua : .aqua)
19 20
     }
20 21
 
@@ -26,6 +27,13 @@ class AppDelegate: NSObject, NSApplicationDelegate {
26 27
         return true
27 28
     }
28 29
 
30
+    private func systemPrefersDarkMode() -> Bool {
31
+        // Use the system-wide appearance setting (not app/window effective appearance).
32
+        // When the key is missing, macOS is in Light mode.
33
+        let global = UserDefaults.standard.persistentDomain(forName: UserDefaults.globalDomain)
34
+        let style = global?["AppleInterfaceStyle"] as? String
35
+        return style?.lowercased() == "dark"
36
+    }
29 37
 
30 38
 }
31 39
 

+ 11 - 1
meetings_app/ViewController.swift

@@ -69,7 +69,7 @@ final class ViewController: NSViewController {
69 69
     private var darkModeEnabled: Bool {
70 70
         get {
71 71
             let hasValue = UserDefaults.standard.object(forKey: darkModeDefaultsKey) != nil
72
-            return hasValue ? UserDefaults.standard.bool(forKey: darkModeDefaultsKey) : true
72
+            return hasValue ? UserDefaults.standard.bool(forKey: darkModeDefaultsKey) : systemPrefersDarkMode()
73 73
         }
74 74
         set { UserDefaults.standard.set(newValue, forKey: darkModeDefaultsKey) }
75 75
     }
@@ -96,6 +96,8 @@ final class ViewController: NSViewController {
96 96
 
97 97
     override func viewDidLoad() {
98 98
         super.viewDidLoad()
99
+        // Sync toggle + palette with current macOS appearance on launch.
100
+        darkModeEnabled = systemPrefersDarkMode()
99 101
         palette = Palette(isDarkMode: darkModeEnabled)
100 102
         setupRootView()
101 103
         buildMainLayout()
@@ -136,6 +138,14 @@ private extension ViewController {
136 138
         view.layer?.backgroundColor = palette.pageBackground.cgColor
137 139
     }
138 140
 
141
+    func systemPrefersDarkMode() -> Bool {
142
+        // Use the system-wide appearance setting (not app/window effective appearance).
143
+        // When the key is missing, macOS is in Light mode.
144
+        let global = UserDefaults.standard.persistentDomain(forName: UserDefaults.globalDomain)
145
+        let style = global?["AppleInterfaceStyle"] as? String
146
+        return style?.lowercased() == "dark"
147
+    }
148
+
139 149
     func buildMainLayout() {
140 150
         let splitContainer = NSStackView()
141 151
         splitContainer.translatesAutoresizingMaskIntoConstraints = false