在我们的应用中,我们以警报方式显示通知中心通知。
显示通知正常,当用户通过单击通知或单击“操作”按钮与通知进行交互时,我们会收到回调。
但是,当用户点击通知中的其他按钮时,我们有兴趣获得回调或事件。我看到MAC OS在显示其可用更新对话框时执行此操作。
有关OS X更新可用警报的说明,请参阅此图像:
我通过互联网搜索过此内容,并通过了通知中心的文档this和this。
是否有任何未记录的API?或一些自定义机制检测点击其他(关闭)按钮?
答案 0 :(得分: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:delegate方法。如果没有,用户很可能点击了通知的关闭按钮。
但是,这不是故障保护,因为用户也可能已经解除了通知,即没有点击关闭按钮。答案 1 :(得分:2)
在Swift 3中
func userNotificationCenter(_ center: NSUserNotificationCenter, didDismissAlert notification: NSUserNotification) {
print("dismissed")
}
这不是NSUserNotificationDelegate
的一部分,但效果很好
答案 2 :(得分: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:请注意,这是检测解雇事件的方法,可以在几种情况下触发。
otherButton
取消 PS 2:如果您使用Clear All
,比如说1分钟,deliveryRepeatInterval
数组中会有多个通知,而只显示一个。解雇将触发多次回调。
PS 3:点击deliveredNotifications
也会触发解雇回调
答案 3 :(得分: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
}