如何观察来自其他应用程序的通知?

时间:2015-05-02 08:19:17

标签: objective-c macos cocoa foundation airserver

我希望在某个应用程序触发事件时收到通知。我不是Objective-C开发人员,也不了解OS X API - 所以我希望这个问题不是太基础。

我的目标是将当前正在播放的歌曲的元信息写入日志文件。对于iTu​​nes,我使用了以下Objective-C行:

[[NSDistributedNotificationCenter defaultCenter]
 addObserver: myObserver selector: @selector(observeNotification:)
 name: @"com.apple.iTunes.playerInfo" object:nil];

但是,我也需要AirServer(这是一个软件AirPlay接收器)。不幸的是,以下不起作用 - 观察者永远不会被调用:

[[NSDistributedNotificationCenter defaultCenter]
 addObserver: myObserver selector: @selector(observeNotification:)
 name: @"com.pratikkumar.airserver-mac" object:nil];

显然,AirServer不会发送这些类型的通知。但是,当新歌开始播放时,通知中心会收到通知。

我的下一步是定期检查OS X通知中心中的新通知(如下所述:https://stackoverflow.com/a/25930769/1387396)。这不是太干净 - 所以我的问题是:在这种特殊情况下还有另一种选择吗?

1 个答案:

答案 0 :(得分:1)

首先,您必须了解NSDistributedNotificationCenter中包含Notification字样;它不相关。从About Local Notifications and Remote Notifications,它确实声明:

  

注意:远程通知和本地通知与广播通知(NSNotificationCenter)或键值观察通知无关。

那么,那时候,我将从NSDistributedNotificationCenter的角度回答,而不是关于远程/本地通知 - 你已经在你为观察DB文件链接的答案中找到了一个潜在的解决方案以这种方式包含通知记录。

您需要做的第一件事就是听取正确的通知。创建一个侦听所有事件的简单应用程序;例如使用:

NSDistributedNotificationCenter *center = [NSDistributedNotificationCenter defaultCenter];
[center addObserver:self
           selector:@selector(notificationEvent:)
               name:nil
             object:nil];


-(void)notificationEvent:(NSNotification *)notif {
    NSLog(@"%@", notif);
}

表示通知为:

__CFNotification 0x6100000464b0 {name = com.airserverapp.AudioDidStart; object = com.pratikkumar.airserver-mac; userInfo = {
    ip = "2002:d55e:dbb2:1:10e0:1bfb:4e81:b481";
    remote = YES;
}}
__CFNotification 0x618000042790 {name = com.airserverapp.AudioDidStop; object = com.pratikkumar.airserver-mac; userInfo = {
    ip = "2002:d55e:dbb2:1:10e0:1bfb:4e81:b481";
    remote = YES;
}}

这表示name来电中的addObserver参数应为com.airserverapp.AudioDidStartcom.airserverapp.AudioDidStop

您可以使用这样的代码来确定所有通知,这样您就可以在需要特定观察者时添加相关的观察者。这可能是观察此类通知的最简单方法。