1.プロジェクトの作成iOSフレームワーク用のプロジェクトテンプレートは用意されていませんので、静的ライブラリ作成用のプロジェクトを使用します。アプリ作成用のものでも構いませんが、ライブラリ自体は必要になりますので、その場合はライブラリ用のターゲットを追加しておきます。
2.ライブラリの作成プロジェクトを作成したら、ライブラリを作って行きます。
ライブラリ化したいソースを準備し、ビルドが成功する状態に持ち込みます。
アプリ作成と似ていますが、フレームワークや動的ライブラリのリンクなどは必要ありません。
3.フレームワーク用ターゲットの追加次にフレームワーク作成用のターゲットを作成します。
といっても、Macの用にテンプレートが用意されている訳ではありません。
ここでは、Aggrerateを使用します。

プロダクト名は分かりやすいように"<ライブラリ名>.framework"としておきます。
4.情報プロパティリストの作成次にフレームワーク用の情報プロパティリストを作成します。
これも用意されていませんので、自作する必要があります。
以下のソースのうち、バンドル名称や著作権表示は適宜置き換えて下さい。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleDevelopmentRegion</key>
<string>English</string>
<key>CFBundleExecutable</key>
<string>MyFramework</string>
<key>CFBundleGetInfoString</key>
<string>MyFramework</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleIdentifier</key>
<string>com.mycompany.MyFramework</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleName</key>
<string>MyFramework</string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright yyyy my company. All rights reserved.</string>
<key>NSPrincipalClass</key>
<string></string>
</dict>
</plist>
5.ビルドスクリプトの作成ここまでできたら、いよいよ本丸のビルドスクリプトを作成します。
まずビルドフェーズにスクリプトの実行を追加します。

ここで、"Add Build Phase"を選択し、

"Add Run Script"を選びます。
すると、中央部の"Target Dependencies"の下に"Run Script"が追加されますので、矢印を押して内部を展開します。

"Type a script..."と書かれた部分にスクリプトを記述します。
#--------------------------------------------------------------------
echo "[0] Framework: Preparing ..."
#--------------------------------------------------------------------
INFOPLIST='MyFramework/MyFramework-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"
#--------------------------------------------------------------------
echo "[1] Framework: Building libraries ..."
#--------------------------------------------------------------------
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${IPHONEOS_DEPLOYMENT_TARGET}
[ $? != 0 ] && exit 1
echo "Framework: Cleaning framework..."
[ -d "${FRAMEWORK_BUILD_PATH}" ] && rm -rf "${FRAMEWORK_BUILD_PATH}"
#--------------------------------------------------------------------
echo "[2] 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 "[3] 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}
#--------------------------------------------------------------------
echo "[4] Framework: Creating library..."
#--------------------------------------------------------------------
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}"
#--------------------------------------------------------------------
echo "[5] Framework: Copying assets into current version..."
#--------------------------------------------------------------------
FRAMEWORK_HEADER_FILES=`find . -name "*.h"`
cp ${FRAMEWORK_HEADER_FILES} ${FRAMEWORK_DIR}/Headers/
cp ${INFOPLIST} ${FRAMEWORK_DIR}/Resources/
#--------------------------------------------------------------------
echo "[6] Framework: Packaging framework..."
#--------------------------------------------------------------------
cd ${FRAMEWORK_BUILD_PATH}
zip -ry ${PACKAGENAME} $(basename $FRAMEWORK_DIR)
chmod -fR ugo-w "${FRAMEWORK_NAME}.framework"
ちょっと長いですが、要約するとライブラリのビルド→結合→フレームワークのフォルダへ配置という流れです。
6.実行それでは、実行に移りましょう。
ビルドスキームをフレームワーク用ターゲットのものに変更し、Runを押します。
エラーなしで完了したら、プロジェクトフォルダに新しくできた"Framework"フォルダを開いてみます。

".framework"と拡張子のついたフォルダができています。
あとは、これを実際のアプリケーションプロジェクトに組み込んで、使ってみましょう。
ビルドに失敗したり、組み込んで上手く使えない場合もあると思います。
そういう場合のTipsを次回まとめてみようと思います。
それでは、また。
- 関連記事
-
スポンサーサイト