我目前正在尝试使用目标c ++中的macOSX(而不是iOS)上的旧NSUserNotification API来设置通知服务。问题是,我需要知道与用户设置的通知相关联的系统首选项(并且最好在运行时的其余时间),以确定我的通知是否实际可见。该应用程序旨在以某种方式吸引用户注意,以保证提醒不会被忽视,所以我想避免的是一个通知,无论如何没有产生任何声音和图像申请知道。如果不允许通知,则应用程序应以其他方式处理它。
我正在使用macOS 10.14 Mojave机器。我使用NSUserNotificationCenter的整体代码与一个实现了shouldDeliver,didActivate等的自定义Delegate一起工作正常。我只是假设用户没有按下我的通知上的“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
这将对应于kCFPreferencesCurrentUser
和kCFPreferencesAnyHost
的组合。 (有关记录,kCFPreferencesCurrentUser
+ kCFPreferencesCurrentHost
等同于~/Library/Preferences/ByHost/
文件夹中的pref文件)。
我认为任何设置都不会存储在本地域中(我的意思是在root / Library / Preferences /文件夹中)。
我能够使用以下代码获取应用程序和设置列表:
[[NSUserDefaults standardUserDefaults] addSuiteNamed:@"com.apple.ncprefs"];
NSArray *apps = [[NSUserDefaults standardUserDefaults] objectForKey:@"apps"];
NSLog(@"[%@ %@] apps == %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), apps);
注意:如果您的应用程序是沙盒,这将无效,因为将拒绝访问其他类似的pref文件。