繁体   English   中英

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

[英]Mac OS X NSUserNotificationCenter notification get dismiss event/callback

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

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

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

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

在此输入图像描述

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

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

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

但是,您可以执行的操作是监视默认用户通知中心的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];
                       });
                   });
}

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

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

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

在Swift 3中

func userNotificationCenter(_ center: NSUserNotificationCenter, didDismissAlert notification: NSUserNotification) {
        print("dismissed")
    }

这不是NSUserNotificationDelegate一部分,但效果很好

在Swift 2.3中:

func userNotificationCenter(center: NSUserNotificationCenter, didDeliverNotification notification: NSUserNotification) {

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { 
        var notificationStillPresent: Bool
        repeat {
            notificationStillPresent = false
            for nox in NSUserNotificationCenter.defaultUserNotificationCenter().deliveredNotifications {
                if nox.identifier == notification.identifier {
                    notificationStillPresent = true
                    break
                }
            }

            if notificationStillPresent {
                let _ = NSThread.sleepForTimeInterval(0.20)
            }
        } while notificationStillPresent

        dispatch_async(dispatch_get_main_queue()) {
            self.notificationHandlerFor(notification)
        }
    }
}

PS:请注意,这是检测解雇事件的方法,可以在几种情况下触发。

  1. 单击otherButton以关闭
  2. 单击“通知中心”中的“ Clear All按钮

PS 2:如果您使用deliveryRepeatInterval ,比如1分钟, deliveredNotifications数组中有多个通知,而只显示一个。 解雇应触发多次回调。

PS 3:单击actionButton也会触发解雇回调

这帮助了我

func userNotificationCenter(_ center: NSUserNotificationCenter, didActivate notification: NSUserNotification) {
    switch (notification.activationType) {
    case .none:
        print("none CLicked")
        break
    case .actionButtonClicked:
        print("Additional Action Clicked")
        break
    case .contentsClicked:
        print("contents CLicked")
        break
    case .replied:
        print("replied Action Clicked")
        break
    case .additionalActionClicked:
        print("Additional  MENU  Action Clicked")
        break
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM