SSブログ

Growlを呼ぶだけのアプリを作ってみる。 [プログラミング]

スクラッチ的に始めからGrowlを使うアプリケーションを作ってみました。

基本的な情報はこれに沿ってやりました。

 http://quiteuseful.co.uk/post/99434588/how-to-make-a-growl-app

相違点が少しあるので、そこいらへんを気にしてみる。

 
1. Xcodeを新規プロジェクトで、「Application>Cocoa Application」で作る。
2. 右クリックメニューの 「追加>既存のファイル」でGrowl.frameworkを指定。「ディスティネーショングループのフォルダに項目をコピーする(必要な場合)」をチェックする。

※実行するとまだ、Growlがアプリケーションバンドルに入れられないので、GDBが動作を止めてしまう。

3. ターゲットに「ファイルコピー」を作る。ターゲット上の右クリックで、「追加>新規ビルドフェーズ>新規コピーファイル」を選択すると出来た。
4. ターゲットの「ファイルをコピー」にGrowl.Frameworkをドロップして登録
5. ターゲットの「ファイルをコピー」を右クリックで情報をダイアログで見る。
6. 一般タブのディスティネーションをフレームワークに指定。

※アプリケーションバンドル内の「Contents/Framework/Growl.framework」がコピーされて動くようになる

7. Growl.frameworkの中からヘッダを取り入れ、プロジェクトに追加する。
8. プロジェクトのヘッダに #import "Growl.h"を入れる。
9. @interface UntitledAppDelegate : NSObject <GrowlApplicationDelegate>と設定してデリゲートなクラスとする。
10. - (void)awakeFromNib、はアプリケーション発動時に読み込まれるので、インプリしてみる

#define NOTIFY_NAME @"hogehoge"

- (void)awakeFromNib
{
	NSMutableArray *defNotesArray = [NSMutableArray array];
	NSMutableArray *allNotesArray = [NSMutableArray array];
	
	[allNotesArray addObject:NOTIFY_NAME];
	[defNotesArray addObject:NOTIFY_NAME];	
	
	//Set these notifications both for ALL (all possibilites) and DEFAULT (the ones enabled by default)
	NSDictionary *regDict = [NSDictionary dictionaryWithObjectsAndKeys:
							 @"Untitled", GROWL_APP_NAME,
							 allNotesArray, GROWL_NOTIFICATIONS_ALL,
							 defNotesArray, GROWL_NOTIFICATIONS_DEFAULT,
							 nil];
	
	NSLog(@"Registering with %@",regDict);
	
	// 二回やらないと見た目で登録されてないよう見える
	// xmlでの登録がいいのでしょう、本家サイトでもそうしろって書いてあるし
	[GrowlApplicationBridge registerWithDictionary:regDict];
	[GrowlApplicationBridge registerWithDictionary:regDict];
}


これで登録できるようになった。

11. 適当にボタンを作って、メソッドが発動するように指定する
12. そのメソッドにGrowlのウィンドウを出してもらう。

- (IBAction)callGrowlWidget:(id)sender
{
	NSLog(@"きたきた!callGrowlWidget");
	
	[GrowlApplicationBridge setGrowlDelegate:self];
	
	//notificationNameと設定時のGROWL_NOTIFICATIONS_ALLとGROWL_NOTIFICATIONS_DEFAULTは一緒
	[GrowlApplicationBridge notifyWithTitle:@"Alert"
								description:@"Hello!"
						   notificationName:NOTIFY_NAME		// ここと登録時の設定は一緒
								   iconData:nil
								   priority:0
								   isSticky:NO
							   clickContext:[NSDate date]
	];
}



サンプルソースと違う所は、10番のところで、登録時にXMLファイルを使ってない。それと12番の所で、フレームワークバンドルをNSBundleを使って呼んでない。ただフレームワークが存在するかどうかってのは、動作時に分かってしまうから、特にチェックをしなくても、大丈夫な気がします。そもそも.app内のバンドルをいじるって事自体は、Windowsのバイナリを改変するのとさして変らない事だと思うので、動作対象外として扱うべきかなとも思うんだけど。



あと、気になるメッセージが出てた。

11/06/12 20:52:33 Untitled[2125] GrowlApplicationBridge: The Growl delegate did not supply a registration dictionary, and the app bundle at /Users/hoge/Desktop/Untitled/build/Debug/Untitled.app does not have one. Please tell this application's developer.

新しく作ってみたプロジェクトでは、こういうログを吐き出すのを、コンソール.appで見えました。登録の時に、plistのXMLな形式でファイルを作って、それを中に入れて登録に使うと出てこなくなるんでしょうね。と思ってたら、自分が使っているのだと、登録するデータをXMLファイルに入れていないのに、同様なメッセージは出ていないようでした。あまりにデリゲートのクラスとかが複雑だと報告する機能が働かないのかな。



とにかく、登録した文字列を使って呼び出すと、titleとdescriptionの項目は表示されるという事が分かっていれば、それでいいのかもしれない。


タグ:freesoft
nice!(0)  コメント(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。