SSブログ

GrowlのCocoaでの実装はちょっと面倒だ。 [プログラミング]

何日かかかってるか分からないんだけど、やっとGrowlを入れ込む事が出来ましたよ。基本的に、

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

ここのなんだけど、いくつか相違点が少しある。実際に動いているから、別に間違いというほどでもないんだけど、余計な事をやってそうだ。基本、本家のチュートリアルを参照すれば出来そうなんだけど、なんかちょっと微妙な感じ。

 http://growl.info/documentation/developer/introduction.php
 http://growl.info/documentation/developer/growlapplicationbridge.php
 http://growl.info/documentation/developer/implementing-growl.php

わりと細かく検証していったので、ミニマムに行なうやり方が分かるはず。よくサンプルソースとか言って、欲しい物と一緒にいらん処理が付いてくるのは自分でも嫌なので、なるべく肉をそぎ落とした形にしたい。


 
始めに上げたページの良い所はサンプルソースがあるところで、無駄な部分がないこと。こういう誠実なサンプルは好感度が高い感じ。やっぱり動くソースは正義ですな。Growlは全部オープンソースだと思う(てきとう)ので、分からなかったら全部見ればいいんだけど、そんな事をしている時間も手間も惜しい。人が書いたソースってのは思ったより読みにくい物だし、機能を一部だけを使わせてもらえばいいのだから、そんなに本腰を入れてやれるほどのリソースがない。



基本的に、

1. アプリケーションをGrowlの側に登録して、
2. ウインドウ出してもらえるようにする。

それはどの言語でやっても同じみたい。


1の登録は、安定して登録できなかったいるするけど、[GrowlApplicationBridge registerWithDictionary:]で登録できた。登録できたのを確認するには、「システム環境設定>Growl>アプリケーションタブ」で見られる。一回登録してしまえば、特にやる事はない。重ねてやってしまっても実害がない気がする、分かんないけど。reregisterGrowlNotificationsってのがあるけど、普通は使わないってGrowlApplicationBridge.hに書いてある。



とりあえず、dictionaryの中で、AllNotificationsとDefaultNotificationsっていうのを設定すればいいらしい。どっちにも存在するように書かないとダメみたいな感じ。他にもいくらか設定できる所があるが、必要ないみたい。とりあえず、その二つに同じ物を書いてあれば使えるようになるようだ。他に使っていてもApplicationNameぐらいだから、あんまり細かく気を使う必要はないのかもしれない。

NSDictionaryなオブジェクトに、NSMutableArrayを詰めたら、それを[GrowlApplicationBridge registerWithDictionary]で渡して、登録は完了する。再度登録するときは、reregisterGrowlNotificationsなどを使うのだろうが、特に替える必要性を感じないので、動作確認はしていない。どうせ意図的に間違えて確認する事ぐらいしか出来ないし。

先のサンプルソースの方は、XMLを使って登録していました。このファイルを取り入れるだけでいいのだろうか? Growl Registration Ticket.growlRegDictっていう名前も決め打なんだろうか。いまいちこれをどう発動して登録しているのかが分からない。こういうのはなるべくブラックボックスがないようにしないと、そういうお手前でやればいいんだよってことで、その状況の意味とかが全然読み取れないんだよね。後でプロジェクトを新規作成して半スクラッチして確かめる予定。

ソースの中で書けるなら、できればそうしていきたい。GUIのエディタはGUIの事だけのことと、ソースコードとのつながりだけを示したいけど、Interface Builderは必ずしもそうなってないので残念な感じ。

というのも、デリゲートの作業はXcodeで完結していない。File's Ownerとデリゲートにしたクラスを関連づけないといけないらしい。元々他の所のデリゲートになっちゃってたら、一つしか選べない状態になっているらしく、他の部分のデリゲートの関係を維持できなさそう。

でも、mailpeeper-tlsでは一回関連づけて、コンパイルしたら他に以前からFile's Ownerにデリゲートとして結びつけてあったので、そこがダメになってしまった。そのため全然普通に動かなかったので、驚いて関連付けを前の状態に戻したら、うまく動くようになっていた。何だろう、これ。動くようになったけど、File's Ownerとかの意味も前に調べた気がするけど、根本的な所の意味が忘れてしまった。自分のブログに書いてあったかなぁ。前もうやむやにした可能性が高いな。とにかく、Interface Builderで設定する必要があるらしい。他ところはmultiple何とかという表示で出来ているのですが、デリゲートとかは複数関連付け出来ないみたいね。何か根本的な仕組みが分かってない感じ。



いまいちデリゲートの意味が分かってないので、このミニマムに近いソースでも読み切れてない。委譲ってことなんだろうけど、JavaやC++でやろうとするとどうなるのだろう。どっちかで分かれば、Obj-Cでも分かりそうな物だが、面倒臭くて調べてません。そういうのを追及しないから、万年中級のそしりを受けざるを得ないわけだ。とはいえ、Macのプログラミングで飯を食えるわけではないので、深入りはしないようにとも思う。



実際にウインドウを出すところだけど、登録した部分をきっちり守らないといけないらしい。

 // Register ourselves as a Growl delegate
 [GrowlApplicationBridge setGrowlDelegate:self];

デリゲートを登録って、また登録ですか。今度はオブジェクト自体ですね。引数にデリゲートにしたクラスを登録する作業をした後に、メッセージを表示してもらう。GrowlApplicationBridge notifyWithTitle: description: notificationName: iconData: priority: isSticky: clickContext: identifier: って妙に長いメソッドを使う。identifierがないバージョンもある。パラメーターの概要は下。

notifyWithTitle: 文字通りタイトルで、長いと適度な所で文字列は切れる
description: 文字列の最後まで出るみたい
notificationName: 登録した名前(AllNotificationsとDefaultNotificationsで指定したもの)と合わせる
iconData: nilを設定すると、そのアプリのアイコンが使われるようだ
priority: 何の優先だかいまいち分かってない。-2〜2まで設定できるみたい
isSticky: YESで設定すればクリックされるまで消えず、NOだとある程度表示されて消える
clickContext: クリックしたときにgrowlNotificationWasClicked:に渡されるオブジェクト?growlNotificationWasClicked:に来そうだけど来なかったデリゲートのクラスのgrowlNotificationWasClicked:にクリックされたときの処理を実装
identifier: nilで良し。使わないで済む関数があるので重要ではないのかも。


特に登録した名前、notificationName:が合っていれば、とりあえず表示はされるみたい。もちろん、パラメータの型とかはきちんと合わせないとダメですが、それはコンパイルの時に指摘されるだろうし、あんまり気にしない事にする。あ、いちからGrowlを使うだけのアプリを作ろうと思っていたのですが、時間的にダメでした。次あたりにそれをする予定。


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

nice! 0

コメント 0

コメントを書く

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