获取 NSUserNotificationCenter 的首选项/权限

Fetch preferences / permissions for NSUserNotificationCenter

我目前正在尝试在 objective c++ 中使用 macOSX(不是 iOS)上的旧 NSUserNotification API 设置通知服务。 问题是我需要知道与用户设置的通知相关的系统首选项(最好是在运行时的其余部分)以确定我的通知是否真的被看到。该应用程序旨在以某种方式引起用户的注意,以确保提醒之类的事情不会被忽视,所以我想避免的事情是发送的通知在没有应用知道。如果不允许通知,应用程序应以其他方式处理它。

我正在使用 macOS 10.14 Mojave 机器。我使用 NSUserNotificationCenter 的整体代码与实现 shouldDeliver、didActivate 等的自定义委托一起工作正常。只是我目前假设用户没有按我的通知上的 "frick off" 按钮。

不幸的是,NSUserNotificationCenter 和相关 类 似乎没有像新的 API (UNUserNotificationCenter) 那样具有确定权限的功能。我已经尝试解决这个问题几个小时了,所以我想知道是否还有其他人找到了解决方案。我不能真正使用新的 API,因为这严格来说是为了向后兼容,以支持可能相当普遍的尚未使用 mojave 的人。

到目前为止我已经尝试让它工作的事情:

我试过的一些代码包括:

CFPreferencesCopyKeyList((CFStringRef) @"com.apple.systemPreferences.plist", kCFPreferencesCurrentUser, kCFPreferencesCurrentHost);

CFPreferencesCopyKeyList((CFStringRef) @"com.apple.systemPreferences.plist", kCFPreferencesAnyUser, kCFPreferencesAnyHost);

//Unfortunately returns null with any combination of com.apple.notificationcenter.plist, kCFPreferencesCurrentUser, kCFPreferencesCurrentHost
CFPreferencesCopyKeyList((CFStringRef) @"com.apple.notificationcenter", kCFPreferencesAnyUser, kCFPreferencesAnyHost);

在我的系统(仅限 macOS High Sierra)上,您要查找的文件似乎是:

~/Library/Preferences/com.apple.ncprefs.plist

这将对应于 kCFPreferencesCurrentUserkCFPreferencesAnyHost 的组合。 (为了记录,kCFPreferencesCurrentUser + kCFPreferencesCurrentHost 等同于 ~/Library/Preferences/ByHost/ 文件夹中的 pref 文件)。

我认为任何设置都不会存储在本地域中(我的意思是在根 /Library/Preferences/ 文件夹中)。

我能够使用以下代码获取应用和设置列表:

[[NSUserDefaults standardUserDefaults] addSuiteNamed:@"com.apple.ncprefs"];
NSArray *apps = [[NSUserDefaults standardUserDefaults] objectForKey:@"apps"];
NSLog(@"[%@ %@] apps == %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), apps);

注意:如果您的应用程序是沙箱,这将不起作用,因为访问其他类似的 pref 文件将被拒绝。