C#でiPhone開発!MonoTouch Beta ファーストインプレッション

iPhoneの開発はXcodeObjective-C。そんな常識が打ち破られる時が来ました。

もともとVisualStudioヘビーユーザーだった僕としてはXcodeはまだまだ補完機能がしょぼくて本当にやりたいことができるまで定義定義の嵐でやきもきして途中でやる気がなくなってしまいます。

そうこうしているうちにMonoTouchというライブラリが発表されました。.NETのオープンソース実装をしているMonoプロジェクトの外郭として開発された、.NETを使用してiPhone開発をできるようにしたライブラリです。

.NETは中間言語JITコンパイルする技術なのですが、言語処理系をiPhone上に実装すると規約違反となり、AppStoreで販売できません。そこで、MonoTouchでは先に全部コンパイルしてしまいます。*1

Monoの名前を冠していますが、(Novellから?*2 )製品として販売されるようで、けっこうなお値段がするような気がします・・・。

今回、ベータテスターとして選ばれ、実際に触ってみる機会を得ましたので、実際のMonoTouchでの開発はどのようになるのかご紹介します。

必要なもの

  • Leopard以上の入ったIntel Mac
  • iPhone SDK
    • .NETだからといってMacが不要になるわけではなく、実機転送や最終的なパッケージングなどはiPhone SDKに依存するためMacが必要になります
  • Mono 2.4
    • 一般に配布されているMonoのパッケージをダウンロードしてセットアップします。
  • MonoTouch
    • MonoTouchのSDKはpkg形式のインストーラで提供されています。ダウンロードしてインストールします。
  • MonoDevelop 2.2 アルファ版 (MonoTouch対応版)
    • MonoTouchを使ったiPhoneアプリケーションのプロジェクトが作成できるように設定されています。MonoTouchと一緒に配布されているのでインストールします。

MonoDevelop起動、プロジェクト作成

インストールが終わって早速MonoDevelopを起動してみましたがメニューとかが文字化けしてしまいます。っき雑記: MonoDevelop 2.0 AlphaのMac OS X版で日本語を表示する方法にある方法で対処しました。

早速iPhoneプロジェクトを作ってみたいと思います。ファイル→新規作成→ソリューション です。C#のところにiPhoneというのがあるので、その中から「iPhone MonoTouch Project」を選んでみます。


なんか出たけどスルー。


プロジェクトができました。

Hello World的な

とりあえず、ボタン押したらカウントアップするアプリでもつくりましょう。*3ツリー上のxibファイルをダブルクリックするとInterface Builderを起動します。ボタンとラベルをおきました。

インスペクタを開いて、xibのウィンドウからAppDelegateを選択します。一番右のタブでClass Outletsにラベルとボタンを定義します。

その後、AppDelegateをcontrolキー押しながらドラッグして、ボタンとラベルにそれぞれドロップします。

Interface Builderを終了させるとMonoDevelopへ戻ります。designer.csを見てみましょう。

勝手にプロパティが生成されています!@property(nonatomic, retain) ほげほげとか@synthesizeとか書いてたのがまったく必要ない!やっぱりこうでなきゃ!!

ところで、アウトレットは定義しましたがアクションは定義しませんでした。どうするか。MonoTouchには各アクションにイベントが定義されていますので、コードの自動補完でさっくりいきます。FinishedLaunchingに追記していきます。

おっ

おおおっ

お!


おおー!すごい!ヘッダファイルにIBAction定義してとかやってたのが全く不用!正直controlとスペースとEnterだけあればコード書ける勢い。

まあ最終的にこういうコードにしておきました。

using System;
using System.Collections.Generic;
using System.Linq;
using MonoTouch.Foundation;
using MonoTouch.UIKit;

namespace HelloMonoTouch
{
	public class Application
	{
		static void Main (string[] args)
		{
			UIApplication.Main (args);
		}
	}

	// The name AppDelegate is referenced in the MainWindow.xib file.
	public partial class AppDelegate : UIApplicationDelegate
	{
		int count = 0;
		
		// This method is invoked when the application has loaded its UI and its ready to run
		public override bool FinishedLaunching (UIApplication app, NSDictionary options)
		{
			// If you have defined a view, add it here:
			// window.AddSubview (navigationController.View);

			pushButton.TouchDown += PushButtonTouchDown;
			window.MakeKeyAndVisible ();

			return true;
		}

		void PushButtonTouchDown (object sender, EventArgs e)
		{
			count++;
			countLabel.Text = string.Format("Count : {0}", count);
		}

		// This method is required in iPhoneOS 3.0
		public override void OnActivated (UIApplication application)
		{
		}
	}
}

では、Xcodeと同じく、command+enterで実行です。

でキター!!!あまりのあっさり成功っぷりに感動。

実機転送

実機転送するには、事前にXcodeで作ったアプリケーションが実機に転送できる状態にしておけば、あとはプロジェクトを右クリックしてオプションを開き、iPhone ApplicationのところからApplication Signingにチェックを入れておくとビルドしたときにコードサインしてくれるようになります。

実機バイナリ用に構成設定を変更する必要があります。表示→ツール→ビルドを選択するとビルド構成切り替え用のツールバーが出現します。ここで、Debug|iPhoneを選択して、ビルドメニューからBuild Allを選びます。その後、実行メニューからUpload Deviceを選択すると実機へ転送できます。

全体的な感想

やっぱり、定義定義でなかなか先に進めないiPhoneプログラムが一気に楽になるなーってのを感じました。

C#が使えて主なクラスライブラリがほとんど使えるという事は、WMとのクロス開発も夢ではありません。

あと、数年前までかなり微妙だったMonoDevelopが思いのほか使い物になってるのにびっくり。コード補完もIntelliSenseばりに動いて全然まともに。いやー、もうObjective-C書きたくなくなってきた・・・。

最大の懸念点はこのライブラリの値段。いったいいくらになるんだろう・・・

*1:なので、System.Reflection.Emitとかで動的生成はできない

*2:インストール時の規約ではNovellって書いてあった

*3:元ネタ:http://www.youtube.com/watch?v=M0VoyhKFmWg