20

アプリケーションに新しいMountainLionNSUserNotificationCenterを使用しようとしています(実際にはそれほど難しくありません)。通知の投稿は、

NSUserNotification *userNotification = [[NSUserNotification alloc] init];
userNotification.title = @"Some title";
userNotification.informativeText = @"Some text";

[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:userNotification];

ただし、アプリがフォーカスを取得したら、画面に表示されているすべての通知を閉じたいと思います。たとえば、新しいメッセージアプリがそれを行うように。新しいメッセージがバックグラウンドで受信されると、通知が表示されます。アプリが再びアクティブになると、これらは自動的に閉じられ、画面と通知センターから消えます。

これを複製するために、NSApplicationDidBecomeActiveNotification通知にメソッドを登録しました。これも正常に呼び出されます。そこで私は電話します[NSUserNotificationCenter defaultUserNotificationCenter] removeAllDeliveredNotifications]

ただし、これには、通知センターで収集された通知が削除され、右上隅に表示されている対応する「バブル」が引き続き表示されるという効果があります。

配信されたすべての通知を繰り返し、それぞれを削除すると、のscheduleNotification代わりにを使用した場合とまったく同じ効果がありdeliverNotificationます。

これを経験しているのは私だけですか、それとも通知の画面上の部分と通知センターの部分をプログラムで却下するための何かが欠けていますか?

4

3 に答える 3

18

メッセージアプリは、おそらくプライベートNSUserNotificationCenter_removeAllDisplayedNotificationsまたは_removeDisplayedNotification:メソッドを使用しています。

これらのメソッドを使用して、これが探しているものであるかどうかをテストできます。このカテゴリインターフェイスを追加して、メソッドを宣言するだけです。

@interface NSUserNotificationCenter (Private)
- (void)_removeAllDisplayedNotifications;
- (void)_removeDisplayedNotification:(NSUserNotification *)notification;
@end

残念ながら、これらは文書化されていないメソッドであるため、AppStoreを通じて配布されるアプリで使用することはできません。これが本当にあなたが探しているものである場合は、バグを報告し、これらのメソッドがパブリックAPIの一部になるように依頼する必要があります。

于 2012-10-03T23:19:20.413 に答える
4

10.9以降、次の方法で表示された通知がすべて削除されます。

// Clear a delivered notification from the notification center. If the 
// notification is not in the delivered list, nothing happens.
- (void)removeDeliveredNotification:(NSUserNotification *)notification;

// Clear all delivered notifications for this application from the 
// notification center.
- (void)removeAllDeliveredNotifications;

これらのメソッドが呼び出されると、表示された通知もすべて削除されるため、動作は10.8から変更されたようです(説明してくれた@ 0xcedに感謝します)。

于 2013-11-27T07:24:51.490 に答える
2

removeDeliveredNotification表示された通知を削除しています(10.11)identifier。通知にある警告を設定する必要があります。

于 2016-01-22T22:44:39.170 に答える