Kikuchy's Second Memory

つくる楽しさをもっと伝えたい。プログラムを書いていて、わからなかったこと・気付いた事を書き留めています。

Xamarin.Mac から Notification Center を使った通知を表示してみる

http://xamarin.com/images/tour/4platforms12.jpg image from Tour of Creating Cross-platform iOS, Android, and Windows Mobile Apps in C# - Xamarin





Xamarin というものがあるのですね。
何かと言うと、 C# を使って Mac, iPhone, Android アプリケーションを開発できるというスグレモノです。

以前から mono の存在は知っていたので、そのうち C# を使って Mac の上でちゃんとアプリを開発できるようになるんじゃないかとは思っていたのですが、統合開発環境も込みで登場してくれました。 IDE (Xamarin Studio) のコード補完がなかなかに優秀で、 Visual Studio を使って開発しているような感覚でプログラムを書き進めることができます。すごい。

さて、 Mac OS X 10.8から通知センター(Notification Center)というものが付きました。
ちょっと作ってみたいアプリに通知機能が欲しかったので、これを使って通知が出来ないか試してみました。


前提

通知センターに通知を出す

チュートリアルのアプリの "Click Me"ボタンを押したときに、通知を出すようにしてみます。

ClickMeButton のイベントデリゲートの部分を以下のように書き換えます。

public override void AwakeFromNib ()
{
	base.AwakeFromNib ();
	ClickMeButton.Activated += (object sender, EventArgs e) => {
		numberOfTimesClicked++;
		OutputLabel.StringValue = "Clicked " + numberOfTimesClicked + " times.";

		// 以下のコードを追加
		NSUserNotification notification = new NSUserNotification();
		notification.Title = "Hello, Mac";	// 通知のタイトル
		notification.InformativeText = OutputLabel.StringValue;	// 通知の本文。ここではラベルに設定したテキストをそのまま出す。
		notification.SoundName = NSUserNotification.NSUserNotificationDefaultSoundName;	// 通知が飛んだときに鳴るサウンド。この設定だと「ポン」という音が鳴る。
		NSUserNotificationCenter.DefaultUserNotificationCenter.DeliverNotification(notification);
	};
}

これだけで以下のように通知センターに通知が出るようになります。簡単!!

f:id:kikuchy:20130803175006p:plain

バナーも表示してみる

さて、これだけでも通知は出来ますが、なんだか味気ないですよね。 Growl のようなバナーを出してくれないと気付かなさそうです。

そこでバナーを出すようにしてみましょう。

先ほどのチュートリアルのプロジェクトに、"NSNotificationCenterDelegate"を継承した、"MyNotificationCenterDelegate"というクラスを追加します。

f:id:kikuchy:20130803175548p:plain

中身はこんな感じに。

using System;
using MonoMac.Foundation;

namespace HelloMac
{
	public class MyNotificationCenterDelegate : NSUserNotificationCenterDelegate
	{
		public MyNotificationCenterDelegate ()
		{
		}

		public override bool ShouldPresentNotification (NSUserNotificationCenter center, NSUserNotification notification)
		{
			return true;
		}
	}
}

"MonoMac.Foundation"を using しておかないとエラるのでご注意。

それから、"AppDelegate"クラスの"FinishLaunching"メソッドを以下のように変更。

public override void FinishedLaunching (NSObject notification)
{
	NSUserNotificationCenter.DefaultUserNotificationCenter.Delegate = new MyNotificationCenterDelegate ();	// この行を追加
	mainWindowController = new MainWindowController ();
	mainWindowController.Window.MakeKeyAndOrderFront (this);
}

これでもう一度ビルドして、Click Me ボタンを押してみましょう。

f:id:kikuchy:20130803175954p:plain

狙い通り出ました! これでアプリに通知機能を付けるのも簡単ですね!!




ちゃんとしたアプリケーションで通知したかったら、 Notification Center が使えるかどうかを調べて、使えないなら Growl で通知を出すとか、色々しないといけないですけれどね。