获取NSUserNotificationCenter的首选项/权限

问题描述 投票:1回答:1

我目前正在尝试使用目标c ++中的macOSX(而不是iOS)上的旧NSUserNotification API来设置通知服务。问题是,我需要知道与用户设置的通知相关联的系统首选项(并且最好在运行时的其余时间),以确定我的通知是否实际可见。该应用程序旨在以某种方式吸引用户注意,以保证提醒不会被忽视,所以我想避免的是一个通知,无论如何没有产生任何声音和图像申请知道。如果不允许通知,则应用程序应以其他方式处理它。

我正在使用macOS 10.14 Mojave机器。我使用NSUserNotificationCenter的整体代码与一个实现了shouldDeliver,didActivate等的自定义Delegate一起工作正常。我只是假设用户没有按下我的通知上的“frick off”按钮。

不幸的是,NSUserNotificationCenter和相关类似乎没有一个功能,它以新API(UNUserNotificationCenter)的方式确定权限。我一直试图解决这个问题几个小时,所以我想知道是否有其他人找到了解决方案。我不能真正使用新的API,因为这是严格的后向兼容性,有利于可能相当普遍的人不使用mojave。

到目前为止,我试图让它成功的事情:

  • 尝试查看存储这些设置的某个.plist,在User-specific Library文件夹以及General Library文件夹中。
  • 尝试使用CFPreferencesCopyKeyList和相关方法找到所述.plist。显然我真的不知道正确的域名。
  • 2012年的This answer似乎已经过时,因为我无法在我的机器上找到数据库。可能是因为我使用莫哈韦沙漠机器,或者文件已经移动到其他地方。
  • 尝试并确定我们是否可以通过在委托中的didDeliverNotification,shouldPresentNotification上检查NSUserNotification的“present”属性来追溯检查我们的权限。不幸的是,如NSUserNotificationCenter本身所述,无论首选项是否允许通知,它仍然表现相同。

我试过的一些代码包括以下内容:

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-c cocoa nsnotificationcenter
1个回答
0
投票

在我的系统上(只有macOS High Sierra),它看起来像你所追求的文件是:

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

这将对应于kCFPreferencesCurrentUserkCFPreferencesAnyHost的组合。 (有关记录,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文件。

© www.soinside.com 2019 - 2024. All rights reserved.