iPhoneプログラミング(前編)

iPhoneネイティブアプリ

iPhone (iPodTouch) が新しいモバイルデバイスとして注目されています。iPhoneにはSafariブラウザが搭載されているので、Safari上で動作するウエブアプリ開発は通常の開発の延長で可能です。(Apple Developer Connection - Web Apps Dev Center)
iPhoneではネイティブアプリとしてSafariを経由せずに直接iPhoneOS上で動作するアプリケーションも開発することが可能です。ネイティブアプリの開発にはiPhoneSDKを開発環境としてもちいます。現状, intelmacのみで開発が可能です。iPhoneSDKの入手および利用にはAppleiPhone Dev Centerの利用登録が必要です。

AppleとのNDA
08年10月まではiPhone開発(SDK)に関する一切の情報はNDAに縛られ開発者が自由にその開発方法を公開するのは禁止されていました(iPhoneSDKの入手時にその規約に同意する必要があった)が、現時点では公開済みの機能に限って(iPhoneSDKで公開前にSDKにその機能を含めて提供する場合があるため)、その制限が緩和されました。それに伴い、たくさんのブログ等で開発に関する情報が掲載されてきています。

iPhoneプログラミング

iPhoneObjectiveCと呼ばれる開発言語で開発します。ObjectiveCはC言語オブジェクト指向を適用したような(C++のものとは文法が異なる)言語です。mac用アプリケーションの開発も同様にこの言語が用いられています。iPhoneSDKをインストールするとObjectiveCの開発環境にあわせて、MacOS(iPhoneOS)で動作するたくさんのライブラリ(機能系,UI系)がインストールされます。これらを組み合わせてプログラムを行います。
iPhoneSDKはmac統合開発環境Xcodeに組み込む形で利用しますXcodeiPhoneだけでなく通常のmacアプリを開発する際にも利用されます(ダウンロードしたiPhoneSDKにXcodeも含まれれるので別途入手する必要がありません)
mac(iPhone)のアプリ開発はある種特徴的な部分が多く慣れるまでは理解が難しい部分が多いですが、開発に関する膨大な技術資料がiPhone Dev Centerから閲覧できます。iPhoneSDKを本格的に使いこなす場合はどれも有益な内容だと思います。
また。Xcodeの【ヘルプ】メニューから 【Xcodeワークスペースガイド】からライブラリのリファレンスが参照できます。たくさんのライブラリを組み合わせてiPhoneのアプリケーションは組み立てます。どのようなライブラリがあるか、各ライブラリの機能は何かを調べる際に頻繁に参照するガイドになります。

iPhoneSDKにはiPhoneの動作をシミュレーションするiPhoneシミュレータが含まれます。これを用いるとプログラムの動作確認を実機を使用せずに確認することが可能です(当然のiPhone実機でのみ確認できる機能もあります. 加速度センサ/GPS/カメラなど)
iPhoneアプリを実機で確認、および配布するためには別途Appleの有償のアカウント(Apple Developer Program)が必要になります。この部分の説明は割愛します。

iPhoneでHelloWorld

iPhoneのプログラムの詳細な説明は非常に大変なのでチュートリアル風に説明します.各作業が何を意味しているかの説明は都度リファレンスなどを調べて理解してください。

Xcodeを起動して【ファイル】から【新規プロジェクト】を選択します。プロジェクトテンプレートの選択になりますのでView-Based Applicationを選択します。

次にプロジェクト名を入れます。HelloWorldとします。指定した場所にフォルダが作成されます。1つのプロジェクトで必要なコードはこのフォルダにまとめられます。これでプロジェクトが作成されました。下記の画面がXcodeの開発画面です.

フォルダ内には以下のファイルなどが作成されます

HelloWorld
|-- Classes
|   |-- HelloWorldAppDelegate.h
|   |-- HelloWorldAppDelegate.m
|   |-- HelloWorldViewController.h
|   `-- HelloWorldViewController.m
|-- HelloWorld.xcodeproj
|-- HelloWorldViewController.xib
|-- HelloWorld_Prefix.pch
|-- Info.plist
|-- MainWindow.xib
|-- build
|   `-- HelloWorld.build
`-- main.m

HelloWorld.xcodeprojがXcodeのプロジェクトファイルです。これを起動すると次回このプロジェクトのXcode開発画面が開きます。まず、この状態でXcode上部の【ビルドして実行】を選択します。するとプロジェクトがビルドされ、iPhoneシミュレータが起動します

Viewが見えるだけで何も定義していない画面が表示されます。まずは、細かい説明はせずにHelloWorldまで進みます。

                • -

次にXcode左のリソースツリーの

HelloWorldViewController.xibをダブルクリックします xibはUserInterfaceを定義するファイルでこれを編集するInterface Builderが起動します。

Interface BuilderのLibraryから

  • Label を設置してHelloWorldと入力してください
  • Round Rect Button を設置してしてpush!と入力してください

設置はViewの画面にドラックすれば設置されます。文字の入力は設置しされたコンポーネントをダブルクリックするかAttributeパネルのtextやtitleに入力します。

                • -

次にXcodeに戻って編集します. HelloWorldViewController.hを編集します

#import <UIKit/UIKit.h>

@interface HelloWorldViewController : UIViewController {
	IBOutlet UILabel *label;
}
-(IBAction)pushButton:(id)sender;

@end
                • -

Xcodeでファイルを編集保存したあと、Interface Builder(HelloWorldViewController.xib)に戻りFile'sOwnerを選択するとXcodeでIBOutletやIBActionで定義したものが表示されます。

次に定義したコンポーネントをこのIBOutletとIBActionにリンクさせます。

  • File'sOwnerのアイコンをControlを押しながらクリックしてViewのLabelへドラッグします(青線で結びます). 黒窓がでるのでlabelを選択します.
  • ViewのボタンをControlを押しながらクリックして今度は逆にFile'sOwnerへドラックします。黒窓がでるのでpushButtonを選択します。

最終的にFile'sOwnerをControlを押しながらクリックするとリンク内容が表示されます。下記のようになればOKです

                • -

Xcodeに再び戻ります。次に編集するファイルはHelloWorldViewController.mです

-(IBAction)pushButton:(id)sender{
	NSLog(@"pushed button");
	label.text = @"iPhone Program";
}

ボタンがクリックされた場合の動作を定義します。labelのtextの内容を書き換えます。またデバッガにクリックした情報を落とします。これでプログラムの完成です。デバックコンソール付きで実行するにはXcodeのメニューの【実行】から【コンソール】を選択します。コンソール画面が表示されますので、そこの上部の【ビルドして実行】を実行します。
クリックするとラベルの内容が変わります。またコンソールにNSLogで指定したメッセージが表示されると思います。

少し詳しく解説

iPhoneのプログラムはmain.mからスタートします

#import <UIKit/UIKit.h>

int main(int argc, char *argv[]) {
    
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

このmainと同じくinfo.plistが読み込まれます。ここに定義されている

Main nib file base name = MainWindow

という定義によりmainのUIApplicationMain関数がMainWindow.xibを読み込んで起動します。MainWindow.xibは前のサンプルでは利用しませんでしたがInterfaceBuilderで同じく起動できます。iPhoneを起動するとUIApplicationのインスタンスが生成されます。MainWindow.xibはこのUIApplicationのインスタンスになります。(File'sOwner参照)
ObjectiveCのプログラムではインスタンスの機能はdelegateという機能で委譲(別インスタンスに定義)させます。UIApplicationのdelegate関数はリファレンスライブラリで (UIApplicationDelegate Protocol ) を参照します。ここに定義されているメソッド類はUIApplicationの動作を定義するもので、UIApplicationDelegateをインスタンス化したあとにUIApplicationのdelegateに接続することでその動作が行われます。(この辺はすこしObjectiveCならではの概念ですが、さまざまなクラスでdelegateを使用する機会があるので別途リファレンスを参照して理解してください)
MainWindow.xibのFile'sOwner(すなわちUIApplication)のdelegateがHellowWorld App Delegateに接続しているのが分かります。

さらに、HellowWorld App Delegateを選択して情報をみると下記のように表示されます

右のClassの表示でこれがHelloWorldViewControllerクラスのインスタンスであることが分かります HelloWorldViewControllerはXcode上に定義されいます。HelloWorldViewController.hの定義で

@class HelloWorldViewController;

@interface HelloWorldAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    HelloWorldViewController *viewController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet HelloWorldViewController *viewController;

とあります。windowやviewControllerはIBOutletで定義されているのでInterfaceBuilderで表示され、それぞれwindowとHelloWorld View Controllerにリンクさせています. HelloWorldViewController.m で

- (void)applicationDidFinishLaunching:(UIApplication *)application {    
    
    // Override point for customization after app launch    
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
}

の関数が定義されています. applicationDidFinishLaunchingこれがUIApplicationのdelegateの一つでアプリケーションが起動時に呼ばれる関数です。イメージ的にはwindowの上にviewControllerを乗せていますviewControllerはMainWindow.xibでHellowWorld View Controllr の名前で定義されており HelloWorld App DelegateのviewControllrとリンクさせています。HellowWorld View Controllr は XcodeのHelloWorldViewControllerのクラスのインスタンス実体であり、またxibは別にHelloWorldViewController.xibファイルで定義させています。

HelloWorldViewController.xibのViewの上に先ほどのHelloWorldプログラムを構築しました。

UIApplication -> window -> ViewController -> View -> HelloWorld (Label,Button)

という階層でこのHelloWorldアプリが動いていたことになります。

iPhoneプログラミング(中編)も参照下さい。