Skip to content

MonoTouch 開発チュートリアル

一般的に iPhone 向けのアプリケーションは Objective-C で書きますが、MonoTouch を使うと、C# で iPhone アプリを開発することが出来ます。Apple は iPhone 上にスクリプトエンジンや JIT コンパイラを実装することを許可していないのですが、MonoTouch はコンパイルを静的に行い、JIT コンパイラなどの不要なランタイムを省くことで、Apple のライセンスに抵触することなく、iPhone 上で C# による開発を実現しているそうです。詳しくは以下の URL が参考になります。

MonoTouch の公式ページには素晴らしい チュートリアル が用意されており、ここではそのチュートリアルに従って MonoTouch で iPhone アプリケーションを開発してみます。

事前準備

http://monotouch.net/Documentation/Installation によると、MonoTouch での開発を始めるには以下が必要だそうです。MonoTouch をインストールする前に、Mono をインストールしておく必要があります。

  • iPhone SDK 3.0 以降
  • Mac OS X 10.5 以降
    • Leopard か Snow Leopard が必要だそうです。
  • 最新版の Mono
    • バージョンに関して明記されていませんが、「The latest release of Mono for OS X」だそうです。Mono は ダウンロードページ からダウンロード出来ます。
  • MonoDevelop
    • Mono 用の IDE(統合開発環境)である MonoDevelop ですが、現時点では MonoTouch を統合したバージョンは正式リリースされていない為、Redirecting… から Trunk Build 版をダウンロードする必要があります。

MonoTouch のインストール

メールアドレスさえ登録すれば、http://monotouch.net/DownloadTrial から無料で MonoTouch の評価版をダウンロードすることが出来ます。評価版は、特に利用日時や機能の制限は無いようですが、作成したアプリケーションを iPhone Simulator 上で動作させるのみで、iPhone 実機や AppStore 向けに配布出来ない、という制限があります。

評価版をインストールしていても、Novell からライセンスを購入し、そのライセンスを入力(アクティベーション)すれば、製品版として利用できます。

MonoDevelop での開発

MonoDevelop を起動します。起動直後は以下のような画面になっているはずです。

01

最初に iPhone 開発用のソリューションを作ります。MonoDevelop のメニューから「ファイル → 新規 → ソリューション」を選択します。

02

「新しいソリューション」というウインドウが開くので、ソリューションに関連する項目を設定します。まず、ソリューションの種類を選びます。MonoTouch で iPhone アプリケーションを開発する場合は、左上のペインから「C# → iPhone」を選択した後、右上のペインから「iPhone MonoTouch Project」を選択します。「名前」の欄にはソリューションの名前を指定します。今回は「HelloiPhone」にしました。「位置」にはソリューションを保存するディレクトリを指定しますが、今回はデフォルトのまま(ユーザのホームディレクトリ配下の Projects ディレクトリ)としました。必要な項目を指定したら「進む」をクリックします。

03

次に、パッケージの機能を指定します。ここでは特に設定する項目が無いので、「OK」をクリックするとソリューションが作成されます。

04

ソリューションが作成されると、MonoDevelop の右上「ソリューション」ペインに、作成されたソリューションの構成が表示されます。もし、ソリューションペインが表示されない場合はメニューから「ビュー → ソリューション」を選択します。

初期状態ではプログラムの中心となる Main.cs ファイルと、ユーザインターフェイスを定義している MainWindow.xib(と、MainWindow.xib.designer.cs)といったファイルが作成されます。

05

Interface Builder での開発

MonoDevelop で開発する場合も XCode で開発する場合同様、インターフェイスは(MonoDevelop では無く)Interface Builder で開発します。MainWindow.xib ファイルをダブルクリックすると Interface Builder が起動します。

06

今回は MonoTouch 公式サイトのチュートリアルに習って、ボタンとラベルを一個ずつ、配置してみます。まず、Interface Builder の「Library」ウインドウ上部から「Objects」を選択し、その真下のペイン(Library から始まるツリーが表示されているペイン)から、「Library → Cocoa Touch → Inputs & Values」を選択します。

07

表示された部品群から「Round Rect Button」と「Label」を、iPhone の画面を模した「Window」ウインドウにそれぞれドラッグ&ドロップして配置します。

08

次に「アウトレット」を登録します。アウトレットとは Interface Builder 上で定義した部品を MonoDevelop(や、XCode)から参照する為の名前のことです。アウトレットを定義しないと、ソースコードから GUI の部品を参照出来ないことになってしまいます。

アウトレットを定義するには、Library ウインドウ上部から Classes を選択し、 中段のペイン最上部にある「AppDelegate」を選択した状態で、次は下部の「Lineage」「Definitions」・・・と並んでいる箇所から「Outlets」を選択します。

09

ここで「+」(プラス)ボタンをクリックすると新しくアウトレットを追加出来ます。ここではボタン用に「button」アウトレットを、ラベル用に「label」アウトレットを定義しました。アウトレット名の横には「Type」という欄がありますが、ここにはクラス名を指定します。新規に作成したアウトレットの Type はデフォルトで「id」になっていますが、このままではラベル用に作成したアウトレットをボタンに割り当てる、といったことが出来てしまいます。厳密に定義する為に、今回はそれぞれの Type として、 button アウトレットには「UIButton」を、label アウトレットには「UILabel」を、window アウトレットには「UIWindow」を指定しました。

尚、意図しないアウトレットを定義してしまった場合は該当アウトレットを選択した状態で「-」(マイナス)をクリックすることで、アウトレットを削除することが出来ます。

10

次に定義したアウトレットを GUI の部品と関連付けます。まず、MainWindow.xib ウインドウに表示されている AppDelegate をクリックします。

11

続けて、App Delegate Connections ウインドウ上部のタブの、左から二番目の右矢印ボタン(Connections)をクリックします。

すると、先ほど定義したアウトレットが表示されますので、ここでアウトレットと GUI 部品の関連付けを行います。まず、button アウトレット右側の○からドラッグし続け、window ウインドウに配置したボタンの上でドロップします。アウトレット定義時に適切な Type を定義していれば、ボタンのアウトレットをラベルに関連付ける、といったことは出来ません(アウトレットを部品の上に持ってきても、ドロップ出来ません)

12

ボタンと同様に、ラベルもアウトレットと GUI の部品を関連付けます。

13

最終的に App Delegate Connections ウインドウは以下のようになっているはずです。

14

意図した通りにアウトレットが GUI の部品に関連付けが出来ていれば、Interface Builder のメニューから「File → Save」を選択して変更を保存した後、メニューの「Interface Builder → Quit Interface Builder」を選択してアプリケーションを終了し、MonoDevelop へ戻ります。

ビルド & iPhone シミュレータでの実行

ソリューションペインから MainWindow.xib.designer.cs をダブルクリックすると、Interface Builder 上での設定変更が C# のソースコードに反映されていることが分かります。

15

次に、Main.cs の FinishedLaunching メソッドを以下の通りに書き換えます。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
using System.Linq;
using MonoTouch.Foundation;
using MonoTouch.UIKit;

namespace HelloiPhone
{
    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
    {
        // 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);

            window.MakeKeyAndVisible ();

            // ここからソースコードを追加
            label.Text = "0 times";

            int count = 0;
            button.TouchDown += delegate {
                label.Text = ++count + " times";
            };
            // ここまで

            return true;
        }

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

正しくソースコードが入力出来たようであれば、ビルドします。メニューから「ビルド → Build All」を選択するとソースコードのビルドが開始されます。

16

ビルドの進行状況は下部の「ビルド出力」というウインドウに表示されます。正しくビルド出来ていれば、以下の画面のように、最下部に「ビルド成功」と表示されます。

17

ビルドが成功したら、iPhone シミュレータで動作確認を行います。メニューから「実行 → 実行」を選択します。

18

これで自作したアプリケーションが iPhone シミュレータで動作します。尚、MonoDevelop から iPhone シミュレータを実行しても iPhone シミュレータは MonoDevelop のウインドウに隠れたままのようなので、Dock から iPhone シミュレータを選択するなりして、iPhone シミュレータを前面に移動させます。ボタンをクリップすると、ラベル上の数字が増えていきます。

19