Swift Command Line Tool Not Receiving DistributedNotificationCenter Notifications

558 Views Asked by At

I am trying to create a very basic Swift command-line application that signals to another application using a WebSocket when the macOS UI changes to/from light/dark mode.

For some reason, the command-line tool is not receiving any notifications from DistributedNotificationCenter, in particular, AppleInterfaceThemeChangedNotification. However, running the exact same code in a Cocoa UI app on applicationDidFinishLaunching works perfectly fine.

I found an old Obj-C CLI project on Github that is meant to print out every notification, but that doesn't do anything either. It makes me suspect Apple perhaps changed something, but I cannot seem to find anything online about it. Are there certain Xcode project settings I need to set?

// main.swift

import Foundation

class DarkModeObserver {

    func observe() {
        print("Observing")
        DistributedNotificationCenter.default.addObserver(
            forName: Notification.Name("AppleInterfaceThemeChangedNotification"),
            object: nil,
            queue: nil,
            using: self.interfaceModeChanged(notification:)
        )
    }

    func interfaceModeChanged(notification: Notification) {
      print("Notification", notification)
    }

}

let observer = DarkModeObserver.init()
observer.observe()


RunLoop.main.run()
1

There are 1 best solutions below

0
On BEST ANSWER

I managed to get iTunes notifications working, so it was just the theme change notifications that weren't working. Given this, I suspect Apple only sends the notifications to UI/NSApplication applications. As such, replacing the last 3 lines from above with the following works:

let app = NSApplication.shared

class AppDelegate: NSObject, NSApplicationDelegate {

    func applicationDidFinishLaunching(_ notification: Notification) {
        let observer = DarkModeObserver.init()
        observer.observe()
    }

}

let delegate = AppDelegate()
app.delegate = delegate
app.run()