获取 NSUserNotificationCenter 的首选项/权限
Fetch preferences / permissions for NSUserNotificationCenter
我目前正在尝试在 objective c++ 中使用 macOSX(不是 iOS)上的旧 NSUserNotification API 设置通知服务。
问题是我需要知道与用户设置的通知相关的系统首选项(最好是在运行时的其余部分)以确定我的通知是否真的被看到。该应用程序旨在以某种方式引起用户的注意,以确保提醒之类的事情不会被忽视,所以我想避免的事情是发送的通知在没有应用知道。如果不允许通知,应用程序应以其他方式处理它。
我正在使用 macOS 10.14 Mojave 机器。我使用 NSUserNotificationCenter 的整体代码与实现 shouldDeliver、didActivate 等的自定义委托一起工作正常。只是我目前假设用户没有按我的通知上的 "frick off" 按钮。
不幸的是,NSUserNotificationCenter 和相关 类 似乎没有像新的 API (UNUserNotificationCenter) 那样具有确定权限的功能。我已经尝试解决这个问题几个小时了,所以我想知道是否还有其他人找到了解决方案。我不能真正使用新的 API,因为这严格来说是为了向后兼容,以支持可能相当普遍的尚未使用 mojave 的人。
到目前为止我已经尝试让它工作的事情:
尝试查看是否有一个 .plist 存储这些设置的地方,在 User-specific Library 文件夹和通用 Library 文件夹中。
尝试使用 CFPreferencesCopyKeyList 和相关方法找到所述 .plist。显然我真的不知道正确的域名。
This answer 从 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);
注意:如果您的应用程序是沙箱,这将不起作用,因为访问其他类似的 pref 文件将被拒绝。
我目前正在尝试在 objective c++ 中使用 macOSX(不是 iOS)上的旧 NSUserNotification API 设置通知服务。 问题是我需要知道与用户设置的通知相关的系统首选项(最好是在运行时的其余部分)以确定我的通知是否真的被看到。该应用程序旨在以某种方式引起用户的注意,以确保提醒之类的事情不会被忽视,所以我想避免的事情是发送的通知在没有应用知道。如果不允许通知,应用程序应以其他方式处理它。
我正在使用 macOS 10.14 Mojave 机器。我使用 NSUserNotificationCenter 的整体代码与实现 shouldDeliver、didActivate 等的自定义委托一起工作正常。只是我目前假设用户没有按我的通知上的 "frick off" 按钮。
不幸的是,NSUserNotificationCenter 和相关 类 似乎没有像新的 API (UNUserNotificationCenter) 那样具有确定权限的功能。我已经尝试解决这个问题几个小时了,所以我想知道是否还有其他人找到了解决方案。我不能真正使用新的 API,因为这严格来说是为了向后兼容,以支持可能相当普遍的尚未使用 mojave 的人。
到目前为止我已经尝试让它工作的事情:
尝试查看是否有一个 .plist 存储这些设置的地方,在 User-specific Library 文件夹和通用 Library 文件夹中。
尝试使用 CFPreferencesCopyKeyList 和相关方法找到所述 .plist。显然我真的不知道正确的域名。
This answer 从 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);
注意:如果您的应用程序是沙箱,这将不起作用,因为访问其他类似的 pref 文件将被拒绝。