2014.04.14
wolfgang

「iOS」独自frameworkの作成

1.XCodeでProjectを作成

・テンプレートの”iOS”から”Framework & Library”→”Cocoa Touch Static Library”を選択。

f0
・プロジェクト名がFrameworkの名前になるので適当に付ける。(ここではHelloWorldKitにします。)
f1
・use automatic reference countingのチェックは付けたままでNext。(ARCを使わないならチェックを外す。)
・適当にデスクトップにでも作成。

2.Headersフォルダを作成

・適当なファイルを右クリックして”Show in Finder”を選択。
f2
・新規フォルダを名前「Headers」で作成。
f3
・作成したHeadersフォルダをプロジェクトに追加

3.ビルドターゲットの作成

・左下の”Add Target”をクリックし、”Aggregate”を追加。

f4

・ターゲット名は適当(ここではHelloWorldKit.frameworkにしました。)

4.Info.plistを作成

・右クリック→New File…からProperty Listを名前Info.plistで作成

f5

・内容は以下の用な感じで

1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3 <plist version="1.0">
4 <dict>
5     <key>CFBundleName</key>
6     <string>HelloWorld</string>
7     <key>CFBundleIdentifier</key>
8     <string>com.vac.HelloWorld</string>
9     <key>CFBundleInfoDictionaryVersion</key>
10     <string>6.0</string>
11     <key>CFBundleVersion</key>
12     <string>1</string>
13     <key>CFBundleExecutable</key>
14     <string>HelloWorld</string>
15     <key>CFBundleGetInfoString</key>
16     <string>HelloWorld</string>
17     <key>NSPrincipalClass</key>
18     <string></string>
19     <key>CFBundlePackageType</key>
20     <string>FMWK</string>
21     <key>CFBundleIconFile</key>
22     <string></string>
23     <key>CFBundleSignature</key>
24     <string>????</string>
25     <key>CFBundleDevelopmentRegion</key>
26     <string>English</string>
27     <key>NSHumanReadableCopyright</key>
28     <string>Copyright vac All rights reserved.</string>
29     <key>CFBundleShortVersionString</key>
30     <string>1.0.0</string>
31 </dict>
32 </plist>

・こんな感じになります。
f6

5.Scriptを設定

・”TARGETS”→”HelloWorldKit.framework”を選択して”Build Phases”タブの右下”Add Build Phase”をクリック”Add Run Script”をクリックする。

f7

・追加されたRun Scriptに以下のスクリプトを記述する。

1 # 環境変数
2 INFO_PLIST="Info.plist"
3 FRAMEWORK_NAME=${PROJECT_NAME}
4 FRAMEWORK_VERSION_NUMBER=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" ${SRCROOT}/${PROJECT_NAME}/${INFO_PLIST})
5 FRAMEWORK_VERSION=A
6 FRAMEWORK_BUILD_PATH="${SRCROOT}/build/${CONFIGURATION}-framework"
7 FRAMEWORK_DIR="${FRAMEWORK_BUILD_PATH}/${FRAMEWORK_NAME}.framework"
8 FRAMEWORK_PACKAGE_NAME="${FRAMEWORK_NAME}.${FRAMEWORK_VERSION_NUMBER}.zip"
9
10 # ディレクトリをクリーン
11 [ -d "${FRAMEWORK_BUILD_PATH}" ] && rm -rf "${FRAMEWORK_BUILD_PATH}"
12
13 # 実機、シミュレーター用ターゲット設定
14 xcodebuild -project ${PROJECT_NAME}.xcodeproj
15 -sdk iphonesimulator${IPHONEOS_DEPLOYMENT_TARGET}
16 -target "${PROJECT_NAME}"
17 -configuration ${CONFIGURATION} clean build
18 xcodebuild -project ${PROJECT_NAME}.xcodeproj
19 -sdk iphoneos${IPHONEOS_DEPLOYMENT_TARGET}
20 -target "${PROJECT_NAME}"
21 -configuration ${CONFIGURATION} clean build
22
23 # フレームワーク用ディレクトリ作成
24 mkdir -p ${FRAMEWORK_DIR}
25 mkdir -p ${FRAMEWORK_DIR}/Versions
26 mkdir -p ${FRAMEWORK_DIR}/Versions/${FRAMEWORK_VERSION}
27 mkdir -p ${FRAMEWORK_DIR}/Versions/${FRAMEWORK_VERSION}/Resources
28 mkdir -p ${FRAMEWORK_DIR}/Versions/${FRAMEWORK_VERSION}/Headers
29
30 # シンボリックリンク作成
31 ln -s ${FRAMEWORK_DIR}/Versions/${FRAMEWORK_VERSION} ${FRAMEWORK_DIR}/Versions/Current
32 ln -s ${FRAMEWORK_DIR}/Versions/Current/Headers ${FRAMEWORK_DIR}/Headers
33 ln -s ${FRAMEWORK_DIR}/Versions/Current/Resources ${FRAMEWORK_DIR}/Resources
34 ln -s ${FRAMEWORK_DIR}/Versions/Current/${FRAMEWORK_NAME} ${FRAMEWORK_DIR}/${FRAMEWORK_NAME}
35
36 # 実機、シミュレーター用HelloWorldKit.a作成
37 lipo -create
38 ${SRCROOT}/build/${CONFIGURATION}-iphoneos/lib${FRAMEWORK_NAME}.a
39 ${SRCROOT}/build/${CONFIGURATION}-iphonesimulator/lib${FRAMEWORK_NAME}.a
40 -output "${FRAMEWORK_DIR}/Versions/Current/${FRAMEWORK_NAME}"
41
42 # ファイルをコピーして最後にzip作成
43 ls ${SRCROOT}/${PROJECT_NAME}/Headers/*.h > /dev/null 2>&1 && cp ${SRCROOT}/${PROJECT_NAME}/Headers/*.h ${FRAMEWORK_DIR}/Headers/
44                                       cp ${SRCROOT}/${PROJECT_NAME}/${INFO_PLIST} ${FRAMEWORK_DIR}/Resources
45
46                                      
47                                       cd ${FRAMEWORK_BUILD_PATH}
48                                       zip -ry ${FRAMEWORK_PACKAGE_NAME} $(basename $FRAMEWORK_DIR)

f8

・frameworkとして必要な設定などはここまで、とりあえずビルドは通ります。

5.処理を実装

・HelloWorldKit.frameworkという名前で作っているので「Hello World!!!!!!!!」の文字列を返す実装をしていきます。
・右クリックNew File…からiOS→Cocoa Touch→Objectiv-C classを選択
・「NSObject」のサブクラスで名前を「HelloObject」を作成。
・下記のように実装

*HelloObject.h

1 #import <Foundation/Foundation.h>
2
3 @interface HelloObject : NSObject
4
5 + (NSString *)hello;
6
7 @end

*HelloObject.m

1 #import "HelloObject.h"
2
3 @implementation HelloObject
4
5 + (NSString *)hello
6 {
7     return @"Hello World!!!!!!!!";
8 }
9
10 @end

・次にHelloObject.hをHeadersフォルダーに入れて、スキームをHelloWorldKit.frameworkにしてビルドするとプロジェクトのbuild/Debug-frameworkフォルダーにHelloWorldKit.frameworkとzipファイルが出来上がります。
f9

6.完成したframeworkの使い方

・新規iOSプロジェクトをEnpty Applicationでプロジェクト名はFWTestProjectにて作成。
f10
・プロジェクトを作ったら先ほど作成したHelloWorldKit.frameworkをプロジェクトに追加する。
・TARGETS→Build PhasesタブのLink Binary With Librariesの+をクリック、Add Other..でHelloWorldKit.frameworkを選択。
f11

・HelloWorldKit.frameworkの追加が終わったらプロジェクトのAppDelegate.mにコードを追加します。

1 #import "AppDelegate.h"
2 #import <HelloWorldKit/HelloObject.h> ←追加(フレームワークを使うためインポート)
3
4 @implementation AppDelegate
5
6 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
7 {
8     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
9     
10     NSLog(@"%@",[HelloObject hello]); ←追加(HelloObjectのクラスメソッドhelloをログ表示)
11     
12     self.window.backgroundColor = [UIColor whiteColor];
13     [self.window makeKeyAndVisible];
14     return YES;
15 }

これを実行すると

1 FWTestProject[1329:c07] Hello World!!!!!!!!

となります。

以上で独自frameworkを作り実装することが出来ます。
*注意点として実機とシミュレーターは気にしないでも大丈夫ですがデバッグとリリースビルドは区別されます。