【问题标题】:Programmatically check state of do not disturb on OS X以编程方式检查 OS X 上的请勿打扰状态
【发布时间】:2014-10-11 05:34:34
【问题描述】:

使用 Objective-C,我如何以编程方式检查 OS X 上系统“请勿打扰”设置的状态?我可以使用 hack 或私有 API,因为我不需要提交到 Mac App Store。

【问题讨论】:

标签: objective-c macos cocoa


【解决方案1】:

您可以(并且应该)简单地使用 UserDefaults:

let theDefaults = UserDefaults(suiteName: "com.apple.notificationcenterui")
print(theDefaults?.bool(forKey: "doNotDisturb"))

对于时间控制的切换,您应该检查一天中的分钟是否介于 dndStartdndEnd 之间:

let theDefaults = UserDefaults(suiteName: "com.apple.notificationcenterui")
let theDate = Date()
let theCalendar = Calendar.current

let theHour = calendar.component(.hour, from: theDate)
let theMinute = calendar.component(.minute, from: theDate)
let theMinuteOfDay = Double(theHour * 60 + theMinute)

if theMinuteOfDay >= theDefaults.double(forKey: "dndStart") && 
    theMinuteOfDay <= theDefaults.double(forKey: "dndEnd") {
    // ...
}

【讨论】:

  • 它在 Catalina 也适用于我。您可能应该检查键 dndStartdndEnd 进行时间控制切换。
  • 感谢您的及时响应,莫名其妙,根本不工作。尝试了 dndStart / dndEnd / doNotDisturb,还尝试了 CFPreferencesCopyValue 变体,看看是否能帮到我。没有。然而,如果我在终端上尝试这个,它会起作用。会不会和沙盒有关?
  • 如果我打印出分配的NSUserDefaults的dictionaryRepresentation,我可以看到几十个键/值但与DND无关。
  • 是的,沙盒肯定是个问题。
  • 这不再适用于大苏尔。 last-analytics-stampcom.apple.notificationcenterui 中的唯一条目,与 DnD 设置无关。
【解决方案2】:

This answer 描述了如何使用命令行读取和写入请勿打扰的状态。

请注意,文件名包含您 Mac 的硬件 UUID。为简单起见,它在下面的代码中是一个常量。您可以使用内置的 系统信息 应用程序找出答案。 还有不同的方式可以通过编程方式获取,like this,我还没试过。

使用Swiftplist文件的内容可以读取为NSDictionary,如下:

import Foundation

// Get path to file
let uuid = "00000000-0000-0000-0000-000000000000"
let filepath = "~/Library/Preferences/ByHost/com.apple.notificationcenterui.\(uuid).plist".stringByExpandingTildeInPath

// Load file as `NSDictionary`
if let dict = NSDictionary(contentsOfFile: filepath) {

    // Get state of Do Not Disturb
    let doNotDisturbState = dict["doNotDisturb"] as? Bool
    println(doNotDisturbState)
}

当我测试它时,有时 plist 文件的内容需要几秒钟才能更新,因此您不会在更改后立即获得新状态。

【讨论】:

  • 你知道这个方法的必要沙箱异常是什么吗?
  • 你不应该直接通过文件访问用户默认值,因为 macOS 使用服务来管理。因此,文件的内容和NSUserDefaultsvalueForKey的答案可能会有所不同。
【解决方案3】:

在 Objective-C 中,您可以像这样访问值:

NSUserDefaults* defaults = [[NSUserDefaults alloc]initWithSuiteName:@"com.apple.notificationcenterui"];
BOOL dnd = [defaults boolForKey:@"doNotDisturb"];

【讨论】:

  • 这不再适用于大苏尔。 last-analytics-stampcom.apple.notificationcenterui 中的唯一条目,与 DnD 设置无关。
【解决方案4】:

斯威夫特 4

UserDefaults(suiteName: "com.apple.notificationcenterui")?.bool(forKey: "doNotDisturb")

【讨论】:

  • 它总是返回 false
  • 有区别 A) 通过 Preferences>Notifications 安排的 DND,B) 在右侧通知区域手动打开 DND(向上滚动以显示 DND 开关)。 B) 变体可能被正确检测到,但 A) 变体可能被忽略。
猜你喜欢
  • 2015-10-01
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
相关资源
最近更新 更多