Подтвердить что ты не робот

NSUserNotificationCenter отклонить уведомление

Я пытаюсь использовать новый NSUserNotificationCenter Mountain Lion для моего приложения (что на самом деле не так сложно). Почтовые уведомления работают как прелесть через

NSUserNotification *userNotification = [[NSUserNotification alloc] init];
userNotification.title = @"Some title";
userNotification.informativeText = @"Some text";

[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:userNotification];

Тем не менее, я хотел бы отклонить все уведомления, которые отображаются на экране после того, как приложение получит фокус. Например. как это делает приложение "Новые сообщения". Когда новые сообщения принимаются в фоновом режиме, отображаются уведомления. Когда приложение снова активируется, они автоматически отключаются и исчезают с экрана и из Центра уведомлений.

Чтобы воспроизвести это, я зарегистрировал метод для уведомления NSApplicationDidBecomeActiveNotification, которое также получило название успешно. Там я вызываю [NSUserNotificationCenter defaultUserNotificationCenter] removeAllDeliveredNotifications].

Это, однако, приводит к тому, что уведомления, которые были собраны в Центре уведомлений, удаляются, а соответствующие "пузырьки", отображаемые в верхнем правом углу, все еще отображаются.

Итерация всех отправленных уведомлений и их удаление каждый из них имеет точно такой же эффект, что и использование scheduleNotification вместо deliverNotification.

Я один из тех, кто это испытывает, или мне не хватает чего-то, чтобы программно отказаться от части экрана и части Центра уведомлений?

4b9b3361

Ответ 1

Приложение "Сообщения", вероятно, использует частный метод NSUserNotificationCenter _removeAllDisplayedNotifications или _removeDisplayedNotification:.

Вы можете попробовать использовать эти методы, чтобы проверить, действительно ли это то, что вы ищете. Просто добавьте этот интерфейс категории, чтобы объявить методы:

@interface NSUserNotificationCenter (Private)
- (void)_removeAllDisplayedNotifications;
- (void)_removeDisplayedNotification:(NSUserNotification *)notification;
@end

К сожалению, поскольку это недокументированные методы, вы не можете использовать их в приложении, распространяемом через App Store. Если это действительно то, что вы ищете, тогда вы должны указать ошибку и попросить эти методы стать частью общедоступного API.

Ответ 2

Начиная с 10.9, следующие методы удаляют любые отображаемые уведомления:

// Clear a delivered notification from the notification center. If the 
// notification is not in the delivered list, nothing happens.
- (void)removeDeliveredNotification:(NSUserNotification *)notification;

// Clear all delivered notifications for this application from the 
// notification center.
- (void)removeAllDeliveredNotifications;

Похоже, что поведение изменилось с 10.8, так как любые отображаемые уведомления удаляются также при вызове этих методов (спасибо @0xced для уточнения).

Ответ 3

removeDeliveredNotification удаляет отображаемое уведомление для меня (по 10.11), необходимо указать оговорку identifier в уведомлении.