objective-c - 获取 NSUserNotificationCenter 的首选项/权限
问题描述
我目前正在尝试在目标 c++ 中使用 macOSX(不是 iOS)上的旧NSUserNotification API 设置通知服务。问题是我需要知道与用户设置的通知相关的系统偏好(最好在运行时的剩余时间里),以确定是否真的看到了我的通知。该应用程序旨在以某种方式引起用户的注意,以保证提醒之类的事情不会被忽视,所以我要避免的是在没有应用知道。如果不允许通知,应用程序应该以其他方式处理它。
我正在使用 macOS 10.14 Mojave 机器。我使用 NSUserNotificationCenter 的整体代码可以与实现 shouldDeliver、didActivate 等的自定义委托正常工作。只是我目前假设用户没有按下通知上的“frick off”按钮。
不幸的是, NSUserNotificationCenter 和相关类似乎没有像新 API ( UNUserNotificationCenter ) 那样确定权限的功能。我一直在尝试解决这个问题几个小时,所以我想知道是否有其他人找到了解决方案。我不能真正使用新的 API,因为这完全是为了向后兼容,有利于可能相当普遍的不使用 mojave 的人。
到目前为止,我试图让它发挥作用的事情:
尝试查看存储这些设置的某个地方是否有 .plist,在用户特定的库文件夹以及通用库文件夹中。
尝试使用 CFPreferencesCopyKeyList 和相关方法找到所说的 .plist。显然我真的不知道正确的域名。
这个 2012 年的答案似乎已经过时,因为我无法再在我的机器上找到数据库了。可能是因为我使用了 mojave 机器,或者文件已经移动到其他地方。
尝试确定我们是否可以通过检查委托中的 didDeliverNotification 和 shouldPresentNotification 上的 NSUserNotification 的“presented”属性来追溯检查我们的权限。不幸的是,正如 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);
解决方案
在我的系统(仅限 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 文件将被拒绝。
推荐阅读
- reactjs - 在 Gatsby 中将 HTTP 流量重定向到 HTTPS
- python - 如何在某些坐标上将多个图像叠加到基础图像上?
- python - 为什么我的 for 循环会覆盖我以前在字典中的值?(python3)
- java - 控制台只显示文件的文件名和内容,而不是只显示内容
- macos - 反复用透明黑色绘制的褪色图形在莫哈韦停止工作
- caching - 主屏幕添加 (A2H) 是否曾经是浏览器在存储空间不足时推迟 PWA 缓存清除的信号?
- python - 使用 matplotlib LineCollection,不显示特定坐标的线
- python - Python套接字数据未发送
- python - 如何使用 Python 检查数据是否在 CSV 文件中
- wordpress - 查询帖子只显示1