gpt4 book ai didi

objective-c - 获取 NSUserNotificationCenter 的首选项/权限

转载 作者:行者123 更新时间:2023-12-03 17:18:34 24 4
gpt4 key购买 nike

我目前正在尝试使用旧的 NSUserNotification 设置通知服务macOSX(非 iOS)上的 API,采用 Objective C++。问题是我需要知道与用户设置的通知相关的系统首选项(最好也是在运行时的其余时间)以确定我的通知是否确实被看到。该应用程序旨在以某种方式引起用户的注意,以保证诸如提醒之类的事情不会被忽视,因此我想要避免的是,在没有通知的情况下,默默地不会在屏幕上产生任何声音或图像的通知。应用知道。如果不允许通知,应用程序应该以其他方式处理它。

我正在使用 macOS 10.14 Mojave 计算机。我的 NSUserNotificationCenter 整体代码与实现 shouldDeliver、didActivate 等的自定义委托(delegate)配合得很好。只是我目前假设用户没有按下我的通知上的“frick off”按钮。

不幸的是,NSUserNotificationCenter 和相关类似乎没有像新 API ( UNUserNotificationCenter ) 那样确定权限的函数。我已经尝试解决这个问题几个小时了,所以我想知道是否有其他人找到了解决方案。我无法真正使用新的 API,因为这严格是为了向后兼容,以支持可能相当普遍的尚未使用 mojave 的用户。

到目前为止我已经尝试让它发挥作用的事情:

  • 尝试看看在用户特定的库文件夹以及通用库文件夹中是否有存储这些设置的 .plist。

  • 尝试使用 CFPreferencesCopyKeyList 和相关方法查找所述 .plist。显然我真的不知道正确的域名。

  • This answer从 2012 年开始,它似乎已经过时了,因为我无法再在我的计算机上找到该数据库。可能是因为我使用 Mojave 机器,或者该文件已移动到其他地方。

  • 尝试确定我们是否可以通过检查委托(delegate)中 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

这对应于 kCFPreferencesCurrentUserkCFPreferencesAnyHost 的组合。 (郑重声明,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);

注意:如果您的应用被沙盒化,则此操作将不起作用,因为对其他类似的首选项文件的访问将被拒绝。

关于objective-c - 获取 NSUserNotificationCenter 的首选项/权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55851604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com