我有一个从默认 NSNotificationCenter 订阅特定类型通知的应用程序。
在 OSX Lion 上,它工作正常,除了当应用程序失去焦点(另一个应用程序变为活动状态)时,它会停止接收事件。当应用程序获得焦点时,它会再次开始接收事件。该应用程序在以前的 OSX 版本上没有这种行为,它总是会收到通知,即使它不在焦点上也是如此。
我能做些什么来改变这种行为?
谢谢!弥敦道
我有一个从默认 NSNotificationCenter 订阅特定类型通知的应用程序。
在 OSX Lion 上,它工作正常,除了当应用程序失去焦点(另一个应用程序变为活动状态)时,它会停止接收事件。当应用程序获得焦点时,它会再次开始接收事件。该应用程序在以前的 OSX 版本上没有这种行为,它总是会收到通知,即使它不在焦点上也是如此。
我能做些什么来改变这种行为?
谢谢!弥敦道
我知道回答这个问题有点晚了,仍然是为了我的记录,如果有人还在搜索。
我的 OS X 菜单栏应用程序也有同样的问题。我希望该应用程序能够观察所有状态。
原因:
当应用失去焦点时,观察者被暂停。
IE。当应用程序处于非活动状态时,它会调用该方法
-(void)applicationDidResignActive:(NSNotification *)notification
并且默认情况下 NSDistributedNotificationCenter 对象被挂起。
解决方案:我为 NSDistributedNotificationCenter 创建了一个对象
NSDistributedNotificationCenter *center=[NSDistributedNotificationCenter defaultCenter];
然后当应用程序失去焦点时,它调用applicationDidResignActive方法,并在其中通过向setSuspended 方法发送NO使 NSDistributedNotificationCenter 对象从挂起状态重新获得。
-(void)applicationDidResignActive:(NSNotification *)notification
{
[center setSuspended:NO];
}
然后应用程序即使失去焦点也开始观察。
根据NSDistributionNotificationCenter
参考
https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSDistributedNotificationCenter_Class/Reference/Reference.html#//apple_ref/doc/uid/20000396-BCICEHHB
NSApplication 类在应用程序不活动时自动暂停分发通知传递。基于 Application Kit 框架的应用程序应该让 AppKit 管理通知传递的暂停。纯基础程序可能偶尔需要使用此方法。
你可以
设置观察者在暂停NSNotificationSuspensionBehaviorDeliverImmediately
使用时的行为
- (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(NSString *)notificationSender suspensionBehavior:(NSNotificationSuspensionBehavior)suspendedDeliveryBehavior
或deliverImmediately
在发布时设置为 YES
- (void)postNotificationName:(NSString *)notificationName object:(NSString *)notificationSender userInfo:(NSDictionary *)userInfo deliverImmediately:(BOOL)deliverImmediately
在暂停状态下立即发送通知。
并确保您没有定期杀戮distnoted
。我忘记了我有一个旧的启动代理脚本killall distnoted
来避免内存泄漏。
将观察者添加到 NSDistributedNotificationsCenter 时的默认行为似乎已更改为 NSNotificationSuspensionBehaviorCoalesce,当应用程序处于非活动状态时不会发送通知。