Clipy/Magnetを使ってWi-Fiのスイッチショートカットアプリをインスタントに作る
まえがき
BetterTouchToolが有料になって以来、Wi-FiのON/OFFをショートカットで切り替えるためにいろいろ試みてきました。
BetterTouchToolを使っていた頃 walkingmask.hatenablog.com
ShellScriptとAutomatorを使って walkingmask.hatenablog.com
しかし、今回クリンーンインストールするにあたってその設定も消えてしまったので、新しくツールを作ることにしました。 github.com
環境
Xcode 8とSwift 3がすでにリリースされており、macOS Sierraが出たばかりなので時期遅れ感がありますが、cocoapodsを使うのが初めてなのとSwift 3の情報がまだあまり無かったのでこの環境になりました。
実装
Xcode 7でプロジェクト作成
うっかりとXcode 8をインストールしてしまったため、最初はひどい目に遭いました。
うっかりXcode8にアップデートしたばっかりにひどい目にあった
— あるマス (@walkingmask) 2016年9月20日
まずはXcode 7をインストールしておくといいです。ここから入手。
インストールが終わったら、プロジェクトを作成します。この時、以下のことに注意。
作成したら一旦閉じます。
cocoapodsでMagnetの導入
Clipy/Magnetは、Clipyというスニペットアプリに用いられている、アプリの動作を一般ショートカットに登録できるライブラリです。これを使うと、驚くほどインスタントにショートカットをつくれます。 github.com
rbenvとcocoapodsの導入はこちらのWebサイトを参考に進めました。 qiita.com qiita.com
[('e')]$ rbenv versions [~] system * 2.2.5 (set by /usr/local/var/rbenv/version) 2.3.1
プロジェクトのディレクトリでpod initした後に、Podfileを書き換えてpod installします。あとは、xcworkspaceをXcode 7で開きます。
Magnetのサンプルを参考にして、望みのショートカットコンボでprintができるようにしておきます。
これでMagnetの導入は完了です。
実現したい機能
WiFiTogglerはWi-Fiのスイッチングだけなので、シェルスクリプトを作成してNSTaskで実行しています。同じように、必要に応じて機能を関数などで実装しておきます。
Statusbar Application
今回の機能でアプリに求める動作は次のようなものでした。
- GUIは必要ない
- ショートカットを登録するだけ
そこで、起動してもWindowが表示されずDockにもアイコンが現れないステータスバーアプリケーションを作ることにしました。
こちらのWebサイトを参考にしました。"Adding a Menu to the Status Item"までの項を実装しています。 www.raywenderlich.com
Xcodeのプロジェクトの設定(Storyboardを用いないなど)は、このためです。
ざっくりと何をしたかというと、
- コードをコピペ(NSStatusBar, NSMenu)
- アイコン(32x32px)の作成とプロジェクトに追加
- img?.template = trueにします
- info.plistに追記(Application is agent : YES)
- Windowの非表示化
です。あとは、作成した関数(WiFiTogglerであればWi-FiのON/OFF切り替えスクリプトを実行する関数)をMagnetとNSMenuItemに登録してあげるだけです。
Login launch
もう完成はしたのですが、ショートカットをいつでも受け付けてほしいのに電源を入れた後に自分で立ち上げてあげないといけないアプリでは残念なので、ログイン後すぐに起動するようにしてあげます。手動でSystem Preference -> Users & Groups -> Login Itemsから登録してもいいのですが、コードを追加してアプリにやってもらいます。
参考にしたのはこちら。Applescriptを使わさせてもらいました。 questbeat.hatenablog.jp
とりあえずはこのくらいの機能があれば良いと思ったので、これで一旦開発を止めました。
今後の課題
せっかくショートカットを受け付けるために駐在してもらっているので、最近マイブームの自動スリープ防止機能を追加したいと思っています。caffeinateを使えば簡単にできるはずなのですが、先日作ったzshrcとの折り合いをつけないといけないので色々思索中です。 walkingmask.hatenablog.com
また、Clipyにはショートカットを自分で定義することができる機能があります。これはClipy/KeyHolderを使っており、これを利用させてもらって、コードでショートカットを定義しておくのではなくアプリから登録できるようにしたいところです。ここまで出来ればプチBetterTouchToolではないでしょうか。
あとは、Sleepに入る直前にWi-Fiを自動で切ってくれる、Sleepから復帰したらWi-Fiを自動で入れてくれる機能もあればいいと思ってます。
まとめ
Clipyは本当にとても素晴らしいツールで、最近友達にスニペットの登録を教えてもらいメールアドレスを手打ちする労力を削ることができましたが、ライブラリまで素晴らしくて素晴らしい尽くしです。MagnetやKeyHolderを使ってもっと色々したいですね。あとは、Xcode 8とSwift 3でどうやって開発していけるかも課題かもしれません。