.02 2012

iOS向けフレームワークを作る(2)

Tasakiです。


2012年も早いもので3月に入りました。
来週にも新型iPadの発表会(未確定)が迫り、iOS5.1リリースも近づいてきていると予想されます。


さて、今回は前回に続き、Xcode4.3でのフレームワーク作成をやってみようと思います。
1.プロジェクトの作成
iOSフレームワーク用のプロジェクトテンプレートは用意されていませんので、静的ライブラリ作成用のプロジェクトを使用します。アプリ作成用のものでも構いませんが、ライブラリ自体は必要になりますので、その場合はライブラリ用のターゲットを追加しておきます。

2.ライブラリの作成
プロジェクトを作成したら、ライブラリを作って行きます。
ライブラリ化したいソースを準備し、ビルドが成功する状態に持ち込みます。
アプリ作成と似ていますが、フレームワークや動的ライブラリのリンクなどは必要ありません。

3.フレームワーク用ターゲットの追加
次にフレームワーク作成用のターゲットを作成します。
といっても、Macの用にテンプレートが用意されている訳ではありません。
ここでは、Aggrerateを使用します。
スクリーンショット 2012-03-02 14.03.29
プロダクト名は分かりやすいように"<ライブラリ名>.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.ビルドスクリプトの作成
ここまでできたら、いよいよ本丸のビルドスクリプトを作成します。
まずビルドフェーズにスクリプトの実行を追加します。
スクリーンショット 2012-03-02 14.35.03
ここで、"Add Build Phase"を選択し、
スクリーンショット 2012-03-02 14.37.31
"Add Run Script"を選びます。

すると、中央部の"Target Dependencies"の下に"Run Script"が追加されますので、矢印を押して内部を展開します。
スクリーンショット 2012-03-02 14.40.39

"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"フォルダを開いてみます。
スクリーンショット 2012-03-02 16.00.05
".framework"と拡張子のついたフォルダができています。
あとは、これを実際のアプリケーションプロジェクトに組み込んで、使ってみましょう。

ビルドに失敗したり、組み込んで上手く使えない場合もあると思います。
そういう場合のTipsを次回まとめてみようと思います。


それでは、また。
関連記事
スポンサーサイト



Comment

Post comment

  • comment
  • secret
  • 管理者にだけ表示を許可する

Trackback

trackbackURL:http://appteam.blog114.fc2.com/tb.php/221-9166d03e

ブログ内検索

関連リンク

製品情報

最新記事

カテゴリ

プロフィール

neoxneo



NEXT-SYSTEM iOS Developers Blog


  • UTO:
    カナダ版iPhone4Sは、マナーモードでシャッター音がならない…


  • Ehara:
    ...


  • Hayate:
    ...


  • Tasaki:
    Developer登録完了...したのはいいけど


  • Ueda:
    ...



リンク