macOSには通知センターがあり、Objective-Cを始めAppleScriptで通知を出すことができます。これらの言語以外で通知を出すとなると、Objective-Cで書かれたコマンドラインツールterminal-notifierを経由するようにすることが一般的です。
terminal-notifierで出来ること・出来ないこと
通知を出すだけであれば、terminal-notifierで十分です。
terminal-notifier -message "デプロイの準備ができました"
URLを開いたり、コマンドを実行することもできます。
terminal-notifier -message "Googleを開く" -open "https://www.google.com"
terminal-notifier -message "デスクトップを開く" -execute "open ~/Desktop"
terminal-notifierでできないことがあるとしたら、通知にアクションをつけることです。例えば、通知に「はい」「いいえ」のボタンをつけることや、返信メッセージを入力できるようにするなどです。
通知にアクションを付けられるalerter
alerterはterminal-notifierの類似コマンドラインツールで、macOSの通知を送信します。OS X 10.8以降をサポートしています。通知を送信できるだけでなく、通知が閉じられるまでプログラムをブロックし、通知がどのように閉じられたかを標準出力で返す機能があります。
alerterで表示した通知は閉じられるまで表示され続けるという点は、terminal-notifierのデフォルトの挙動と異なります。したがって、通知にアクションを付け、その結果を踏まえてプログラムの処理を行ないたい場合は、alerterを活用すると便利です。
alerterの特徴
alerterには下記のような特徴があり、細かくオプションで設定することができます。
- 通知にアイコン・タイトル・サブタイトル・画像がセットできる
- 通知の返信ダイアログにユーザが入力した文字列を取得できる
- タイムアウトを設定できる
- 閉じるボタンの文言を変更できる
- アクションボタンの文言を変更できる
- 通知音を設定できる
- 通知イベント(closed, timeout, replied, activatedなど)を文字列もしくはJSON形式で出力する
- SIGINT, SIGTERMで通知を閉じる
alerterのインストール
alerterのインストールはGitHubのリリースページからzipファイルをダウンロードし、解凍して出てきた実行ファイルalerter
を~/bin
などに配置します。HomeBrewでのインストールはまだできないようです。
alerterで通知にアクションをつけるサンプル
alerterにはさまざまなオプションがあり、ほぼ全てのオプションを指定したものが次のサンプルになります。
alerter -title "Jenkins" \
-subtitle "Success" \
-message "ビルド #23 が完了しました。" \
-appIcon "https://qiita-image-store.s3.amazonaws.com/0/889/0b79d39d-0979-abe7-0429-fb0807c6a65a.png" \
-closeLabel "今すぐデプロイ" \
-dropdownLabel "オプション" \
-actions "1時間後,明日,何もしない" \
-json
{
"deliveredAt" : "2016-06-26 14:21:47 +0900",
"activationType" : "closed",
"activationAt" : "2016-06-26 14:21:50 +0900",
"activationValue" : "今すぐデプロイ"
}
alerterで通知に返信機能をつけるサンプル
-reply
オプションを指定すると、通知に対して返信メッセージを入力できるようになります。ただし、-reply
は-actions
と組み合わせることはできません。
alerter -message "Hello!" \
-reply \
-json
{
"deliveredAt" : "2016-06-26 14:30:09 +0900",
"activationType" : "replied",
"activationAt" : "2016-06-26 14:30:39 +0900",
"activationValue" : "Hello!!"
}
おわり
プログラムから通知を上げるには、terminal-notifierで十分なことが多いですが、通知にアクションを持たせたいときはalerterを使ってみると良いかもしれません。