在我们的应用程序中,我们以警报样式显示通知中心通知。
显示通知工作正常,当用户通过单击通知或单击操作按钮与通知交互时,我们会得到回调。
但是,我们有兴趣在用户单击通知中的其他按钮时获取回调或事件。我已经看到 MAC OS 在显示其可用更新对话框时会执行此操作。
有关 OS X 更新可用警报的说明,请参阅此图像:
我已经在互联网上搜索了这个,并浏览了通知中心的文档this和this。
是否有任何未记录的 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: 委托方法。如果没有,用户很可能点击了通知的关闭按钮。
但是,这不是故障安全的,因为用户也可能以其他方式关闭了通知,即没有单击关闭按钮。
在斯威夫特 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:另请注意,它是检测dismiss事件的方式,可以在几种情况下触发。
otherButton
关闭Clear All
通知中心的按钮PS 2:如果你正在使用deliveryRepeatInterval
,比如 1 分钟,数组中有多个通知deliveredNotifications
,而只显示一个。解雇应触发多个回调。
PS 3:点击actionButton
也会触发dismissal回调
这帮助了我
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
}