Framework作成-Swiftでの使用メモ(Xcode6)


忘れないようにメモ。。。

1.xcodeのFile -> New -> Framework & Library -> Cocoa Touch Framework
 で、テンプレート作成
 (とりあえず、swiftでは、どうするかわからんのでobjective-cで作成)

2.プログラム書く
 

とりあえず。。。

3.APIを公開するヘッダをFramework用のヘッダにインクルードする。

※""じゃなく、<>の方にする事。。。

4.公開するヘッダのTargetをPublicにする。
 (ヘッダ内でincludeしているヘッダもPublicにする事!!!)

(FugaFugaObjを追加)

Projectになってるので、、、、

Publicにする。
includeしてるヘッダも同様。。。

5.Targetの修正

(とりあえず、おまじない。。。)

※Dynamic Library Install Baseが何も入ってなかったら、@rpathを設定。。。

6.Universal化する為、ターゲット追加

ターゲットを追加する。(+ボタンを押す。。。)

Aggregateを選択

ターゲット名を「プロジェクト名」+「-Universal」とする。

ターゲットが出来る。

メニューから、Product -> Scheme -> Edit Scheme... を選択

Manage Schemesボタンを押す。

SharedにチェックしてClose

Univesal化の為に、Build Phasesに Runscriptを編集

ないので、+を押して追加(New Run Scriptを選択)

親切な人のスクリプトを設定
https://gist.github.com/syshen/c24d127e1adc2783e0e7

######################
# Options
######################

REVEAL_ARCHIVE_IN_FINDER=false

FRAMEWORK_NAME="${PROJECT_NAME}"

SIMULATOR_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${FRAMEWORK_NAME}.framework"

DEVICE_LIBRARY_PATH="${BUILD_DIR}/${CONFIGURATION}-iphoneos/${FRAMEWORK_NAME}.framework"

UNIVERSAL_LIBRARY_DIR="${BUILD_DIR}/${CONFIGURATION}-iphoneuniversal"

FRAMEWORK="${UNIVERSAL_LIBRARY_DIR}/${FRAMEWORK_NAME}.framework"


######################
# Build Frameworks
######################

xcodebuild -workspace ${PROJECT_NAME}.xcworkspace -scheme ${PROJECT_NAME} -sdk iphonesimulator -configuration ${CONFIGURATION} clean build CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphonesimulator 2>&1

xcodebuild -workspace ${PROJECT_NAME}.xcworkspace -scheme ${PROJECT_NAME} -sdk iphoneos -configuration ${CONFIGURATION} clean build CONFIGURATION_BUILD_DIR=${BUILD_DIR}/${CONFIGURATION}-iphoneos 2>&1

######################
# Create directory for universal
######################

rm -rf "${UNIVERSAL_LIBRARY_DIR}"

mkdir "${UNIVERSAL_LIBRARY_DIR}"

mkdir "${FRAMEWORK}"


######################
# Copy files Framework
######################

cp -r "${DEVICE_LIBRARY_PATH}/." "${FRAMEWORK}"


######################
# Make an universal binary
######################

lipo "${SIMULATOR_LIBRARY_PATH}/${FRAMEWORK_NAME}" "${DEVICE_LIBRARY_PATH}/${FRAMEWORK_NAME}" -create -output "${FRAMEWORK}/${FRAMEWORK_NAME}" | echo

# For Swift framework, Swiftmodule needs to be copied in the universal framework
if [ -d "${SIMULATOR_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/" ]; then
    cp -f ${SIMULATOR_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/* "${FRAMEWORK}/Modules/${FRAMEWORK_NAME}.swiftmodule/" | echo
fi

if [ -d "${DEVICE_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/" ]; then
    cp -f ${DEVICE_LIBRARY_PATH}/Modules/${FRAMEWORK_NAME}.swiftmodule/* "${FRAMEWORK}/Modules/${FRAMEWORK_NAME}.swiftmodule/" | echo
fi

######################
# On Release, copy the result to release directory
######################
OUTPUT_DIR="${PROJECT_DIR}/Output/${FRAMEWORK_NAME}-${CONFIGURATION}-iphoneuniversal/"

rm -rf "$OUTPUT_DIR"
mkdir -p "$OUTPUT_DIR"

cp -r "${FRAMEWORK}" "$OUTPUT_DIR"

if [ ${REVEAL_ARCHIVE_IN_FINDER} = true ]; then
  open "${OUTPUT_DIR}/"
fi

7.ビルド

クリーンして、
シミュレーターと、実機、両方でビルドする。

ターゲットを Univasalにして、ビルド

Frameworkの出来たパスを調べる。

出来てる事確認

8.swiftで適当にプロジェクト作成

9.プロジェクト上にframeworkを適当にフォルダ掘ってコピー

プロジェクトにドラッグドロップ

ターゲットでframeworkが参照されてるか確認

10.swiftで使えるようにヘッダ作成
ヘッダ名:プロジェクト名+「-Bridging-Header.h」


(TkTkApp-Bridging-Header.hを作成)

作成したヘッダにFrameworkのヘッダをインクルードする。

※共通ヘッダをインクルード

11.Build Phasesを確認

Link Binary With Librariesを確認

入ってると思う。。。

Copy Filesは、ないと思うので追加する。
(メニューのEditor -> Add Build Phases は非活性なので、Build Phasesを開いて
 +ボタンを押す)

※DestinationをFrameworksにする事!!!!

11.FrameworkのAPIを使ってみる

共通ヘッダをimportして、API呼び出し

シミュレーターで実行してみる。

動いた。。。

実機で実行

同じく動いてるので、Univasal化されている。。。

TODO
・空容量がないのでXcodeを上げれない。。。
 次のXcodeでやり方かわってくるかどうか。。。

・univarsalを最初から作りたいが、xcodeがバージョンあがったら、
 そうなってるかどうか。。。(多分なってない)