Получить настройки / разрешения для NSUserNotificationCenter - PullRequest
1 голос
/ 25 апреля 2019

В настоящее время я пытаюсь настроить службу уведомлений, используя старый NSUserNotification API на macOSX (не iOS) в цели c ++.Суть в том, что мне нужно знать системные настройки, связанные с уведомлениями, которые пользователь установил (и, желательно, во время остальной части времени выполнения), чтобы определить, действительно ли мои уведомления видны.Приложение предназначено для того, чтобы привлечь внимание пользователей таким образом, чтобы гарантировать, что такие вещи, как напоминания, не останутся незамеченными, поэтому я хочу избегать уведомления, которое беззвучно не производит ни звука, ни изображения на экране безЗнание приложения.Если уведомление не разрешено, приложение должно обработать его другим способом.

Я работаю на компьютере MacOS 10.14 Mojave.Мой общий код с NSUserNotificationCenter прекрасно работает с пользовательским Делегатом, который реализует shouldDeliver, didActivate и т. Д. Просто я предполагаю, что пользователь не нажимает кнопку «frick off» в моих уведомлениях.

К сожалению, NSUserNotificationCenterи связанные классы, по-видимому, не имеют функции, которая определяет разрешения, как новый API ( UNUserNotificationCenter ).Я пытался решить эту проблему в течение нескольких часов, поэтому мне было интересно, нашел ли кто-нибудь еще решение для этого.Я не могу по-настоящему использовать новый API, поскольку он предназначен исключительно для обратной совместимости в пользу, возможно, довольно распространенного количества людей, которые еще не используют mojave.

Вещи, которые я пытался заставить его работать такfar:

  • Попробуйте и посмотрите, есть ли где-нибудь список .plist, где хранятся эти настройки, в папке User-specific Library, а также в общей папке Library.

  • Попробуйте найти указанный .plist с помощью CFPreferencesCopyKeyList и связанных с ним методов.Очевидно, я не знаю правильного доменного имени.

  • Этот ответ от 2012 года, который, кажется, устарел, поскольку я больше не могу найти базу данных на своем компьютере.Возможно, это из-за того, что я использую мохаве, или файл с тех пор переместился куда-то еще.

  • Попробуйте определить, можем ли мы ретроактивно проверить наши разрешения, проверив NSUserNotification, «представленный»свойство на didDeliverNotification, долженPresentNotification в делегате.К сожалению, как указано в самом 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);

1 Ответ

0 голосов
/ 27 апреля 2019

В моей системе (только macOS High Sierra) выглядит файл, который вы ищете:

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

Это соответствует комбинации kCFPreferencesCurrentUserkCFPreferencesAnyHost.(Для записи, kCFPreferencesCurrentUser + kCFPreferencesCurrentHost соответствует pref-файлам в папке ~/Library/Preferences/ByHost/).

Я не думаю, что какие-либо настройки будут храниться в локальном домене (я имею в виду вroot / Library / Preferences / folder).

Мне удалось получить список приложений и настроек, используя следующий код:

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

ПРИМЕЧАНИЕ : этоне будет работать, если ваше приложение помещено в sanbox, так как доступ к другим таким преф-файлам будет закрыт.

...