首页 > 解决方案 > 获取 NSUserNotificationCenter 的首选项/权限

问题描述

我目前正在尝试在目标 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);

标签: objective-ccocoansnotificationcenter

解决方案


在我的系统(仅限 macOS High Sierra)上,您要的文件看起来是:

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

这将对应于 和 的kCFPreferencesCurrentUser组合kCFPreferencesAnyHost。(为了记录,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);

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


推荐阅读