Mac OS X NSUserNotificationCenter通知获取解雇事件/回调

URB*_*URB 14 macos notifications objective-c nsusernotification nsusernotificationcenter

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

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

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

有关OS X更新可用警报的说明,请参阅此图像:

在此输入图像描述

我已搜查这个在互联网上,以及通过通知中心的文档了这个这个为好.

有没有未记录的API?或一些自定义机制检测点击其他(关闭)按钮?

Tim*_*Tim 9

虽然另一个(关闭)按钮显然是要取消通知,但无论其自定义标题指示什么,当用户通过单击关闭按钮解除通知时,没有优雅的方式来获得通知.

但是,您可以执行的操作是监视默认用户通知中心的deliverNotifications属性:只要通知尚未解除,阵列就会包含通知.通知被取消后,阵列将不再包含它.

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

- (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];
                       });
                   });
}
Run Code Online (Sandbox Code Playgroud)

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

在此自定义-notificationHandler:方法中,您可以检查是否已为通知调用NSUserNotificationCenter的didActivateNotification:委托方法.如果没有,用户很可能点击了通知的关闭按钮.

然而,这不是故障保护,因为用户也可能已经解除了通知,即没有点击关闭按钮.