Growl を通知センターにシームレスに統合する



Growl にしか対応していないアプリからの通知を、OS X の通知センター（Notification Center）に統合する方法。

## 前置き

Growl にしか対応しないアプリもほとんど無くなってきたものの、私の場合、常用しているものとして Notify（メール・クライアント）、[Sequel Pro](http://www.sequelpro.com/)、[DropIn](http://excitedatom.com/dropin/)、<del>[ownCloud](https://owncloud.com/) </del>（1.6.0beta から通知センターに対応）などがあります。

Growl の設定画面で「OS Xの通知」を「オン」にすればすべての Growl 通知が通知センターにパス・スルーされますが、

- 通知の送信元が Growl の名のもとに区別無く表示されてしまう。
- 通知のアイコンも Growl のものになってしまう。

これをなんとかしたいと思います。
（なお、通知のアイコンを各アプリのものに変更するだけなら、[CustomNC](https://github.com/inket/CustomNC) でも可能です。）

これを
![default.png](https://qiita-image-store.s3.amazonaws.com/0/35819/8faa2fc7-c498-6585-390f-7d33fab2113c.png "default.png")
↓
こうしたい。
![configured.png](https://qiita-image-store.s3.amazonaws.com/0/35819/a89f0122-c1b3-033e-d54e-5362bd8c0ebb.png "configured.png")



## terminal-notifier のインストール

まず、シェルから通知センターに通知を送れる [terminal-norifier](https://github.com/alloy/terminal-notifier) コマンドを導入します。

直接 Growl に通知を送らせるのではなく、terminal-notifier を経由することで、あたかも各アプリが通知を送っているように見せることができます。

私の場合は Homebrew でインストールしました。 

```
$ brew install terminal-notifier
```

その他のインストール方法（gem）やオプションなど詳しくは、上記リンクからご確認ください。



## AppleScript を作成

Growl から terminal-norifier を叩くための AppleScript を作成します。

参考：[Growl - AppleScript Rules Documentation for Growl](http://growl.info/documentation/applescript-rules)

下記のような内容のスクリプトを `Rules.scpt` という名前で保存し、`~/Library/Application Scripts/com.Growl.GrowlHelperApp/` に置きます。

すでに以前から `Rules.scpt` を利用している方は……、すみません、Growl で複数のスクリプトを利用する方法はよくわかりませんでした（下記を、うまくご自分のスクリプトとマージしてください）。
ここでは、初めて `Rules.scpt` を作成したという前提で書かせていただきます。


```applescript:Rules.scpt
using terms from application "Growl"
    on evaluate notification with notification

        -- Back-slashes are for escaping the first characters of arguments given to `terminal-notifer` (cf. issue #36).
        set title to "\\" & notification's note title
        set description to "\\" & notification's note description
        set appname to notification's app name
        try
            set appid to the id of application appname
        on error
            set appid to the id of application "Growl"
        end try

        -- Tell `terminal-notifier` to send notification.
        do shell script "/usr/local/bin/terminal-notifier -title " & quoted form of title ¬
            & " -message " & quoted form of description ¬
            & " -sender " & quoted form of appid

        -- Suppress further actions from Growl.
        return {display:none}

    end evaluate notification
end using terms from
```

上記のうち「`/usr/local/bin/terminal-notifier`」の部分は、Homebrewでインストールした場合です。各自の環境での `terminal-notifier` のインストール先のパスに書き換えてください。

## Growl の設定

Growl が起動していたら、終了させて再度起動してください。
これで `Rules.scpt` が認識されます。

Growl の設定画面に、それまで無かった、「Use Rules」というチェックボックスが追加されています。
チェックがオンになっていることを確認します。

また、「OS Xの通知」を「オン」にしている方は、必ず「オフ」にします。

![growl_general.png](https://qiita-image-store.s3.amazonaws.com/0/35819/5c787335-4529-6099-028a-ea6279b0b14a.png "growl_general.png")


なお、はじめて `Rules.scpt` を使用する際に、Growl が「Rules.scpt Detected」という警告を表示しますので、「はい」をクリックしてください。

**以上で完了です。**


##補遺

### エラー？

コンソールを見ると Growl が何やらログを吐いているのですが、とりあえず動いているので無視してます。

![console.png](https://qiita-image-store.s3.amazonaws.com/0/35819/caaa88b6-fe1c-5090-42e3-a6d245fb3742.png "console.png")

### Choose Application!

Growl 通知を送るアプリによっては、下のようなダイアログが出てしまうことがあります（アプリが自称する app name から bundle identifier を取得できないとき）。

![dialog.png](https://qiita-image-store.s3.amazonaws.com/0/35819/26f3a091-97af-9130-0c9b-db348bb3ffb6.png "dialog.png")

「Cancel」を押せばいいのですが、当然うっとうしいので、このダイアログが出るアプリが特定されている場合は `Rules.scpt` の冒頭のtry文のところを以下のような感じにして回避してください。

```applescript:
        if appname = "Growl AppleScript Sample" then
            set appid to the id of application "Growl"
        else
            try
                set appid to the id of application appname
            on error
                set appid to the id of application "Growl"
            end try
        end if
```

上記だと Growl からの通知であるかのように表示されますが、terminal-notifler の `-appIcon` オプションなどと合わせて工夫すれば、好きなアイコンを表示することもできると思います。