首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取NSUserNotificationCenter的首选项/权限

获取NSUserNotificationCenter的首选项/权限
EN

Stack Overflow用户
提问于 2019-04-25 14:23:22
回答 1查看 411关注 0票数 2

目前,我正在尝试使用目标NSUserNotification中的macOSX (而不是iOS)上的旧的iOS API来设置通知服务。问题是,我需要知道与用户设置的通知相关的系统首选项(最好是在运行时的其余时间),以确定是否实际看到了我的通知。该应用程序旨在以某种方式吸引用户的注意,以保证提醒不会被忽略,所以我想避免的是,在应用程序不知道的情况下,发出的通知不会在屏幕上产生任何声音或图像。如果不允许通知,应用程序应该以其他方式处理它。

我正在macOS 10.14 Mojave机器上工作。我用NSUserNotificationCenter编写的代码在实现shouldDeliver、didActivate等的自定义代理程序中运行得很好。只是目前我假设用户没有在通知中按下"frick“按钮。

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

到目前为止,我一直在努力让它发挥作用:

  • 尝试并查看是否有一个.plist存储这些设置,在特定于用户的库文件夹以及普通库文件夹中。
  • 尝试使用.plist和相关方法查找said .plist。显然我不知道正确的域名。
  • 2012年的这个答案似乎已经过时了,因为我再也找不到机器上的数据库了。可能是因为我使用了mojave机器,或者文件已经转移到其他地方了。
  • 尝试并确定是否可以通过检查委托中的didDeliverNotification、shouldPresentNotification上NSUserNotification的“呈现”属性来主动检查我们的权限。不幸的是,正如NSUserNotificationCenter本身所述,无论首选项是否允许通知,它的行为都是相同的。

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

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-27 16:50:58

在我的系统中(只有macOS高中),您要查找的文件如下:

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

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

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

我能够使用以下代码获得应用程序和设置的列表:

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

注意到:如果你的应用程序被关闭,这是行不通的,因为其他pref文件的访问将被拒绝。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55851604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档