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
.
Я один из тех, кто это испытывает, или мне не хватает чего-то, чтобы программно отказаться от части экрана и части Центра уведомлений?
Ответы
Ответ 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
в уведомлении.