以编程方式检查 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"))
对于时间控制的切换,您应该检查一天中的分钟是否介于 dndStart
和 dndEnd
之间:
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 也适用于我。您可能应该检查键dndStart
和 dndEnd
进行时间控制切换。
感谢您的及时响应,莫名其妙,根本不工作。尝试了 dndStart / dndEnd / doNotDisturb,还尝试了 CFPreferencesCopyValue
变体,看看是否能帮到我。没有。然而,如果我在终端上尝试这个,它会起作用。会不会和沙盒有关?
如果我打印出分配的NSUserDefaults的dictionaryRepresentation,我可以看到几十个键/值但与DND无关。
是的,沙盒肯定是个问题。
这不再适用于大苏尔。 last-analytics-stamp
是 com.apple.notificationcenterui
中的唯一条目,与 DnD 设置无关。【参考方案2】:
This answer 描述了如何使用命令行读取和写入请勿打扰的状态。
请注意,文件名包含您 Mac 的硬件 UUID。为简单起见,它在下面的代码中是一个常量。您可以使用内置的 系统信息 应用程序找出答案。 还有不同的方式可以通过编程方式获取,like this,我还没试过。
使用Swift,plist文件的内容可以读取为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 使用服务来管理。因此,文件的内容和NSUserDefaults
valueForKey
的答案可能会有所不同。【参考方案3】:
在 Objective-C 中,您可以像这样访问值:
NSUserDefaults* defaults = [[NSUserDefaults alloc]initWithSuiteName:@"com.apple.notificationcenterui"];
BOOL dnd = [defaults boolForKey:@"doNotDisturb"];
【讨论】:
这不再适用于大苏尔。last-analytics-stamp
是 com.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 上的请勿打扰状态的主要内容,如果未能解决你的问题,请参考以下文章