gpt4 book ai didi

objective-c - 如何观察来自不同应用程序的通知?

转载 作者:行者123 更新时间:2023-12-03 17:02:14 24 4
gpt4 key购买 nike

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

我的目标是将当前播放歌曲的元信息写入日志文件。对于 iTunes,我使用以下 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)。但这不是太干净,所以我的问题是:在这种特殊情况下还有其他选择吗?

最佳答案

Catalina silently changed the addObserver behavior - you can no longer use a nil value for the name to observe all notifications - you have to pass in a name. This makes discovery of event names more difficult.

首先你要明白,虽然NSDistributedNotificationCenter里面有Notification这个词;这不相关。来自 About Local Notifications and Remote Notifications ,它确实指出:

Note: Remote notifications and local notifications are not related to broadcast notifications (NSNotificationCenter) or key-value observing notifications.

因此,在这一点上,我将从 NSDistributedNotificationCenter 的角度来回答,而不是从远程/本地通知的角度来回答 - 您在链接的答案中已经有了一个潜在的解决方案,用于观察包含这种方式的通知记录的数据库文件。

由于 API 行为发生变化,此示例代码无法在 Catalina (10.15) 上运行

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

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

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

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

关于objective-c - 如何观察来自不同应用程序的通知?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30000016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com