読者です 読者をやめる 読者になる 読者になる

Objective-Cを絶対書きたくない人向けのiOSアプリ開発ソリューションの総括

有償、無償のやつがいろいろあって最近試してみたのでメモ書きを残しておいた*1

最初にことわると、既に何かしらの言語を身に付けているプログラマー向けの記事になる。プログラミング自体の入門者は学習環境が整っているので絶対Objective-Cから入った方がいいです(個人的にはP*言語系でウェブ開発フルセット身に付けるよりか楽だと思う)。

Objective-Cを避けたい動機

  • 未知のプログラミング言語を習得するコストがツラい
  • Objective-Cは潰しが効かない(iOS & Macアプリ開発でしか使わないじゃん)
  • Android版など。なるべく移植性を高くしたい
  • Xcodeを使ってコーディングするのがいやだ。愛用しているエデイタで開発したい
  • 開発環境が強制される。不自由で邪悪なので使ってはいけない。

とまあ人によっていろいろある

比較表

本記事でとりあげたものの簡単な比較表をテーブルにしておいた。費用は個人の開発が制限のない本番アプリリリース程度のプランを基準に、まあ価格改定で将来的に変更されていそうなので参考程度に……
当然どれも実機テスト&リリースにはAppleとの契約は必要。
手元で試用するだけならどれも無償でこなせる。ただRubyMotionだけは支払いが必要で返金制度でシクロヨ! って言ってた(そのうちトライアル版提供されそうだけど)。

プログラミング言語 費用 開発ツール 拡張性 デバッグ環境 UI定義 プラットフォーム 開発元 ソースコード ユーザー数 ゲーム開発
RubyMotion ruby 新規 \20,219, 継続 \10,000/年 エディタ、RubyMine シミュレーター、実機 ハードコード,IB OS X HipByte 非公開
Xamarin C# $299 Xamarin Studio シミュレーター、実機 IB OS X, Android Xamarin 非公開
PhoneGap JavaScript 0 エディタ、Xcode シミュレーター、実機、ブラウザ HTML+CSS Android, HTML5 Adobe Apache(Cordva)
AIR ActionScript Creative Cloud \2,200/月〜 (SDK + IDE \0) Adobe Flash Professional, 各種IDE製品 Flash Player、実機 Flash Android Adobe 非公開
Titanium JavaScript 0 Titanium Studio, エディタ シミュレーター、実機 XML+CSS Android, Windows, Blackberry, HTML5 Appcelerator Apache
RoboVM Java 0 Eclipse シミュレーター、実機 ハードコード Android Trillian AB GPL /Apache

ゲームエンジンの類はパス

いわゆるゲームエンジンについてもこの話題にあてはまるものが多いけれど、扱う対象が多すぎてしまうので以下にあげるのみで済ます。ゲーム以外にも汎用的なグラフィックフレームワークとかゲームにも向いてるんだけどGUIツール系も構成できないこともない、という感じのも含む。

Unity全盛、cocos2d-X流行り始めたという近況だけれども2Dに関してはcocos2d-X JS / cocos2d-html5 が今後延びしろがありそうだと予測している。

近年カジュアルゲーム界などでご活躍いただいていたcocos2d for iPhone氏(2008〜)についてはAppleがiOS7で公式に*NDA*な*NDA*ので*NDA*が*NDA*バモラ*NDA**NDA*ラモスという話もあるらしいですよ。

検討するポイント

どういうアーキテクチャで実現されているのか

以下の要項を判断する為に知っておいた方がいい。

ウェブ上の記事、インタビュー、ITカンファレンスでの発表資料、公開されていればソースコードなどが参考になる。

昔はスクリプトエンジンをアプリに含めるとアップルにリジェクトされてたんだけど、最近はリモートからダウンロードしたスクリプトを実行するのでなければOKという感じらしい。ただアップル公式見解というわけではなく開発者の中で言われてるだけで、スクリプトを一旦ダウンロードしておいて、保存したローカルスクリプトを実行するのはセーフ? などの疑念もある。

iOS以外のプラットフォームのサポート

前述の移植性の為の検討事項。

あと非Mac OS Xで環境で開発できるかというのもあるけど、リリースバイナリはクラウドでも作れど、結局のところリリースにはMac機必要なので考慮しないことにした(代行してもらうなど手段はあるけど……)。

UIKitのサポート/非サポート

採用しているアーキテクチャによってはUIKitの利用が難しいことがある。通常のユーティリティアプリでUIKitの作法が使えないとUX向上の難易度がグッと上ったり、不自然になり変則的なUIを採用せざるをえなくなる。

将来性

現在どのぐらい注目され、どの程度ユーザーがいるのか。開発は活発なのか。
ソースが公開されて適切なライセンスが制定されているのか。その企業がサポートをやめたら自分のコードは動かなくなるのか?
iOS SDKの高速なリリースサイクルについていけるのか? または次期iOSJavaScriptエンジンAPI追加などSDK強化によって恩恵を受けやすいか。

デバッグのしやすみ

アプリをどこで実行させデバッグするのか。開発にかける時間としてデバッグの占める割合は大きい。快適にデバッグができるかどうかというのも選考点に値する。
Objective-C言語を使うことでwritingの速度を3倍上げても、debugging効率が10倍ぐらい落ちると結局Objective-Cで作った方が早いというのは悲しい。

よく紹介文や売り文句として「(複雑なことはできないけど)簡単なアプリなら○○でも充分そうですね」という定句があるけど、簡単なアプリはどう作ったて簡単なんだから当たり前である。

RubyMotion

http://www.rubymotion.com/

rubyiOS/OS Xアプリを開発する為のツールチェーン。
rubyシンタックスでFoundation+UIKitのAPIを呼び出すのでどっちかというと「Objective-Cっぽいruby」という見た目になる。この不自然さを解消するラッパーライブラリなどがコミュニティから出てきているのでいずれObjective-Cっぽさは脱臭されるかもしれない。
だがCoffeeScript -> JavaScript実行環境のような関係で*2効率よく開発する為にはRubyコードが最終的にどうCocoa APIを呼び出すのかという知識が必要になる

コアは公開されていなけどrubyベースのビルドスクリプトまわりだけソースコードが公開されている

IDEフリーな部分も人気。
好みのテキストエディタ + Dash などのコーディング環境がよく使われている。

インタラクティブコンソールで実行中のアプリに対してrubyコードを実行できる機能がある(あんまり推されているの見たことないけど最近のObjective-C+LLDBの対話環境もかなり強力になっててダイナミックにObjective-Cコード発行できるようになってる)。

でも最大のセールスポントはObejctive-Cコミュニティのライブラリ資産が利用できること。他のフレームワークがネイティブ拡張という段階を踏まないといけない部分を、iOS/OSXに特化+Objective-Cモジュールと平行した関係にあるRubyMotionはほぼ無加工でCocoaPodsに蓄積されたObjective-Cモジュールを利用することができる。

あと面白いのはテストフレームワーク。インテグレーションテストもカバーした独自RSpec風のモジュールとコマンドラインテスト環境を提供している。ここはテストフレームワークがxctest+Xcode(SDK)にがっつり依存したObjective-Cのテスト環境とは全くことなるものになっていてRubyMotion独自の魅力にもなっている。

コマンドラインによる伝統的なデバッガでの対話操作はできるものの、GUIXcodeと同等のデバッグ環境を手に入れるにはRubyMotionを公式サポートしている有償IDEのRubyMineなどを使う必要がある($99 程度)。
2012-2013年にかけてユーザーがどんどん増えていっておりカンファレンスや、各地での勉強会が活発になってきた。

アーキテクチャ的にもiOS SDKの変更に追随しやすくなっているようでiOS 7 SDK betaリリースに速攻で対応していてビビった。

RubyMotionは他のブリッジ系のライブラリ(某タニウム)とは違いすごく低レイヤーな部分に徹しているため、iOS7が出た時も既存のビルドシステムのコンパイラーの設定をちょっと書き換えるだけで対応出来るので新しいバージョンがいくら出ても当日対応できるという話が聞けて良かった。

RubyMotion KaigiでLTしてすべりました #rubymotionjp | ましましブログ

以下のインタビュー記事に内部仕様への言及がのってる

アプリ制作事例
http://www.rubymotion.com/apps/

Xamarin iOS

http://xamarin.com/monotouch

元MonoTouch。C#コードをコンパイルしてネイティブコード(Objective-Cのことではない)にする。
UIKitはブリッジ用のライブラリ経由でUIKitを使う。
Xamarin StudioというMonoDevelopをベースにした専用IDEが提供されている。
Xmarin Studioはすごい。Storyboardやインターフェイスビルダー相当の独自デザイナーツールを搭載してるので非標準iOS開発環境(AppCodeとか)の中で先行ってる。
C#コードに対してブレイクポイント張ってiPhoneシミュレータで操作しながらステップ実行や変数watchやらひととうりこなせ完成度が高い。値段も高い。

アーキテクチャなど詳細は以下の記事がくわしい

PhoneGap

http://phonegap.com/

またの名をApache Cordva。HTML+JavaScriptでウェブアプリを作る。
UIWebView + ネイティブAPI呼び出し用のJavaScriptライブラリをアプリのリソース内に埋め込む方針。
UIも含めてUIWebView上に全部展開される。この為ネイティブなGUI=UIKitは利用できない
そのかわりにいろんなモバイルOSのプラットフォームのWebViewコンポーネントさえあれば動くというトレードオフになっている。
ソースは公開されいて、誰でも無償でアプリ開発をはじめられる。

PhoneGapでユーティリティーアプリを作る時の注意点としてデフォルトUIKitに見た目を似せてデザインをしないようにした方がいい。アニメーションやタップの違和感が悪目立ちして偽物っぽくなってしまう。

アプリ制作事例
http://phonegap.com/app/

PhoneGapの開発環境を拡張してウェブブラウザ上でコーディング、ビルドできるサービスをPHP関連の活動で有名なアシアル社がやってる。またインテルもappMobiという会社を買ってPhoneGapベースのHTML5アプリ開発環境作っている。

Adobe AIR for iOS

http://www.adobe.com/jp/devnet/air/air_for_ios.html

Adobe Flash Professionalなどを使いFlashアプリをActionScript 3で書く。
Flash技術でiOSアプリを作るというよりは、一旦Flashムービー形式で作成したアプリケーションをiOS向けにパブリッシュできるようなイメージ
iPhoneにインストールするには配布形式のipaで書き出してそれをiTunesXcodeで転送する
なので基本的にはデバッグFlashプレイヤー上でやってくれという感じなんだと思う
iOSでしか動かないAPI呼び出しどうすんだという問題があるから、上記ipaの中にFlashの開発環境と通信できるモジュールを埋め込みリモートデバッグみたいなことができるようになっているみたい
UIKitのことは忘れないといけないので、どっちかというとユーティリティツールよりは軽いゲームやインタラクティブな映像作品の制作に向いていそう
サラからの費用はCreative Cloudを年間契約して毎月云千円払うか(http://www.adobe.com/jp/products/flash.html )、8万円ぐらい出して旧バージョン買うかなので割高に感じる。あくまで現Flash製品ユーザー向けのサービスかな。

IntelliJ IDEA Ultimateユーザー向けには対応したプラグイン環境があるらしい。(thx! https://twitter.com/kaikoga/status/349346512452599809 )。まあFlash Professionalが必ずしも必要というわけではなくて、SDK+AIR開発に対応したIDEやエディタで代用できるってことだな。

でもPhoneGapやCreateJSとの兼ね合いからなのかAdobe的にそんなにチカラ入れているように見えない(すいません)。

アプリ事例
AIR for iOSのアプリたち - NAVER まとめ

Titanium Mobile

http://www.appcelerator.com/platform/titanium-platform/

JavaScriptでコーディングできる。
Appcelerator Platformというより包括的な開発環境の一部という位置付けで、モバイルBaaSでのクラウド環境やらエコシステム、マーケットなど盛り沢山になってる。
PhoneGapがUIWebViewにJavaScriptの実行を任せているのに対してTitaniumはカスタムJavaScriptエンジンをアプリの中に埋め込んで実行している。
UI層もHTMLをレンダリングするのではなく、JavaScriptエンジンを介してネイティブのUIKitのAPIを呼び出している
最近のバージョンはUI層をXMLで宣言的にマークアップしてCSSで装飾できてMVC分離しやすくなってる。
Titaniumは変化のスピードが早いので最初に話題になった頃にチェックした人は認識が古いかも。今ここでもう一度初めての Titanium のスライドでAlloy以降の動向がおさらいできる。
ソースコードは以下の部分がGithub上で公開されている

SDK+コマンドラインツールと好みのエディタでも開発できるが、Aptana Studioベースの独自IDEがリリースされておりこれを利用するとデバッグが楽になる

アプリ制作事例
http://www.appcelerator.com/customers/app-showcase/

RoboVM

*4

http://www.robovm.org/

ジャバ。
まだアルファ版段階。最近リリースされた中ではかなり有望に見える。
まだ最低限のドキュメントしか用意されてないけどeclipseプラグインが提供されていて試用が簡単だった。

いわゆるデバッグ実行はまだサポートされていないのでブレークポイント反応しない。

公式ブログではJavaFXアプリのコード動かしてた

どのぐらいできるのかちょとっと触ってみたけどNSURLRequestにNSURL食わせる方法がないなどまだ絶賛作り中という状態だった。
Object.alloc.initWithはどうやって表現してるんだろうと思って確認してみたら new Object() の引数の中に特定の型の値を決め打つ感じみたいだ。複数の引数はどうなるのか……

あとむしろ逆にObjective-CAndroidアプリ書ける環境も欲しい。

この辺が気になる

まだ試してないものとか、スクリプティングみたいなものも含めれば他にもいろいろあるけどカバーしきれないので思いついたのだけリストアップしておく

結論

iOSアプリ開発に限らずに、これをやりたいんだけどプログラミング言語がネックという話よく聞くんだけど(※例 https://twitter.com/laiso/status/347167170066776065 )


○○言語で□□がやりたい → 茨の道

vs

□□がやりたいので○○言語を学ぶ → たのしくないプログラミング


という構図なので、言語愛や悟りを開くなどして茨の道に精神が耐えられる人は前者を選択しましょう。
結局は後者の道中にたのしみが見出せるような人のが役得だなと思いました。

それでもまだ迷っている人向けに建設的な意見を述べておくと、どの方法を取ってもiOSアプリ開発は地獄である。