Titanium MobileとRubyMotionの比較

双方とも脱Objective-Cを実現してくれるプロダクトだけど性格はけっこう違う。
共通で興味を持っている人が多そうなので思うところをとりとめもなく書いてみる。

取っつきやすさ

iOS SDK開発未経験者がとっつきやすいのはTitanium。おそらくRuby経験者でも。
逆にiOS SDK経験者ならばRubyMotionの方が入って行きやすいかもしれない。

RubyMotionはiOS SDKのAPIをタイトになぞっているためにiOS SDKのAPIに関する知識が必要だが、iOS SDKのAPIには直感的じゃない部分が多々あって、それに馴染むまでけっこう時間がかかる。その学習コストがけっこう高い。
TitaniumのAPIはTitanium独自のものだが整理されていて扱いやすい。学習コストは皆無ではないがiOS SDKに比べればずっと楽。

またObjective-Cよりマシとは言えRubyMotionで何かを実現するために必要なコード量はTitaniumのそれよりも概して多い。
例えばアラート一つ表示するにしても以下のような差がある。

Titanium
alert('HOGEHOGE');
RubyMotion
alert = UIAlertView.new
alert.message = 'HOGEHOGE'
alert.addButtonWithTitle 'OK'
alert.show

4倍の差ですよ。

ただ書き味はRubyそのものでさくさくプログラミングしていくことができる。
そのためオレオレ仕様のラッパーをどんどん作っていくのも簡単で、例えば上記のアラートの例ではショートカットの定義なども容易にできる。

class Shortcut
  def self.alert(message)
    av = UIAlertView.new
    av.message = message
    av.addButtonWithTitle 'OK'
    av.show
  end
end

これをアプリケーションコードのどこかに書いておけば、Titaniumには及ばないが以下のごとく大分短く記述できる。

Shortcut.alert('HOGEHOGE')

こうしたラッパーライブラリのようなものが充実してくれば、RubyMotionのiOS SDKの知識が必須という話は変わってくるかもしれない。
そしてRubyの柔軟性とRubyMotionのパワフルさにはそれを実現する可能性が十分にあると思う。
走りとしてすでにBubbleWrapといったものができていたりする。

機能性

思い通りのことができるかという意味で。かゆいところに手が届きやすいかどうか。
これはiOS SDKのすべての機能が使えるRubyMotionの方が上。

Titaniumでも通り一遍のことはできるのでほとんどの場合それで不自由を感じないが、今一歩手が届かないというギャップにはまってしまう時もある。モジュールを作ったり生成されたObjective-Cのコードにパッチを当てるといったフォローの手段はあるので、そうしたギャップもだいたいは解決できるが乗り越えるのにちょっと苦労するということで減点。

パフォーマンス

これはRubyのコードからバイナリにコンパイルしてしまうRubyMotionの方が上。
TitaniumはJavaScriptをインタプリタで動かしているのでどうしても遅くなり、パフォーマンスが要求されるアプリケーションには対応が難しい。

ユーザー

Titaniumはすでにかなりのユーザーがいて日本でのコミュニティ活動も活発。開発実績も揃ってきている。JavaScript自体のユーザー数が多く、今後もJavaScriptで開発できるという特徴は人気を集めそう。

一方でリリースされたばかりのRubyMotionは興味を持っている人はともかくユーザー数はまだ少なそう。有償と言うこともあるし。
見込みユーザー的に言うと既存のRubyプログラマーでiOS開発に強いモチベーションを持っている人間というのはそれほど数がいない気がする。どちらかと言うと現在Objective-CでiOS開発をしていて、Objective-Cにはもううんざりだよ、という人達がターゲットなのかなという気がする。

ライブラリ

Titaniumは多くのJavaScriptのライブラリのほか、ネイティブ言語で書かれたモジュールにより機能拡張ができる。そうしたライブラリをマーケットプレイスで売ったり買ったりできる仕組みがあるのも面白い。

RubyMotionはCocoaPodsによってObjective-Cで書かれたライブラリが使えるほか、Rubyで書かれたライブラリもapp以下に設置すればビルド時にコンパイルされる。
ただしRubyの既存のGemはほぼ使えない。例えばRubyMotionはアプリケーションコード内でのrequireをサポートしていないのでrequireが含まれたものは全滅するなど。

追記

RubyMotion用のGemが作れると言うけどドキュメントにはないなと思っていたら書き途中と言うことみたい。

https://twitter.com/#!/lrz/status/198781031619379202

TDD

TitaniumはJavaScriptのテスティングフレームワークが使えるが定番のものはなく、各自それぞれ試行錯誤している模様。Jasmine Titaniumとか作っていた時期が俺にもありました。

RubyMotionは標準でMacBaconというRSpecクローンを用いたテストをサポートしている。標準のものがあるというのは大きい。

デバッグ

TitaniumはTitanium StudioというIDEがあってデバッガ完備。でも自分はそれを使いこなせないオールドタイプなんだけど。

RubyMotionはコンソールにログがでるだけだけど、クラッシュしたときのエラーメッセージがObjective-Cでの開発に比べると分かりやすく出るようになっていて助かる(それでもたまに黙って死ぬけど)。
それからインタラクティブシェルが面白すぎる。rakeした後のコンソールにプロンプトが表示されるのだけど、ここにコードを打ち込むとシミュレータ上で動いているアプリケーションをいろいろと操作することが可能。iOS SDKのAPIの挙動のテストなどもいちいち再コンパイルすることなくできるの超便利。

プラットフォーム

TitaniumはiOSとAndroidのクロスプラットフォーム対応。
RubyMotionはiOSのみ。RubyでAndroid開発したいならRobotoがあるよとのこと。

安定度

RubyMotionはこのあたりが未知数。個人的に過去に作ったアプリを移植してみて様子を見てみたい。
Titaniumは開発中は様々不思議に出くわすが、出来てしまえば不安定と言うことはない印象。

将来性

Titaniumはこの点心配なさそう。

RubyMotionは未知数。有償版のみということでユーザー数の伸びがどうなるのかわからないし、RubyでiOSアプリが作れるということであればMobiRubyという競合が今夏リリース予定だったりもする。

サンプルコードを眺めるとMobiRubyはRubyそのままというわけでもないようなのでRubyMotionの方が使いやすそうではあるが。

最後に

色々比較してみたけど特に結論は無い。
つらつら書いたことが何かの参考になればこれ幸いと行ったところ。

とりあえずすでにObjective-Cで書いてる人にはiOS SDKの壁はないと思うのでRubyMotionマジオススメ。

Rubyが使えるからとRubyMotionを買った人は思ったより簡単じゃないのでちょっとがっかりするかもしれないけど、せっかく買ったんだからお金がもったいないし、がんばってiOS SDKの壁に挑んで欲しい。
ついでにMacRubyに目覚めたりすると世界が広がるかもしれないし。

前の記事

RubyMotionでCocoaPodsを使う

次の記事

RubyMotion Weekだった今週