iOSアプリ「タカラモノデイズ」のリリースから約半年ー。
今後に使えそうな機能をまとめようと思い Xcode で framework を作成してみた。
framework 作成概要
【Xcodeバージョン:5.0.2】
| 項目 | 概要 |
|---|---|
| プロジェクト作成 | framework 用のプロジェクトを作成する |
| ディレクトリ作成 | 公開用ヘッダおよびリソースのディレクトリを作成する |
| プロパティリスト作成 | Info.plist を作成する |
| ターゲット追加 | ビルドターゲットを追加する |
| スクリプト作成 | ビルド用のシェルスクリプトを作成する |
| ビルド | ビルドし framework を作成する |
framework 作成手順
◆プロジェクト作成
1. メニューから [File] » [New] » [Project…] を選択
2. [iOS] » [Framework & Library] の「Cocoa Touch Static Library」を選択し、[Next] ボタン押下

3.「Product Name」 を入力し、[Next] ボタン押下

4. 適当な場所を選択し、[Create] ボタン押下
1. メニューから [File] » [New] » [Project…] を選択
2. [iOS] » [Framework & Library] の「Cocoa Touch Static Library」を選択し、[Next] ボタン押下

3.「Product Name」 を入力し、[Next] ボタン押下

4. 適当な場所を選択し、[Create] ボタン押下
◆ディレクトリ作成
1. “Sample” ディレクトリのコンテキストメニューで [Add Files to “Sample”…] を選択

2. [New Folder] ボタンを押下
3.「Name of new folder」に “Headers” を入力し、[Create] ボタン押下

4. [Add] ボタン押下 ※同様にリソース用ディレクトリ(Resources)も作成する。
5. 作成した “Headers” ディレクトリに公開するヘッダファイルを置く
1. “Sample” ディレクトリのコンテキストメニューで [Add Files to “Sample”…] を選択

2. [New Folder] ボタンを押下
3.「Name of new folder」に “Headers” を入力し、[Create] ボタン押下

4. [Add] ボタン押下 ※同様にリソース用ディレクトリ(Resources)も作成する。
5. 作成した “Headers” ディレクトリに公開するヘッダファイルを置く
◆プロパティリスト作成
1. “Resources” ディレクトリのコンテキストメニューで [New File..] を選択

2. [iOS] » [Resource] の「Property List」を選択し、[Next] ボタン押下

3.「Save As:」に “Info.plist” と入力し、[Create] ボタンを押下

4. Info.plist のサブメニューで、[Open As] » [Source Code] を選択

5. Info.plist に下記のようなプロパティを入力
1. “Resources” ディレクトリのコンテキストメニューで [New File..] を選択

2. [iOS] » [Resource] の「Property List」を選択し、[Next] ボタン押下

3.「Save As:」に “Info.plist” と入力し、[Create] ボタンを押下

4. Info.plist のサブメニューで、[Open As] » [Source Code] を選択

5. Info.plist に下記のようなプロパティを入力
<?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>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundleIdentifier</key>
<string>com.company.${PRODUCT_NAME:rfc1034identifier}</string>
<key>CFBundleInfoDictionaryVersion</key>
<string>6.0</string>
<key>CFBundleVersion</key>
<string>1</string>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleGetInfoString</key>
<string>${PRODUCT_NAME}</string>
<key>NSPrincipalClass</key>
<string></string>
<key>CFBundlePackageType</key>
<string>FMWK</string>
<key>CFBundleIconFile</key>
<string></string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleDevelopmentRegion</key>
<string>en</string>
<key>NSHumanReadableCopyright</key>
<string>Copyright © All rights reserved.</string>
<key>CFBundleShortVersionString</key>
<string>1.0.0</string>
</dict>
</plist>
◆ターゲット作成
1. [TARGETS] » [Add Target…] を選択

2. [iOS] » [Other] の「Aggregate」を選択し、[Next] ボタン押下

3.「Product Name」を入力し、[Finish] ボタン押下
1. [TARGETS] » [Add Target…] を選択

2. [iOS] » [Other] の「Aggregate」を選択し、[Next] ボタン押下

3.「Product Name」を入力し、[Finish] ボタン押下
◆スクリプト作成
1. [TARGETS] » [Sample.framework] » [Buld Phases] を選択

2. メニューの[Editor] » [Add Build Phase] » [Add Run Script Build Phase] を選択

3. [Build Phases] » [Run Script] に下記のようなスクリプトを入力
1. [TARGETS] » [Sample.framework] » [Buld Phases] を選択

2. メニューの[Editor] » [Add Build Phase] » [Add Run Script Build Phase] を選択

3. [Build Phases] » [Run Script] に下記のようなスクリプトを入力
# Environment Variables
INFO_PLIST="Resources/Info.plist"
FRAMEWORK_NAME=${PROJECT_NAME}
FRAMEWORK_VERSION_NUMBER=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" ${SRCROOT}/${PROJECT_NAME}/${INFO_PLIST})
FRAMEWORK_VERSION=A
FRAMEWORK_BUILD_PATH="${SRCROOT}/build/${CONFIGURATION}-framework"
FRAMEWORK_DIR="${FRAMEWORK_BUILD_PATH}/${FRAMEWORK_NAME}.framework"
FRAMEWORK_PACKAGE_NAME="${FRAMEWORK_NAME}.${FRAMEWORK_VERSION_NUMBER}.zip"
# Clean directories
[ -d "${FRAMEWORK_BUILD_PATH}" ] && rm -rf "${FRAMEWORK_BUILD_PATH}"
# Build simulator and device binaries
xcodebuild -project ${PROJECT_NAME}.xcodeproj \
-sdk iphonesimulator${IPHONEOS_DEPLOYMENT_TARGET} \
-target "${PROJECT_NAME}" \
-configuration ${CONFIGURATION} clean build
xcodebuild -project ${PROJECT_NAME}.xcodeproj \
-sdk iphoneos${IPHONEOS_DEPLOYMENT_TARGET} \
-target "${PROJECT_NAME}" \
-configuration ${CONFIGURATION} clean build
# Create directories
mkdir -p ${FRAMEWORK_DIR}
mkdir -p ${FRAMEWORK_DIR}/Versions
mkdir -p ${FRAMEWORK_DIR}/Versions/${FRAMEWORK_VERSION}
mkdir -p ${FRAMEWORK_DIR}/Versions/${FRAMEWORK_VERSION}/Headers
mkdir -p ${FRAMEWORK_DIR}/Versions/${FRAMEWORK_VERSION}/Resources
# Create symbolic link
ln -s ${FRAMEWORK_DIR}/Versions/${FRAMEWORK_VERSION} ${FRAMEWORK_DIR}/Versions/Current
ln -s ${FRAMEWORK_DIR}/Versions/Current/Headers ${FRAMEWORK_DIR}/Headers
ln -s ${FRAMEWORK_DIR}/Versions/Current/Resources ${FRAMEWORK_DIR}/Resources
ln -s ${FRAMEWORK_DIR}/Versions/Current/${FRAMEWORK_NAME} ${FRAMEWORK_DIR}/${FRAMEWORK_NAME}
# Create the universal library
lipo -create \
${SRCROOT}/build/${CONFIGURATION}-iphoneos/lib${FRAMEWORK_NAME}.a \
${SRCROOT}/build/${CONFIGURATION}-iphonesimulator/lib${FRAMEWORK_NAME}.a \
-output "${FRAMEWORK_DIR}/Versions/Current/${FRAMEWORK_NAME}"
# Copy files
ls ${SRCROOT}/${PROJECT_NAME}/Headers/*.h > /dev/null 2>&1 && cp ${SRCROOT}/${PROJECT_NAME}/Headers/*.h ${FRAMEWORK_DIR}/Headers
cp ${SRCROOT}/${PROJECT_NAME}/${INFO_PLIST} ${FRAMEWORK_DIR}/Resources
# Create zip
cd ${FRAMEWORK_BUILD_PATH}
zip -ry ${FRAMEWORK_PACKAGE_NAME} $(basename $FRAMEWORK_DIR)
※スクリプトが間違っていたので修正。(coppieee さん、ご指摘ありがとうございました)
最後から2行目
【誤】cp ${FRAMEWORK_BUILD_PATH}
【正】cd ${FRAMEWORK_BUILD_PATH}


ご記事を大変参考になりました、ありがとうございます。完成したframeworkを使ってみると、コンパイルエラーが出ました。
ld: warning: ignoring file /User/HelloWorldKit/build/Debug-framework/HelloWorldKit.framework/HelloWorldKit, missing required architecture arm64 in file /Users/HelloWorldKit/build/Debug-framework/HelloWorldKit.framework/HelloWorldKit (2 slices)
Undefined symbols for architecture arm64:
“_OBJC_CLASS_$_HelloWorldKit”, referenced from:
objc-class-ref in BTSOLAppDelegate.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Googleでも、答えを見当たらないので、恐縮ですが、ご指導をいただけますでしょうか。
arm64 に関するエラーメッセージのようなので、
プロジェクトの設定で下記のように「Architecture」を変更すると直ると思います。
「Build Settings」の「Architecture」を
「Standard architectures (including 64 bit) (armv7, armv7s, arm64) 」から
「Standard arcitectures (armv7, armv7s) 」に変更
参考にBuildしてみると、Run Scriptのところでエラーが出ていました。
最後から2行目の箇所が間違っていましたので報告しておきます。
下のように修正するとうまくビルド通りました。
誤:
cp ${FRAMEWORK_BUILD_PATH}
正:
cd ${FRAMEWORK_BUILD_PATH}
ご指摘の通りスクリプトが間違っていましたので修正しました。
エラーのご報告ありがとうございました!