iOSアプリ開発においてFrameworkを自作する方法【手順3】

今回は、前回の続編として、「.framework」ファイルを自作する方法の「手順3.Targetを作成し、Run Scriptを設定する」を紹介する。

繰り返しになるが、「.framework」ファイルを自作する方法に関しては、下記のサイトで非常に丁寧に紹介されている。
iPhoneアプリ開発自作Frameworkをつくる
ただ、少し古いバージョンのXcodeで説明されているので、現時点の最新版である「Xcode6.1」における方法を紹介する。

手順は下記の5ステップとなる。少し長くなるので、各手順に分けて説明する。

<手順概要>
手順1.プロジェクトを作成する
手順2.Property Listを作成する
手順3.Targetを作成し、Run Scriptを設定する(本記事)
手順4.Frameworkで実行したい処理をクラスとして追加する
手順5.Frameworkをビルドし利用する

<手順詳細>
3.Targetを作成し、Run Scriptを設定する

3.1.Targetを作成する

プロジェクトツリーの最上部をクリックすると、下図の様な状態になるので、サイドメニューの下部にある【+】ボタンを押下する。
(PROJECT,TARGETSが表示されているサイドメニューが表示されない場合は図中の※をクリックする)

表示されたダイアログで、「iOS」->「Other」->「Aggregate」を選択し、【Next】ボタンを押下する。

続いて表示されたダイアログの「Product Name」に「<プロジェクト名>.framework」(FrameworkSample.framework)と入力し、【Finish】ボタンを押下する。

サイドメニューの「TARGETS」の欄に「FrameworkSample.framework」が追加された事を確認する。


3.2.Run Scriptを設定する

サイドメニュー「TARGETS」の欄の「FrameworkSample.framework」をクリックする。
表示された画面上部で「Build Phases」を選択する。
表示された画面で【+】ボタンを押下し、【New Run Script Phase】をクリックする。

画面に「Run Script」が追加された事を確認する。

「Run Script」の左にある三角をクリックし、項目を表示させる。

上図で「Type a script or drag a script file ...」と表示されている欄に、下記のスクリプトを記述する。
4行目には手順2で作成したProperty Listを指定すること。

# ==============================
# 変数設定
# ==============================
INFOPLIST='FrameworkSample/Resources/Info.plist'
FRAMEWORK_NAME=$(/usr/libexec/PlistBuddy -c "Print CFBundleName" ${INFOPLIST})
BUILD_TARGET_NAME=$FRAMEWORK_NAME
FRAMEWORK_BUILD_CONFIGURATION="Release"
FRAMEWORK_VERSION_NUMBER=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" ${INFOPLIST})
FRAMEWORK_VERSION=A
FRAMEWORK_BUILD_PATH="Framework"
FRAMEWORK_DIR="${FRAMEWORK_BUILD_PATH}/${FRAMEWORK_NAME}.framework"
PACKAGENAME="${FRAMEWORK_NAME}.${FRAMEWORK_VERSION_NUMBER}.zip"

# ==============================
# ビルド
# ==============================
xcodebuild -configuration ${FRAMEWORK_BUILD_CONFIGURATION} -target ${BUILD_TARGET_NAME} clean
xcodebuild -configuration ${FRAMEWORK_BUILD_CONFIGURATION} -target ${BUILD_TARGET_NAME} -sdk iphonesimulator${IPHONEOS_DEPLOYMENT_TARGET}
[ $? != 0 ] && exit 1
xcodebuild -configuration ${FRAMEWORK_BUILD_CONFIGURATION} -target ${BUILD_TARGET_NAME} -sdk iphoneos
[ $? != 0 ] && exit 1

# ==============================
# ディレクトリ作成
# ==============================
[ -d "${FRAMEWORK_BUILD_PATH}" ] && rm -rf "${FRAMEWORK_BUILD_PATH}"
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
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}

# ==============================
# framework作成
# ==============================
lipo -create \
build/${FRAMEWORK_BUILD_CONFIGURATION}-iphoneos/lib${FRAMEWORK_NAME}.a \
build/${FRAMEWORK_BUILD_CONFIGURATION}-iphonesimulator/lib${FRAMEWORK_NAME}.a \
-o "${FRAMEWORK_DIR}/Versions/Current/${FRAMEWORK_NAME}"

cp -Rf ${BUILD_TARGET_NAME}/Headers/* ${FRAMEWORK_DIR}/Headers/
cp ${BUILD_TARGET_NAME}/Resources/* ${FRAMEWORK_DIR}/Resources/
cp ${INFOPLIST} ${FRAMEWORK_DIR}/Resources/
cd ${FRAMEWORK_BUILD_PATH}
chmod -fR 777 "${FRAMEWORK_NAME}.framework"
zip -ry ${PACKAGENAME} $(basename $FRAMEWORK_DIR)

記入後、下図の様な状態である事を確認する。

<コピー&ペーストした時の注意点>
上記のスクリプトをコピー&ペーストした場合、自動的にスクリプトの末尾に不要なインデントが挿入されることがある。
フォルダ配下の全ファイルを指定している「/*」をコメントの始まりと誤認したために起こると考えられる。
インデントは不要なので、インデント部分を削除すること。色はコメント色になっているが、特に問題ない。

コピー後

インデント削除後(あるべき姿)

以上で「手順3.Targetを作成し、Run Scriptを設定する」が完了となる。

Enjoy Programing!!

<関連記事>
iOSアプリ開発においてFrameworkを自作する方法【手順1】
iOSアプリ開発においてFrameworkを自作する方法【手順2】
iOSアプリ開発においてFrameworkを自作する方法【手順3】(本記事)
iOSアプリ開発においてFrameworkを自作する方法【手順4】
iOSアプリ開発においてFrameworkを自作する方法【手順5】

<お勧め書籍>

詳解 Objective-C 2.0 第3版
iOSアプリ開発技術者として仕事をするのであれば、必ず読んでおくべき書籍である。
筆者も何度も繰り返し精読している。