カテゴリー別アーカイブ: Mac

Growl

アプリケーションでの Growl サポートについて。いつものように、とりあえず動作するには、って感じです。

まず Growl のサイトから SDK (Growl-1.1.2-SDK.dmg) をダウンロードします。dmg をマウントして、色々入ってますが必要なのは Framework なので適当な所へコピーします。後でサポートするアプリケーションにコピーするのでプロジェクトの中とか分かりやすい所が良いと思います。

Xcode でサポートするアプリケーションを開いて Growl の Framework を追加します。Growl の Framework には2種類有るのですがアプリケーションでサポートするだけなら Growl.framework だけで OK です。追加したら今度はターゲットを展開して「新規ビルドフェーズ」「新規ファイルのコピー」と選択して追加します。その時に表示されるダイアログには何も入力しなくても構いません。ダイアログを閉じて、先ほど追加した Growl.framework を追加した「ファイルをコピー」にドラッグします。
準備の最後は Growl にどんな通知を渡すのか、また既定の通知はどれなのかを記述した plist を作成します。作成は Property List Editor で大丈夫です。ファイル名は「Growl Registration Ticket.growlRegDict」です。私は最初 plist と書かれていたので拡張子も plist かと思っていたのですが不要でした。
で、記述する内容は3つのキーとその中身です。

<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<plist version=”1.0″>
<dict>
 <key>AllNotifications</key>
 <array>
  <string>NewMailMailUnreadStatusBarNotification</string>
 </array>
 <key>DefaultNotifications</key>
 <array>
  <string>NewMailMailUnreadStatusBarNotification</string>
 </array>
 <key>TicketVersion</key>
 <integer>1</integer>
</dict>
</plist>

こんな感じです。
AllNotifications には Growl に通知する全ての Notification を記述します。DefaultNotifications には多分既定で通知するのを記述すると思われます。私のは未読通知1個なので1個づつです。

これで準備が整ったので、次はプログラムの方です。
プログラムでは起動した時に framework を探してロードする事、と実際に通知を行う事です。
framework のロードは

NSString *frameworkPath=[
   [[NSBundle bundleForClass:[self class]] privateFrameworksPath]
   stringByAppendingPathComponent:@”Growl.framework”
  ];
NSBundle *growlFramework = [NSBundle bundleWithPath:frameworkPath];
if (growlFramework && [growlFramework load]) {
 // Register ourselves as a Growl delegate
 [GrowlApplicationBridge setGrowlDelegate:self];
} else {
 NSLog(@”Could not load Growl.framework”);
}

こんな感じです。
私の場合メインのコントローラクラスで通知するので self となっています。

次は Growl への通知です

icon = [[NSImage imageNamed:@”NetworkLarge”] TIFFRepresentation];
[GrowlApplicationBridge notifyWithTitle:[mes mailboxname]
 description:[NSString stringWithFormat:@”From:%@\nSubject:%@”,[mes sender],[mes subject]]
 notificationName:@”NewMailMailUnreadStatusBarNotification”
 iconData:icon
 priority:0
 isSticky:NO
 clickContext:nil
];

notifyWithTitle と description は NSString で notificationName には準備の所で記述した通知を指定します。iconData は nil でも構わないです、指定する場合は NSData なので NSImage から TIFFRepresentation メソッドを使っています。Growl の通知ウインドウにアイコンが表示されます。後のパラメータは聞かないで下さい。まだ、使ってないので良く分かりません。clickContext は多分 Growl のウインドウをクリックした時に自分のアプリケーションに Notification が通知される様な気もしますが。

以上です。アプリケーションを起動すると「システム環境設定」の Growl に自分のアプリケーションが登録されます。
アプリケーションの場合は Growl.framework をロードするのは簡単なんですが、プラグインの場合はちょっと大変な様です。

Mail

長いので省略。私のテストではクラッシュしないのですが、他の方の場合クラッシュする事が有った様です。

メールが未読かどうかの判断は各メールファイル(拡張子が emlx)を読んでする訳です。で、その情報はファイルの最後に書かれています。XML 形式なんです。また、ファイルの最初には文字(数字)でメール部分のサイズが書かれています。まぁ全部読み込めば良いんですけど、そうすると時間が掛かるので最初のサイズを読んで XML 部分まで SEEK して読みます。ただ Mail.app の問題だと思うのですがたまにサイズが少し違う場合が有ったりします。仕方ないので実際の SEEK 位置より少し手前から最後迄読み込んでいます。

XML 部分は <XML タグを探して(後ろから)先頭を見つけ、そこから最後までを NSString の propertyList で NSDictionary としているのですが、此処で結果が nil になる場合が有った様で、これは想像して無かったのでクラッシュします。nil の場合情報が無い、と言う事で無視する事にしました。

後は SSL をサポートすれば当初の目標を達成出来るのですが、これが、また、大変そうで。今のところさっぱりです。ネットの海へ何回もダイブしますが、なかなか見つかりません。かなり先にならないと出来なさそうです。

そんな所へ或るメールが来て、なにやら「Growl をサポートしたらどうか、…」とか。
最初 Growl のサイトを見た時は、どうなるのか、と思ったんですけど。実際にやってみると思ったより少ない手間で出来ました。Growl のサポート方法は、また別の投稿にしたいと思います。まぁいつもの様に「いい加減にサポートする方法」とかになりますが。

MailUnreadStatusBar

まぁ長い名前のプログラムですが。プログラムソースをほとんど書き換えて以前のバージョンと同じ機能まで出来たのでリリースしたのですが。10.4 ではクラッシュするらしい。10.5 の新機能は使ってないのに。調べたら、なんと先日投稿した「環境設定ファイルを読む」で使ったユーティリティ(plutil)のオプションパラメータが異なってました。10.5 では標準出力に出せるのですが 10.4 ではその指定が出来ないんです。仕方ないので /tmp に書き出して、それを読み込んで、最後に削除するように変更しました。

0.5.1 としてリリースしたのですが、今度は 10.5 でも動作しない方もいらしたようで。再度見直してファイルを読み込むのを普通の NSString で読むようにしました。今度は大丈夫かなぁ?

それと今回のリリース(0.6.0)はメールサーバ上のメールに対して未読チェックを行う機能を追加しました。まだ POP3 それも SSL 無しだけですけど。APOP は対応したので、まぁ使えるかも。次は IMAP4 です。これは現在色々試行中で、一応目途はついた感じです。認証の問題も残ってますけどね。SSL に関しては結構時間がかかると思われます。何かちょいちょいと出来る様な仕組みは無いのかなぁ…

最近分かった事

NSTableView でのソートがどうしても出来なかったんです。で、ウェブで探して見ると、なんと「IB で設定する」とか書かれてたんで、見てみると。有りましたプロパティウインドウにソートキー取得メソッドと比較メソッドの設定が。NSString とか NSDate とか標準で比較メソッド(compare:)を持っている場合は簡単です。無い場合は自分で書くしか無いのですが、NSArray のソートと同じだろうと思ってます。

MailUnreadStatusBar ですが、なんとか現状のプログラムまで持ってこれました。しかし、相変わらずプログラム内部から NSOutline の親項目を広げてもスクロールバーの表示が変ですけど。これもソートと同じくその内解決して欲しいなぁ。
で、近々バージョン 0.5b でリリースするつもりです。メールサーバをアクセスして未読チェックが出来る様になればバージョン 1.0 にするつもりです。

次は?

QueueMemo , iPalmMemo とバージョンアップして来ました。次は、と言うと。やはり MailUnreadStatusBar でしょう(名前が長い)。

内部での処理方法を大幅に変更する予定です。現状は AppleScript に依ってメールボックスやメールの未読を取得していますが、これを止めて ~/Library/Mail に有るファイルから取得する様に変更する予定。未読をチェックするメールボックスの設定あたりの操作性を変更(もう少し格好良くしたい)。メニューバーに表示するアイコンの追加・削除をユーザが出来るようにしたい。未読メール一覧を表示して送信者と件名を確認出来るようにしたい。最後にメールサーバを参照して未だ Mail.app に読み込んでいないメールをチェックしたい。これが出来ると Mail.app を起動して無くても未読チェックが行えるので。

最後のサーバをチェックするのを除いた部分が完成したらリリースするかも知れません(現状の機能と同等な状態)。

iPalmMemo も Mail.app の様な3ペイン形式にもしたいような、したくないような、迷ってます。1カテゴリにメモが沢山有る場合現状では見にくいと思うんです。カテゴリも別に階層表示する必要も無いですから。