Cocoa 当应用程序在Lion上失去焦点时,NSNotificationCenter观察员停止接收事件

Cocoa 当应用程序在Lion上失去焦点时,NSNotificationCenter观察员停止接收事件,cocoa,osx-lion,nsnotificationcenter,nsnotification,Cocoa,Osx Lion,Nsnotificationcenter,Nsnotification,我有一个应用程序可以从默认的NSNotificationCenter订阅特定类型的通知 在OSX Lion上,它工作正常,只是当应用程序失去焦点(另一个应用程序变为活动状态)时,它停止接收事件。当应用程序获得焦点时,它会再次开始接收事件。 该应用程序在以前版本的OSX上没有这种行为,它总是收到通知,即使在它失去焦点时也是如此 我能做些什么来改变这种行为 谢谢! Nathan将观察者添加到NSDistributedNotificationSceneter时的默认行为似乎已更改为NSNotifica

我有一个应用程序可以从默认的NSNotificationCenter订阅特定类型的通知

在OSX Lion上,它工作正常,只是当应用程序失去焦点(另一个应用程序变为活动状态)时,它停止接收事件。当应用程序获得焦点时,它会再次开始接收事件。 该应用程序在以前版本的OSX上没有这种行为,它总是收到通知,即使在它失去焦点时也是如此

我能做些什么来改变这种行为

谢谢!
Nathan

将观察者添加到NSDistributedNotificationSceneter时的默认行为似乎已更改为NSNotificationSuspensionBehaviorCoaless,即在应用程序处于非活动状态时不发送通知

此处描述:

向NSDistributedNotificationSceneter添加观察者时的默认行为似乎已更改为NSNotificationSuspendionBehaviorCoalSece,在应用程序处于非活动状态时不会发送通知

此处描述:
我知道现在回答这个问题有点晚了,还是为了我的记录,如果有人还在搜索的话

我的OSX菜单栏应用程序也有同样的问题。我希望应用程序能够观察所有状态

原因:

当应用程序失去焦点时,观察者将暂停

即,当应用程序处于活动状态时,它将调用该方法

-(void)applicationDidResignActive:(NSNotification *)notification
默认情况下,NSDistributedNotificationCenter对象将挂起

解决方案: 我为NSDistributedNotificationCenter创建了一个对象

NSDistributedNotificationCenter *center=[NSDistributedNotificationCenter defaultCenter];
然后,当应用程序松开焦点时,调用applicationIDResignative方法和内部 NSDistributedNotificationCenter对象通过向setSuspended方法发送NO从挂起状态恢复

-(void)applicationDidResignActive:(NSNotification *)notification
{
    [center setSuspended:NO];
}

然后应用程序开始观察,即使它失去了焦点。

我知道回答这个问题有点晚了,仍然是为了我的记录,如果有人还在搜索

我的OSX菜单栏应用程序也有同样的问题。我希望应用程序能够观察所有状态

原因:

当应用程序失去焦点时,观察者将暂停

即,当应用程序处于活动状态时,它将调用该方法

-(void)applicationDidResignActive:(NSNotification *)notification
默认情况下,NSDistributedNotificationCenter对象将挂起

解决方案: 我为NSDistributedNotificationCenter创建了一个对象

NSDistributedNotificationCenter *center=[NSDistributedNotificationCenter defaultCenter];
然后,当应用程序松开焦点时,调用applicationIDResignative方法和内部 NSDistributedNotificationCenter对象通过向setSuspended方法发送NO从挂起状态恢复

-(void)applicationDidResignActive:(NSNotification *)notification
{
    [center setSuspended:NO];
}

然后应用程序开始观察,即使它失去了焦点。

根据
NSDistributionNotificationCenter
参考

当应用程序处于非活动状态时,NSApplication类自动挂起分布式通知传递。基于Application Kit框架的应用程序应允许AppKit管理通知传递的暂停。仅基金会项目可能偶尔需要使用此方法

你也可以

使用将暂停时观察者的行为设置为
n通知暂停行为或立即交付

- (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(NSString *)notificationSender suspensionBehavior:(NSNotificationSuspensionBehavior)suspendedDeliveryBehavior
或在过帐时将
立即交付
设置为是

- (void)postNotificationName:(NSString *)notificationName object:(NSString *)notificationSender userInfo:(NSDictionary *)userInfo deliverImmediately:(BOOL)deliverImmediately
在挂起状态下立即发送通知

并确保您没有定期杀死
distnoted

我忘了我有一个旧的launch agent脚本来
killdistnoted
,以避免内存泄漏。

根据
NSDistributionNotificationCenter
参考

当应用程序处于非活动状态时,NSApplication类自动挂起分布式通知传递。基于Application Kit框架的应用程序应允许AppKit管理通知传递的暂停。仅基金会项目可能偶尔需要使用此方法

你也可以

使用将暂停时观察者的行为设置为
n通知暂停行为或立即交付

- (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(NSString *)notificationSender suspensionBehavior:(NSNotificationSuspensionBehavior)suspendedDeliveryBehavior
或在过帐时将
立即交付
设置为是

- (void)postNotificationName:(NSString *)notificationName object:(NSString *)notificationSender userInfo:(NSDictionary *)userInfo deliverImmediately:(BOOL)deliverImmediately
在挂起状态下立即发送通知

并确保您没有定期杀死
distnoted

我忘了我有一个旧的launch agent脚本来
killall distnoted
,以避免内存泄漏。

适用于Mac OS X菜单应用程序,如上所述!如果可以的话,我投了100+的赞成票。谢谢你救了我一天!经过3个小时的测试,最终您的解决方案帮助我理解了为什么我的应用处于非活动状态时无法获得通知。再次感谢!适用于Mac OS X菜单应用程序,如上所述!如果可以的话,我投了100+的赞成票。谢谢你救了我一天!经过3个小时的测试,最终您的解决方案帮助我理解了为什么我的应用处于非活动状态时无法获得通知。再次感谢!