Thursday, January 31, 2013

Introduction to User Notifications in Mac OS X Mountain Lion


In Mac OS X 10.8 (Mountain Lion) Apple introduced User Notifications. They are displayed in the notification center. They can also be displayed as small popup message.


Displaying such a notification is quite easy. Cocoa Framework provides NSUserNotification class. The following code shows a usage example:

NSUserNotification *notification = [[NSUserNotification alloc] init];
notification.title = @"Hello, World!";
notification.informativeText = [NSString stringWithFormat:@"details details details"];
notification.soundName = NSUserNotificationDefaultSoundName;
[[NSUserNotificationCenter defaultUserNotificationCenter] deliverNotification:notification];

That should display a notification in the Notification Center. What about the popup message? It's not displayed by default. To display it, there must
be implemented NSUserNotificationCenterDelegate protocol. In the example I've created, I implemented it in my AppDelegate class. The method we need is called userNotificationCenter:shouldPresentNotification:. Here is an example of its implementation:

- (BOOL)userNotificationCenter:(NSUserNotificationCenter *)center
     shouldPresentNotification:(NSUserNotification *)notification
{
    return YES;
}

Of course, we need to set a class as a delegate of the NSUserNotificationCenter. A good method for that is applicationDidFinishLaunching: in AppDelegate class:


- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    [[NSUserNotificationCenter defaultUserNotificationCenter] setDelegate:self];
}

And that's it! The message popup will be displayed together with the notification. I really recommend to check the documentation of classes that appered in this article. There are many other features like setting additional buttons or methods that are called when the notification is displayed or deliverd.

4 comments:

  1. Can only use the apps notifications are signed?

    ReplyDelete
  2. Sergio GutierrezMay 9, 2014 at 8:05 AM

    Very useful! Many thanks dude!

    ReplyDelete
  3. Really useful!! Very clearly explained. Thanks.

    ReplyDelete
  4. Works great, thanks!
    Just don't forget to add the protocol in your AppDelegate.h file. For instance:
    @interface AppDelegate : NSObject <NSApplicationDelegate, NSUserNotificationCenterDelegate>

    ReplyDelete