14

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

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

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

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

在此处输入图像描述

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

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

4

4 回答 4

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];
                       });
                   });
}

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

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

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

于 2014-01-26T15:28:20.007 回答
2

在斯威夫特 3

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

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

于 2017-01-23T17:07:55.377 回答
1

在 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:另请注意,它是检测dismiss事件的方式,可以在几种情况下触发。

  1. 点击otherButton关闭
  2. 点击Clear All通知中心的按钮

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

PS 3:点击actionButton也会触发dismissal回调

于 2016-10-26T08:50:57.207 回答
1

这帮助了我

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
    }
于 2018-01-19T15:49:17.703 回答