objective-c - Mac OS X NSUserNotificationCenter 通知获取取消事件/回调

标签 objective-c macos notifications nsusernotification nsusernotificationcenter

在我们的应用程序中,我们以警报样式显示通知中心通知。

显示通知工作正常,当用户通过单击通知或单击操作按钮与通知交互时我们会收到回调。

但是,我们有兴趣在用户单击通知中的其他按钮时获得回调或事件。我已经看到 MAC OS 在显示其更新可用对话框时执行此操作。

请参阅此图片以了解有关 OS X 更新可用警报的说明:

enter image description here

我已经在互联网上搜索了这个,并浏览了通知中心的文档 thisthis

是否有任何未记录的 API?还是一些检测点击其他(关闭)按钮的自定义机制?

最佳答案

虽然另一个(关闭)按钮显然是为了关闭通知,但不管它的自定义标题可能表示什么,当用户通过单击关闭按钮关闭通知时,没有优雅的方式来获得通知。

但是,您可以做的是监视默认用户通知中心的 deliveredNotifications 属性:只要通知尚未解除,该数组就会包含该通知。一旦通知被解除,数组将不再包含它。

这可以在 NSUserNotificationCenter 委托(delegate)方法中实现,如下所示:

- (void)userNotificationCenter:(NSUserNotificationCenter *)center didDeliverNotification:(NSUserNotification *)notification
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0),
                   ^{
                       BOOL notificationStillPresent;
                       do {
                           notificationStillPresent = NO;
                           for (NSUserNotification *nox in [[NSUserNotificationCenter defaultUserNotificationCenter] deliveredNotifications]) {
                               if ([nox.identifier isEqualToString:notification.identifier]) notificationStillPresent = YES;
                           }
                           if (notificationStillPresent) [NSThread sleepForTimeInterval:0.20f];
                       } while (notificationStillPresent);
                       dispatch_async(dispatch_get_main_queue(), ^{
                           [self notificationHandlerForNotification:notification];
                       });
                   });
}

此代码将每 200 毫秒检查一次通知是否仍然存在。一旦它消失了,-notificationHandler: 方法将在主线程上被调用,这只是一个任意的回调方法。

在这个自定义的 -notificationHandler: 方法中,您可以检查 NSUserNotificationCenter 的 didActivateNotification: delegate 方法是否已被调用用于通知。如果没有,用户很可能点击了通知的关闭按钮。

但这不是故障安全,因为用户也可能以其他方式关闭了通知,即没有点击关闭按钮。

关于objective-c - Mac OS X NSUserNotificationCenter 通知获取取消事件/回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21110714/

相关文章:

ios - NSDictionary 变成 NSCFString

android - 是否可以将通知从抬头移动到状态栏?

java - Android Wear 通知与 MediaSession

android - 如何在指定时间内为某些用户更改 Firebase 主题?

objective-c - 如何在 NSMutableArray 中存储两个字段?

objective-c - UISlider,设置不同范围的图片

objective-c - 在基于 block 的 API 中使用可空性

macos - 目录 bb101 repo-practice 在哪里

xcode - 轻松构建与 MacPorts 捆绑的 Mac OS X .app

xcode - 如何在 Xcode 8.2.1 中构建 Safari Extension Companion?模板丢失