クロスプラットフォーム開発についての考察[Android/iPhone]

Aizu Advent Carender 2013 の 17日目の記事です.

今回はスマートフォンでのクロスプラットフォーム開発のお話をしたいと思います.

[はじめに]

アプリ開発においてAndroidJavaiOSobjective-Cを必要とします。(今回はこの2つのOSに重点を置きます)
しかし、AndroidでもiPhoneでも同じアプリを作る場合、2つの言語を使うのは学習コストが高すぎるということで、
多くの開発者がクロスプラットフォーム開発のツールを作り始めました.

[どんなものがあるの?]

ツール名 説明 使用言語 使用料金
Titanium mobile ネイティブ APIが提供されている JavaScript(以下JS) 無料
PhoneGap webviewアプリケーション HTML,CSS,JS 有料
Jquery Mibile jqueryベースなwebviewアプリケーション JS(HTML,CSS) 無料
Sencha Touch webviewアプリケーションでネイティブシェルを使用できる HTML,CSS,JS 無料
Unity 言わずと知れたゲームエンジン C#,JS,Python 無料(object等が有料)
CoronaSDK スマートフォンゲーム用のSDK lua 有料
Qt OpenGL,SVGなどに対応している C++ オープンソース版は無料
Xamarin .NET Frameworkを使用できる C# 有料
Caede デスクトップとモバイルに対応 Curl 無料
Intel XDK chromeプラウザ上で開発をする HTML5,JS 無料

この他にも沢山ありますが、これぐらいにしときます(許して


[本題]

今回紹介したいのはTitanium mobileです.
なぜかというとこの中で一番将来性があると感じたからです.
僕が使ってるっていうのもありますけど.
なのでここからはTitanium mobilenのお話です.
読み方はタイタニウム モバイルです.(チタニウムじゃないよ!)
あと今日(?)新しいSDK(3.2.0GA)がでます!(((o(´∀`)o)))

[特徴]

[長所]

  • ネイティブのAPIがサポートされているためJSなのにネイティブと同等のことができる.
  • 動作が高速
  • 無い機能はJava(Android),Objective-Cで実装することにより補うことができるため実質できないことはない.
  • メモリ管理をする必要性がない(自分としては正直短所な部分でもある)
  • 多くのモジュールがすでに存在している(githubやtitanium storeに存在)
  • AlloyというMVC frameworkがあり開発がかなりしやすい.
  • ドキュメントがかなり充実している.
  • SQLite,ファイルシステム,GPS,google MAP,FaceBook,HTTP系の機能は充実している.

[短所]

  • GC本当に動いているのか信用してないので明示的に開放させる必要がある(個人の感想)
  • fpsが60とか必要なゲームとかには圧倒的不向き(後から補足します)
  • 情報がまだ充実していなくて大半英語の資料を読まなければならない
  • Android2.X系には正直使えない.

[アーキテクチャ]


Titaniumが提供しているAPIを噛ませてる.
OSの上にJSインタプリタを乗せている.

[リンク]

Site
Repository
Reference
ドットインストール

[Hello World]

今回はAlloyを使わずにいきます。

(function(){
	var base = Ti.UI.createWindow({
		width:Ti.UI.FILL,
		height:Ti.UI.FILL,
		backgroundColor:"#ddd"
	});
	
	var helloWorld = Ti.UI.createLabel({
		text:"Hello World!",
		color:"#111",
		font: { fontSize: 20, fontFamily: 'Didact Gothic', } ,
		textAlign:"center"
	});
	
	base.add(helloWorld); 
	base.open(); 
	
	//event
	helloWorld.addEventListener('singletap',function(e){
		alert(e.source.text);	
	});
	
})();

iOS(iOS7)

HelloWolrd!という文字をタップしたとき

Android(2.X系)

HelloWolrd!という文字をタップしたとき

めっちゃ簡単!

もちろん、ネイティブのUIを使っているのでOSのバージョンによってUIも違います.
ネイティブのUIは大体あると思っていいと思います.
また、IDEをカスタマイズするとXcodeやEclipseUIのようにUIをペタペタ貼ることもできます.

[OSによって異なる挙動をさせてみる]

(function(){
	var module;
	
	//OSを判断させる
	if (Ti.Platform.osname == 'iphone') {
		module = require('com.abouthiroppy.iphoneText');
	}	
	else if(Ti.Platform.osname == 'android'){
		module = require('com.abouthiroppy.androidText');
	}
	
	var base = Ti.UI.createWindow({
		width:Ti.UI.FILL,
		height:Ti.UI.FILL,
		backgroundColor:"#ddd"
	});
	
	var helloWorld = Ti.UI.createLabel({
		color:"#111",
		font: { fontSize: 20, fontFamily: 'Didact Gothic', } ,
		width:Ti.UI.SIZE,
		height:Ti.UI.SIZE,
		textAlign:"center"
	});
	helloWorld.text = module.text();
	
	base.add(helloWorld);
	base.open();
	
})();

このような感じで共通ソースは同じでJavaで実装した部分はObjective-Cに変える等の処理が簡潔に書けます.
しかし、大半レイアウトで崩れる(Androidは特に)場合がでるのでOSによってソースは分けることを推奨はします.

[実装の比率は?(言語)]
多い時で僕はだいたい8:2 = JS:Objective-C ぐらいです.
しかし大半JSだけでどうにかなります.

[Titaniumでのゲーム開発はできるのか?]
実はゲーム用のモジュールが存在しています.
しかし、やはりネイティブで書いていないので限界はあります.

[来年には激しいゲームも快適に作れる?]
こちらの記事を見てもらえればわかるのですが、今Titaniumは次世代のバージョンに移ろうとしています.
それがTi.Nextです.
またHyperloopというコンパイラがかなり高速(現状より400倍かそれ以上らしい)で、期待大です.

参考文献

[マーケットにだせるの?]

iOS,Androidどちらも出せます.
またtestFlightやadhoc配布もできます.

[宣伝]
最近だしたアプリ こちら
メモを通知センターに残せるアプリやでw

[最後に]

今の時代、かなりスマートフォンの性能が上がっているのでクロスプラットフォームという手も考えてもいいと思います.
しかし、何を作るかによってクロスプラットフォームで行くかどうかをしっかりと見定める必要があると思います.

何かわからないことがあったら@about_hiroppyに聞いてください.
つぎはやくもさんです.
長々付き合ってくれてありがとうです!