Hatena::Diary

backyard of 伊勢的新常識 RSSフィード

2009/09/06(Sun)

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

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

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

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

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

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

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

必要なもの

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

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

f:id:iseebi:20090906113710p:image

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

f:id:iseebi:20090906113753p:image

f:id:iseebi:20090906113820p:image


なんか出たけどスルー

f:id:iseebi:20090906113858p:image


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


Hello World的な

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

f:id:iseebi:20090906113957p:image

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

f:id:iseebi:20090906114027p:image

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

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

f:id:iseebi:20090906114103p:image

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

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

f:id:iseebi:20090906114135p:image

おっ

f:id:iseebi:20090906114137p:image

おおおっ

f:id:iseebi:20090906114138p:image

お!

f:id:iseebi:20090906114139p:image


おおー!すごい!ヘッダファイルに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で実行です。

f:id:iseebi:20090906114659p:image

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

実機転送

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

f:id:iseebi:20090906114634p:image

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

f:id:iseebi:20090906114740p:image


全体的な感想

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

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

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

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

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

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

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

はてなユーザーのみコメントできます。はてなへログインもしくは新規登録をおこなってください。

トラックバック - http://d.hatena.ne.jp/iseebi/20090906/p1
おとなり日記