以编程方式检查 OS X 上的请勿打扰状态

Posted

技术标签:

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

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

【问题讨论】:

你有什么解决办法吗?如果是这样,请发布它,我非常需要它。 一直没找到解决办法,我放弃了 这适用于swift github.com/sindresorhus/do-not-disturb中的所有用例 apple.stackexchange.com/questions/419207/… 【参考方案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) 变体可能被忽略。

以上是关于以编程方式检查 OS X 上的请勿打扰状态的主要内容,如果未能解决你的问题,请参考以下文章

Android:检测请勿打扰状态?

以编程方式配置 Mac OS X MIDI

在 OS X 上以编程方式打开通知中心

以编程方式录制声音发送到内置输出,Mac OS X

以编程方式检查 Fire OS 版本

在夜间阻止 Android 通知