在我们的应用程序中,我们以警报样式显示通知中心通知。
显示通知工作正常,当用户通过单击通知或单击操作按钮与通知交互时我们会收到回调。
但是,我们有兴趣在用户单击通知中的其他按钮时获得回调或事件。我已经看到 MAC OS 在显示其更新可用对话框时执行此操作。
请参阅此图片以了解有关 OS X 更新可用警报的说明:
我已经在互联网上搜索了这个,并浏览了通知中心的文档 this和 this
是否有任何未记录的 API?还是一些检测点击其他(关闭)按钮的自定义机制?
最佳答案
虽然另一个(关闭)按钮显然是为了关闭通知,但不管它的自定义标题可能表示什么,当用户通过单击关闭按钮关闭通知时,没有优雅的方式来获得通知。
但是,您可以做的是监视默认用户通知中心的 deliveredNotifications 属性:只要通知尚未解除,该数组就会包含该通知。一旦通知被解除,数组将不再包含它。
这可以在 NSUserNotificationCenter 委托(delegate)方法中实现,如下所示:
- (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 方法是否已被调用用于通知。如果没有,用户很可能点击了通知的关闭按钮。
但这不是故障安全,因为用户也可能以其他方式关闭了通知,即没有点击关闭按钮。
关于objective-c - Mac OS X NSUserNotificationCenter 通知获取取消事件/回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21110714/