Swift 命令行工具未接收 DistributedNotificationCenter 通知

Posted

技术标签:

【中文标题】Swift 命令行工具未接收 DistributedNotificationCenter 通知【英文标题】:Swift Command Line Tool Not Receiving DistributedNotificationCenter Notifications 【发布时间】:2019-12-11 01:21:23 【问题描述】:

我正在尝试创建一个非常基本的 Swift 命令行应用程序,当 macOS UI 更改为/从亮/暗模式时,该应用程序使用 WebSocket 向另一个应用程序发出信号。

由于某种原因,命令行工具没有收到来自DistributedNotificationCenter,尤其是AppleInterfaceThemeChangedNotification任何通知。但是,在 applicationDidFinishLaunching 上的 Cocoa UI 应用程序中运行完全相同的代码可以正常工作。

我找到了一个old Obj-C CLI project on Github,它旨在打印出每个通知,但这也没有任何作用。这让我怀疑苹果可能改变了一些东西,但我似乎在网上找不到任何关于它的东西。我需要设置某些 Xcode 项目设置吗?

// 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】:

我设法让 iTunes 通知正常工作,所以只是主题更改通知不工作。鉴于此,我怀疑 Apple 只会将通知发送到 UI/NSApplication 应用程序。因此,将上面的最后 3 行替换为以下作品:

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()

【讨论】:

以上是关于Swift 命令行工具未接收 DistributedNotificationCenter 通知的主要内容,如果未能解决你的问题,请参考以下文章

在命令行工具中获取资源路径

在 Swift 中使用命令行工具更新当前行

用 Swift 编写的工程代码静态分析命令行工具 smck

如何从 OSX Swift 命令行工具或 shebang 脚本文件显示窗口?

Xcode GM:OS X 命令行工具项目没有 swift 语言?

设置 Swift 可执行命令行工具的版本号