先日ちょっとしたMacアプリを作ったのですが、iOSアプリとの共通点や違いについて簡単にまとめてみます。
僕は業務や個人でふだんiOSアプリは作っているのですが、Macアプリは今回が初めてでした。全体としては、もちろんMac特有のお約束もあるにはあるのですが、iOSに馴れた人ならわりとすぐMacの開発が始められるという印象です。
今回作ったアプリはメニューバーに常駐するフィードリーダーで、Google Reader終了のタイミングで作りました。見た通り、非常にシンプルなものです。
更新された記事がレイアウトされるメインウィンドウが1枚、設定ウィンドウが1枚、インターフェースはそれくらいで、あとは記事の取得と保存にバックエンドで動くクロールマネージャがあります。
購読フィードが多い場合、クロールマネージャは適宜分割して読まれるブログを重みづけしつつ、バックグラウンドでクロールしていきます。ある程度新着がたまったら、メニューアイコンが点灯して通知してくれます。
共通点
なりたちとしてiOSがMac OSのサブセットなので、言語としてはもちろんSDKを構成するクラス群も多くが共通です。双方のSDKを比べると、NS接頭子のクラスはおそらくMac OS SDKからiOS SDKに移入されたもので、そのまま同じものが使えます。NSString、NSArrayなど。
UIKitはiOS固有のフレームワークで、たとえばUIViewはMac OSだとNSViewになります。新しいだけにiOSの方が微妙にリファインされている感じですが、ビューのヒエラルキーやframeでの座標指定などは同じです。
blocksやARC、オブジェクトリテラルなど、新しめの記法もiOSに限らず同様に使えます。
データモデルはCoreDataがあり、これも共通です。
なので、モデル層のライブラリなどは結構Macにも流用できます。たとえばhttp通信のAFNetworkingなども、Macで同じように使えました。
相違点
共通点は非常に多いのですが、Macならではの点ももちろんあります。今回気づいた範囲では、次のようなところです。
ウィンドウとメニュー
デスクトップアプリなので、ウィンドウとメニューバーがあります。どちらもインターフェースビルダーで作れます。ウィンドウはその上にビューを配置してアプリのプレゼンテーションを作り、メニューにはコントローラに書いたアクションを接続してやります。iOSでもおなじみの操作で、あまり迷いません。
細かいところでは、ボタンの文字色を設定するところが見当たらず、ないはずないと思ってけっこう探してしまいました。MacではAttributedStringを使ってやるようです。
コントローラ
AppDelegateは同じですが、その先のViewControllerにあたるクラスはありません。コントローラが必要なところはNSObjectをベースに作るというやり方で、画面遷移に対応してコントローラが並んでいくiOSアプリとちょっと異なります。
今回はウィンドウ毎に作りましたが、アプリ全体で一つでも可能で、かなり自由です。コントローラを中心にUIとアクションを結んでいくやり方は同じですね。
Cocoa Binding
Macアプリならではという点では、Cocoa bindingというのが強力でした。これはModel - View - Controller の結合部、つなぎ目を抽象化する一種の規約というかメカニズムなんですが、その抽象化の結果、コードなしでDBのデータをテーブルビューに表示する、といったことができるようになっています。
使える場面は限られていますが、コードを書かずにデータの表示や更新ができてしまうというのはちょっと新体験で感動します。
上の画像は、これだけだとちょっと分かりづらいですが、Cocoa Bindingを使って購読ブログの一覧をテーブルビューに表示しています。ビュー上で編集を行うと、結果がそのままDBまで反映されます。
動作確認と配布
あとは開発の周辺ですが、ちょっと作ってみて配布するというのがiOSアプリより簡単です。XcodeでRunすれば開発しているMacでアプリが動作しますし、バイナリをzipして送れば他のマシンでも動かせるし、App Storeに上げなければ審査もありません(むしろこれは、iOSの面倒くささに慣らされてしまっているのかもしれない・・)。
他方、シミュレータがないためOSのバージョン違いの確認などは面倒です。10.8と10.7でAuto Layoutの表示が微妙に違うのがわかり、旧いairを引っ張りだしてLionを入れ直したりしました。
おまけ
ということで、iOSからMacアプリを作ってみたときに感じた共通点・相違点をまとめてみました。スマートフォンとデスクトップという違いはありますが、開発の流れとしては見た目ほどの違いはないというのが印象です。
Macユーザーは増えていますし、以前はややマイナーなイメージのあったMacアプリケーション開発も、今後はけっこう一般的になってくるかもしれません。今回のフィードリーダーもそうですが、ちょっとしたユーティリティなどを自分用に作るだけでも便利です。
おまけとして、Macのメニューバーにアイコンを出すだけの、常駐型アプリのスケルトンを上げておきます。テンプレとしてよかったらご利用ください。
メニューバーアプリのスケルトン
https://github.com/inonb/MacMenuApp
フィードリーダー Stand
http://standmag.co