NSNotificationCenter Observer прекращает получать события, когда приложение не в фокусе на Lion - PullRequest
1 голос
/ 15 ноября 2011

У меня есть приложение, которое подписывается на определенный вид уведомлений из NSNotificationCenter по умолчанию.

В OSX Lion оно работает нормально, за исключением того, что когда приложение теряет фокус (другое приложение становится активным), оноперестает получать события.Когда приложение получает фокус, оно снова начинает получать события.Приложение не имело такого поведения в предыдущих версиях OSX, оно всегда получало уведомления, даже когда оно было не в фокусе.

Что я могу сделать, чтобы изменить это поведение?

Спасибо!Nathan

Ответы [ 3 ]

2 голосов
/ 02 апреля 2013

Я знаю, что уже немного поздно, чтобы ответить на этот вопрос, все еще для моих записей, и если кто-то еще ищет.

В моем приложении панели меню OS X возникла та же проблема.Я хотел, чтобы приложение наблюдало все состояния.

Причина:

Когда приложение теряет фокус, наблюдатель приостанавливается.

т.е.Когда приложение становится неактивным, оно вызывает метод

-(void)applicationDidResignActive:(NSNotification *)notification

и по умолчанию объект NSDistributedNotificationCenter приостанавливается.

Решение: я создал объект для NSDistributedNotificationCenter

NSDistributedNotificationCenter *center=[NSDistributedNotificationCenter defaultCenter];

, а затем, когда приложение теряет фокус, вызывается метод applicationDidResignActive , и внутри него объект NSDistributedNotificationCenter восстанавливается из приостановленного состояния путем отправки NO в метод setSuspended.

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

и приложение начинает наблюдать, даже если оно теряет фокус.

2 голосов
/ 03 августа 2014

В соответствии с 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 на ДА при публикации

- (void)postNotificationName:(NSString *)notificationName object:(NSString *)notificationSender userInfo:(NSDictionary *)userInfo deliverImmediately:(BOOL)deliverImmediately

, чтобы немедленно отправлять уведомления в состоянии ожидания.

И убедитесь, что вы периодически не убиваете distnoted.Я забыл, что у меня был старый скрипт агента запуска до killall distnoted, чтобы избежать утечек памяти.

1 голос
/ 15 ноября 2011

Похоже, что поведение по умолчанию при добавлении наблюдателя в NSDistributedNotificationsCenter было изменено на NSNotificationSuspensionBehaviorCoalesce, которое не доставляет уведомления, когда приложение неактивно.

Описано здесь: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDistributedNotificationCenter_Class/Reference/Reference.html#//apple_ref/doc/uid/20000396-5567

...