もりやまです。前回は iPhone / iPad アプリ開発で使える Objective-C のライブラリをいくつか使ってみました。
今回は、自分で作ったライブラリを Framework として使う方法をご紹介します。
ライブラリ用にプロジェクトを準備する
新規プロジェクトで、iPhone OS の Library から「Cocoa Touch Static Library」を選択します。
プロジェクトを作ると以下のような状態で生成されます。ここでは「KrayKit」という名前で作りました。
まずは不要なファイルの削除と、ファイルシステム上のプロジェクトのディレクトリ構成を整備します。
- Classes を削除
- Include, Resources, Sources を作成
次に、Xcode 上でプロジェクトの構成を整備します。
- Classes を削除
- Foundation.framework を削除
- Finder から Include, Resources, Sources の各ディレクトリをドラッグ&ドロップして追加(コピーする必要はない)
ここまでの作業で、プロジェクトは以下のような状態になっていると思います。
Framework 用の plist を作成
Framework の設定を記述するための plist ファイルを作成します。
新規ファイルの追加から Mac OS X の Resource にある「Property List」を選択します。
Resources/Framework.plist として作成して、内容を以下のように設定します。
プロジェクトの設定を編集
プロジェクトの情報からビルドタブを開いて、「ヘッダ検索パス」に Include を追加します。
ソースコードをプロジェクトに追加
ObjC ソースを Sources に、ヘッダを Include/KrayKit に追加します。
あわせて、他のヘッダファイルをすべてインポートするだけの Include/KrayKit/KrayKit.h を作成します。
これはアプリケーションでライブラリを利用する時にインポートするためのファイルです。
Framework 生成用のターゲットを作成
新規ターゲットを追加で Mac OS X の Other から「Shell Script Target」を選択します。
ここでは名前を KrayKit.framework とします。
次に、今作成した KrayKit.framework の下層にある「スクリプトを実行」を開いて、一般タブのスクリプトに以下のスクリプトを設定します。
export PATH=/Developer/usr/bin:"$PATH"
# Define these to suit your nefarious purposes
FRAMEWORK_NAME=KrayKit
FRAMEWORK_VERSION=A
FRAMEWORK_CURRENT_VERSION=1
FRAMEWORK_COMPATIBILITY_VERSION=1
xcodebuild -configuration ${BUILD_STYLE} -target ${FRAMEWORK_NAME} clean
xcodebuild -configuration ${BUILD_STYLE} -target ${FRAMEWORK_NAME} -sdk iphonesimulator${IPHONEOS_DEPLOYMENT_TARGET}
[ $? != 0 ] && exit 1
xcodebuild -configuration ${BUILD_STYLE} -target ${FRAMEWORK_NAME} -sdk iphoneos${IPHONEOS_DEPLOYMENT_TARGET}
# Where we'll put the build framework.
# The script presumes we're in the project root
# directory. Xcode builds in "build" by default
FRAMEWORK_BUILD_PATH="build/Framework"
# Clean any existing framework that might be there
# already
echo "Framework: Cleaning framework..."
[ -d "${FRAMEWORK_BUILD_PATH}" ] && \
rm -rf "${FRAMEWORK_BUILD_PATH}"
# This is the full name of the framework we'll
# build
FRAMEWORK_DIR=${FRAMEWORK_BUILD_PATH}/${FRAMEWORK_NAME}.framework
# Build the canonical Framework bundle directory
# structure
echo "Framework: Setting up directories..."
mkdir -p ${FRAMEWORK_DIR}
mkdir -p ${FRAMEWORK_DIR}/Versions
mkdir -p ${FRAMEWORK_DIR}/Versions/${FRAMEWORK_VERSION}
mkdir -p ${FRAMEWORK_DIR}/Versions/${FRAMEWORK_VERSION}/Resources
mkdir -p ${FRAMEWORK_DIR}/Versions/${FRAMEWORK_VERSION}/Headers
echo "Framework: Creating symlinks..."
ln -s ${FRAMEWORK_VERSION} ${FRAMEWORK_DIR}/Versions/Current
ln -s Versions/Current/Headers ${FRAMEWORK_DIR}/Headers
ln -s Versions/Current/Resources ${FRAMEWORK_DIR}/Resources
ln -s Versions/Current/${FRAMEWORK_NAME} ${FRAMEWORK_DIR}/${FRAMEWORK_NAME}
# Check that this is what your static libraries
# are called
FRAMEWORK_INPUT_ARM_FILES="build/${BUILD_STYLE}-iphoneos/lib${FRAMEWORK_NAME}.a"
FRAMEWORK_INPUT_I386_FILES="build/${BUILD_STYLE}-iphonesimulator/lib${FRAMEWORK_NAME}.a"
# The trick for creating a fully usable library is
# to use lipo to glue the different library
# versions together into one file. When an
# application is linked to this library, the
# linker will extract the appropriate platform
# version and use that.
# The library file is given the same name as the
# framework with no .a extension.
echo "Framework: Creating library..."
lipo \
-create \
"${FRAMEWORK_INPUT_ARM_FILES}" \
-arch i386 "${FRAMEWORK_INPUT_I386_FILES}" \
-o "${FRAMEWORK_DIR}/Versions/Current/${FRAMEWORK_NAME}"
# Now copy the final assets over: your library
# header files and the plist file
echo "Framework: Copying assets into current version..."
cp -r Include/${FRAMEWORK_NAME}/* ${FRAMEWORK_DIR}/Headers/
cp Resources/Framework.plist ${FRAMEWORK_DIR}/Resources/Info.plist
次に、プロジェクトのアクティブターゲットを KrayKit.framework に変更します。
完成
「ビルド」メニューの「ビルド」(Command+B)でビルドして、正常にビルドできると、build/Framework/ 以下に KrayKit.framework が生成されます。
プロジェクトのアクティブな構成の設定でビルドされるので、アプリケーションを公開用にビルドする時は、事前に Framework も公開用にビルドしておく必要があります。
作成した Framework を他のプロジェクトで使う
「既存のフレームワーク」から作成した Framework を追加します。
リストには出てこないので「その他を追加」を選択します。
先程ビルドした build/Framework/KrayKit.framework を選択して追加します。
これだけだと Framework 内で ObjC のコードで定義したクラスやメソッドが参照できないので、プロジェクトの「他のリンカフラグ」に -all_load と -ObjC を追加します。
これで #import <KrayKit/KrayKit.h> すれば、アプリケーションから Framework の機能が使えるようになります。
オレンジの線で囲んでいるところが KrayKit.framework のコードを使っているところです。
参考にしたサイト
- [Mac][iPhone][develop] iPhone OS用のほぼFrameworkの作り方 – Ni chicha, ni limona -平均から抜けられない僕-
- ACCU :: Creating a Framework for the iPhone
KrayKit
今回ご紹介した方法で作成した KrayKit と、それを使うサンプルアプリを Github で公開していますので、よかったら使ってみてください。
この方法で、コードの再利用は大分しやすくなりました。
あとは iPhone アプリ開発用の Interface Builder プラグインが作れるといいんですが、今のところこちらはまだ無理そうです。。。
うまい再利用方法があればぜひコメントで教えてください。
このエントリーに対するコメント
-
非常に参考になりました、ありがとうございます。
Macでの開発は不慣れなもので、とても歯がゆい思いをしながら進めておりましたが、こちらの解説でなんとか納得のいく形になりました。
2011年08月20日, 1:06 PM
日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)
- トラックバック
-
- 誰でもできるiPhoneアプリの作り方 20132013/05/09, 7:25 PM
[…] iPhone アプリ開発で使える Framework の作り方 | KRAY Inc […]
「いいね!」で応援よろしくお願いします!