こんにちは、 株式会社ジェネシックス の徐 廷(@TonnyXu)です。文章が長くなりますので、5回に分けてお届けします。

今回は、1回目となります。

その1

■ 共通プロジェクトを作る

その2

■ コンシューマPJを作る

■ コンシューマPJで共通プロジェクトを引用

その3

■ 引用する後コンシューマPJでの必須設定

その4

■ コンシューマPJを実行する

その5

■ さらに

・ 共通プロジェクトに単体テストを追加

・ オープンソースライブラリを作る

複数のiPhoneアプリを開発する場合、自分が書いたソースコードの中で共通性が高いコードを抽出して共有したくなると思います。特にSubversionなどのでソースコード管理を行っている場合は、共通モジュールのソースコードを分散させるのは大変だと思います。今日はジェネシックスの共通モジュールのベストプラクティスを紹介します。

 

まず、本文中の用語を簡単に説明します。
  • 共通モジュール :複数のプロジェクトに共通の機能
  • 共通プロジェクト :共通モジュールを管理しているプロジェクト
  • コンシューマプロジェクト/PJ :共通モジュールを使用するプロジェクト

さて、共通プロジェクトを作る目的と目標をまとめましょう。

目的
  • 共通モジュールを 管理し易くする ため
目標
  1. 任意のコンシューマプロジェクトで共通モジュールを使える
  2. 共通モジュールの更新はすべてのコンシューマプロジェクトに自動的に反映される
  3. 共通モジュールがSubversionなどのSCMで管理できる。
  4. 単体テストできる。

本文の最後にも書いていますが、この共通プロジェクトの作り方は、オープンソースのライブラリを作るときにも適用できます。

【サンプルコードをダウンロード】

本文で使用しているサンプルコードです。

私のMac OS X Snow Leopardの環境言語は英語に設定しています。画面キャプチャなどもすべて英語表記となっております。何卒ご了承ください。

■ 共通プロジェクトを作る

 

まず、共通モジュールのプロジェクトを作りましょう。Xcodeを開いて、File→New project...を選択すると、下記のような画面が出てきます。
new static library name
図1:共通モジュールのプロジェクトタイプ

 

図1でLibraryカテゴリののStatic Libraryを選択し、次の画面で名前を入力してください。

new static library name
図2:共通プロジェクトの名前

保存をすると、共通プロジェクトが図3のように出来上がります。

new static libaray project.

図3:出来上がった共通プロジェクト

例えば、現在実行しているデバイスがiPadかどうかを判断する共通メソッドを作りたい場合は、まず、新しいクラスを追加しましょう。

new class for static library
図4:新しいクラス

 

新しいクラスは「GCDevice」という名前にしました。ちなみに、GCは G enesix C ommonのという意味です。

new class name for static library
図5:クラスの名前

new class header for common

図6:クラスのヘッダー

図6のように、ヘッダーファイル中に、staticなメソッドを追加します。名前は「 isIPad 」,戻り値は BOOL です。

次はクラス「 UIDevice 」を使うために、「 UIKit.framwork 」をプロジェクトに追加します。

framework UIKit

図7:UIKit.frameworkを追加します。

次は .m ファイルに isIPad のソースコードを追加します。

 

.m file for common lib

図8:.mファイルの詳細

下記は図8のソースコードです。

GCDevice.m

//
//  GCDevice.m
//  Common
//
//  Created by Tonny Xu on 10/05/26.
//  Copyright 2010 genesix, Inc. All rights reserved.
//

#import "GCDevice.h" 
#import <UIKit/UIKit.h>

@implementation GCDevice

#ifndef UI_USER_INTERFACE_IDIOM
@interface UIDevice (ThingsIKnow)
- (int)userInterfaceIdiom;
@end
#define UI_USER_INTERFACE_IDIOM() ([[UIDevice currentDevice] respondsToSelector:@selector(userInterfaceIdiom)] ? [[UIDevice currentDevice] userInterfaceIdiom] : UIUserInterfaceIdiomPhone)
#define UIUserInterfaceIdiomPhone 0
#endif

+ (BOOL)isIPad
{
    static BOOL isPad = NO;
    static BOOL determined = NO;
    if (!determined) {
        isPad = (UI_USER_INTERFACE_IDIOM() != UIUserInterfaceIdiomPhone);
        determined = YES;
    }

    return isPad;
}

@end

これで共通プロジェクトcommonをビルドできるはずです。ビルドしてみましょう。

.m file and compile OK

図9:コンパイル成功

 

コンパイル成功したので、このライブラリを使えるようになりました。では、早速この共通モジュールを使用するコンシューマプロジェクトを作りましょう。