Sunday, February 17, 2013

Xcode4.6でiOS framework作成

iOSのframework作成をしようと、いろいろ参考にしたけど、すごく詰まったので一応書いておく
Xcodeのバージョンは4.6

Project作成

[File]→[New]→[Project]
を選択
[iOS]→[Framework & Library]→[Cocoa Touch Static Library]

[Product Name] "MyLibrary" と入力(名前を決める。***.framework の *** の部分)
[Organization Name] と [Company Identifier] は適当に
[Include Unit Tests] はどちらでも
[Use Automatic Reference Counting] はチェック入れたままで

パスはまあ適当に好きな所に作成


Headerディレクトリ作成

Xcode の MyLibrary ディレクトリを右クリックして[Add Files to "MyLibrary"...]をクリック
出てきたプロンプトの左下の[New Folder]をクリックして "Headers" と入力して[Create]
右下の[Add]でプロジェクトに追加
ここに公開したい .hファイルを置く(ライブラリを実装したら入れてください)


ターゲット作成

[TARGETS]→[MyLibrary]を選択して、左下の[Add Target]をクリック
[iOS]→[Other]→[Aggregate]

[Product Name] "MyLibrary-Universal" と入力(何でもいい?)
[Finish]して作成


スキーマ設定変更

[Manage schemes]で MyLibrary の Show のチェックを外す
(別に外す必要はないけど、使用しないので非表示にしているだけ)


Info.plist作成

[Supporting Files]を右クリックして[New File...]をクリック
[iOS]→[Resource]→[Property List]

[Save As:]に "Info.plist" と入力
[Create]して作成
Info.plist を右クリックして[Open As]→[Source Code]
下のコードをコピーして上書き。
<?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>MyLibrary</string>
 <key>CFBundleIdentifier</key>
 <string>com.blogspot.fiahfy.MyLibrary</string>
 <key>CFBundleInfoDictionaryVersion</key>
 <string>6.0</string>
 <key>CFBundleVersion</key>
 <string>1</string>
 <key>CFBundleExecutable</key>
 <string>MyLibrary</string>
 <key>CFBundleGetInfoString</key>
 <string>MyLibrary</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>English</string>
 <key>NSHumanReadableCopyright</key>
 <string>Copyright fiahfy. All rights reserved.</string>
 <key>CFBundleShortVersionString</key>
 <string>1.0.0</string>
</dict>
</plist>

Info.plist を右クリックして[Open As]→[Property List]
で開き直して、
MyLibrary, com.blogspot.fiahfy.MyLibrary, fiahfy
等の部分を自分で設定したものに適宜変更する


スクリプト設定

[TARGETS]→[MyLibrary-Universal]を選択して、
[Build Phases]→[Add Build Phase]→[Add Run Script]をクリック
"Type a script or drag a script file from your workspace" の部分に以下のスクリプトをコピペ
# Environment Variables
INFO_PLIST="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 framework 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

# create symlinks
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)



ここまで設定すればビルドは一応通るはず(中身がないので意味のないframeworkですが)

ビルド後は
build/Debug-framework/MyLibrary.framework
が作成されているので、これを使用したいプロジェクトで「Linked Frameworks and Libraries」に追加すればおk

リリースビルドした場合は
build/Release-framework/MyLibrary.framework
で、配布したい時は
build/Release-framework/MyLibrary.1.0.0.zip
を配ればよいって感じかと思います

中身書く前に疲れたっていう


参考

No comments:

Post a Comment