walkingmask’s development log

IT系の情報などを適当に書いていきます

MENU

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をインストールしてしまったため、最初はひどい目に遭いました。

まずはXcode 7をインストールしておくといいです。ここから入手。

インストールが終わったら、プロジェクトを作成します。この時、以下のことに注意。

  • 間違ってXcode 8で開かない
  • Storyboardを使わない
  • ここを参考に

作成したら一旦閉じます。

cocoapodsでMagnetの導入

Clipy/Magnetは、Clipyというスニペットアプリに用いられている、アプリの動作を一般ショートカットに登録できるライブラリです。これを使うと、驚くほどインスタントにショートカットをつくれます。 github.com

rbenvとcocoapodsの導入はこちらのWebサイトを参考に進めました。 qiita.com qiita.com

rbenvはbrewで1.0.0を、Rubyのバージョンは

[('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を用いないなど)は、このためです。

ざっくりと何をしたかというと、

  1. コードをコピペ(NSStatusBar, NSMenu)
  2. アイコン(32x32px)の作成とプロジェクトに追加
    • img?.template = trueにします
  3. info.plistに追記(Application is agent : YES)
  4. 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でどうやって開発していけるかも課題かもしれません。