2011-11-15 20 views
1

デフォルトのNSNotificationCenterから特定の種類の通知を購読するアプリを持っています。NSNotificationCenterオブザーバがLion上でアプリのフォーカスが外れたときにイベントの受信を停止します

OSX Lionでは、アプリがフォーカスを失ったとき(別のアプリがアクティブになったとき)にイベントの受信を停止する点を除いて、正常に動作します。アプリケーションがフォーカスを取得すると、イベントの再受信を開始します。 アプリケーションは、以前のバージョンのOSXではこの動作をしていませんでした。フォーカスが外れていても、常に通知を受け取りました。

この動作を変更するにはどうすればよいですか?

ありがとうございます! Nathan

答えて

1

NSDistributedNotificationsCenterにオブザーバを追加すると、NSNotificationSuspensionBehaviorCoalesceに変更されたときのデフォルトの動作のように見えますが、アプリケーションがアクティブでないときに通知を配信しません。

は、ここで説明: http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDistributedNotificationCenter_Class/Reference/Reference.html#//apple_ref/doc/uid/20000396-5567

2

私はまだ私の記録のためにといくつかのいずれかがまだ探している場合、これを答えることはその少し遅れを知っています。

OS Xのメニューバーアプリにも同じ問題がありました。私はアプリがすべての州を観察したかった。

理由:アプリケーションがフォーカスを失っ

、観察者が一時停止されます。

ie。アプリケーションが非アクティブになると、メソッドが呼び出されます。

-(void)applicationDidResignActive:(NSNotification *)notification 

デフォルトでは、NSDistributedNotificationCenterオブジェクトは中断されます。

ソリューション: Iは次いで

NSDistributedNotificationCenter *center=[NSDistributedNotificationCenter defaultCenter]; 

とNSDistributedNotificationCenter

のオブジェクトを作成したときにアプリがNSDistributedNotificationCenterオブジェクトを送信することにより、サスペンド状態から回復させることは、そのコール applicationDidResignActive方法及び 内部フォーカス失い NOをsetSuspendedメソッドに設定します。

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

その後、フォーカスが失われてもアプリが観察を開始します。

+0

多くの感謝!私はこれを正確に行う方法を探していました。 – gypsyDev

+0

Mac OS Xのメニューアプリケーションとして説明しました!もし私が100 +以上の投票をすることができれば。あなたは私の日を救いました! 3時間のテストと最後にあなたのソリューションは私のアプリが非アクティブなときに私が通知を得ることができない理由を理解するのを助けました。再度、感謝します! – edukulele

2

アプリケーションがアクティブでない場合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に通知配信の中断を管理させる必要があります。財団のみのプログラムでは、この方法を使用する必要が生じることがあります。サスペンド状態の下で、すぐに通知を送信するよう

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

を投稿する際に

- (void)addObserver:(id)notificationObserver selector:(SEL)notificationSelector name:(NSString *)notificationName object:(NSString *)notificationSender suspensionBehavior:(NSNotificationSuspensionBehavior)suspendedDeliveryBehavior 

を使用してNSNotificationSuspensionBehaviorDeliverImmediatelyに中断またはYESにdeliverImmediatelyを設定するとき

あなたはどちらか

は、観察者の動作を設定することができます。

定期的にdistnotedを殺していないことを確認してください。 メモリリークを避けるために、私は古い起動エージェントスクリプトをkillall distnotedに持っていたことを忘れていました。

関連する問題