Framework作成-Swiftでの使用メモ（Xcode6）


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

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

2.プログラム書く 
　
![スクリーンショット 2015-10-16 17.25.50.png](https://qiita-image-store.s3.amazonaws.com/0/38889/189ac1f1-6892-5ffb-fa4f-b2c72a3c0c9f.png "スクリーンショット 2015-10-16 17.25.50.png")

とりあえず。。。
![スクリーンショット 2015-10-16 17.27.23.png](https://qiita-image-store.s3.amazonaws.com/0/38889/47db8972-963f-4db2-2668-b98ea4c9ae8f.png "スクリーンショット 2015-10-16 17.27.23.png")

3.APIを公開するヘッダをFramework用のヘッダにインクルードする。
![スクリーンショット 2015-10-16 17.30.13.png](https://qiita-image-store.s3.amazonaws.com/0/38889/131160a1-86dc-6aa2-65f8-3adc52a306df.png "スクリーンショット 2015-10-16 17.30.13.png")
※""じゃなく、<>の方にする事。。。

4.公開するヘッダのTargetをPublicにする。
　（ヘッダ内でincludeしているヘッダもPublicにする事！！！）
![スクリーンショット 2015-10-16 17.34.40.png](https://qiita-image-store.s3.amazonaws.com/0/38889/dd007694-234e-e3a1-47da-379b81c4d5b0.png "スクリーンショット 2015-10-16 17.34.40.png")
（FugaFugaObjを追加）

![スクリーンショット 2015-10-16 17.36.27.png](https://qiita-image-store.s3.amazonaws.com/0/38889/17392ce9-b6b3-61a2-1b4e-393e703e0210.png "スクリーンショット 2015-10-16 17.36.27.png")

Projectになってるので、、、、
![スクリーンショット 2015-10-16 17.37.31.png](https://qiita-image-store.s3.amazonaws.com/0/38889/e53e3e89-fcc0-f2ce-bff0-dcf9917241a1.png "スクリーンショット 2015-10-16 17.37.31.png")

Publicにする。
includeしてるヘッダも同様。。。
![スクリーンショット 2015-10-16 17.38.53.png](https://qiita-image-store.s3.amazonaws.com/0/38889/713e25e4-d444-8dd4-395d-09585643a7db.png "スクリーンショット 2015-10-16 17.38.53.png")

5.Targetの修正
![スクリーンショット 2015-10-16 17.42.10.png](https://qiita-image-store.s3.amazonaws.com/0/38889/58813c39-4054-8272-2ec3-43fd8af2dd7c.png "スクリーンショット 2015-10-16 17.42.10.png")

（とりあえず、おまじない。。。）

![スクリーンショット 2015-10-16 17.47.55.png](https://qiita-image-store.s3.amazonaws.com/0/38889/74a63c8a-3bd5-e0d5-2969-704630602d34.png "スクリーンショット 2015-10-16 17.47.55.png")

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


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

ターゲットを追加する。（＋ボタンを押す。。。）
![スクリーンショット 2015-10-19 7.45.33.png](https://qiita-image-store.s3.amazonaws.com/0/38889/685ce18e-3f33-c8cd-279e-4cc3bce444c7.png "スクリーンショット 2015-10-19 7.45.33.png")


Aggregateを選択
![スクリーンショット 2015-10-19 7.04.56.png](https://qiita-image-store.s3.amazonaws.com/0/38889/724ee205-873e-06bc-9770-add144b0f08e.png "スクリーンショット 2015-10-19 7.04.56.png")

ターゲット名を「プロジェクト名」+「-Universal」とする。
![スクリーンショット 2015-10-19 7.06.22.png](https://qiita-image-store.s3.amazonaws.com/0/38889/81fa034b-f28f-032a-ed59-6d5059757370.png "スクリーンショット 2015-10-19 7.06.22.png")

ターゲットが出来る。
![スクリーンショット 2015-10-19 7.46.20.png](https://qiita-image-store.s3.amazonaws.com/0/38889/c606d8da-29d4-6e0b-69ea-000aa367a09e.png "スクリーンショット 2015-10-19 7.46.20.png")


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

![スクリーンショット 2015-10-19 7.13.14.png](https://qiita-image-store.s3.amazonaws.com/0/38889/2e49274f-7cec-2d65-977d-f43c11781c27.png "スクリーンショット 2015-10-19 7.13.14.png")

Manage Schemesボタンを押す。
![スクリーンショット 2015-10-19 7.47.43.png](https://qiita-image-store.s3.amazonaws.com/0/38889/99adfb84-7838-e24e-37c0-feb7c7c2379d.png "スクリーンショット 2015-10-19 7.47.43.png")


SharedにチェックしてClose
![スクリーンショット 2015-10-19 7.47.54.png](https://qiita-image-store.s3.amazonaws.com/0/38889/ef3bcd7a-5d9a-98ff-b6d0-08d7c198ee5c.png "スクリーンショット 2015-10-19 7.47.54.png")


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

![スクリーンショット 2015-10-19 7.49.27.png](https://qiita-image-store.s3.amazonaws.com/0/38889/9a8e78f3-b7ad-1efd-e7fa-192ade372bc6.png "スクリーンショット 2015-10-19 7.49.27.png")


ないので、＋を押して追加（New Run Scriptを選択）
![スクリーンショット 2015-10-19 7.50.24.png](https://qiita-image-store.s3.amazonaws.com/0/38889/38ff7ec0-66cf-a37a-4cae-181716ebbff9.png "スクリーンショット 2015-10-19 7.50.24.png")



親切な人のスクリプトを設定
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
```

![スクリーンショット 2015-10-19 7.51.25.png](https://qiita-image-store.s3.amazonaws.com/0/38889/5fa6d2d6-9572-90b7-81ae-3bbb11d0af75.png "スクリーンショット 2015-10-19 7.51.25.png")



7.ビルド

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

![スクリーンショット 2015-10-19 8.01.21.png](https://qiita-image-store.s3.amazonaws.com/0/38889/a6903b74-836f-7b3f-6bb8-b0e317a43964.png "スクリーンショット 2015-10-19 8.01.21.png")

![スクリーンショット 2015-10-19 8.00.43.png](https://qiita-image-store.s3.amazonaws.com/0/38889/9804ac68-cbb0-d10b-c1d7-0e6575e57759.png "スクリーンショット 2015-10-19 8.00.43.png")


ターゲットを Univasalにして、ビルド
![スクリーンショット 2015-10-19 7.54.06.png](https://qiita-image-store.s3.amazonaws.com/0/38889/f0198f87-8dab-70bc-590e-624cddee97b6.png "スクリーンショット 2015-10-19 7.54.06.png")


Frameworkの出来たパスを調べる。
![スクリーンショット 2015-10-16 17.53.30.png](https://qiita-image-store.s3.amazonaws.com/0/38889/8abb1c1d-fb44-6022-7b6e-f9ddc52ed074.png "スクリーンショット 2015-10-16 17.53.30.png")


![スクリーンショット 2015-10-16 17.55.57.png](https://qiita-image-store.s3.amazonaws.com/0/38889/0b6b21c0-99aa-90a1-85ac-3e47ff44e0b8.png "スクリーンショット 2015-10-16 17.55.57.png")


出来てる事確認
![スクリーンショット 2015-10-19 8.02.47.png](https://qiita-image-store.s3.amazonaws.com/0/38889/58f409ad-aaac-0512-b4e6-9272057b26c5.png "スクリーンショット 2015-10-19 8.02.47.png")



8.swiftで適当にプロジェクト作成
![スクリーンショット 2015-10-16 18.06.25.png](https://qiita-image-store.s3.amazonaws.com/0/38889/b265ef91-cef1-789e-1c7c-7e2854a110a8.png "スクリーンショット 2015-10-16 18.06.25.png")


9.プロジェクト上にframeworkを適当にフォルダ掘ってコピー
![スクリーンショット 2015-10-16 18.11.28.png](https://qiita-image-store.s3.amazonaws.com/0/38889/fd970f00-272f-3f96-a27d-7179d546cbbc.png "スクリーンショット 2015-10-16 18.11.28.png")


プロジェクトにドラッグドロップ
![スクリーンショット 2015-10-16 18.14.00.png](https://qiita-image-store.s3.amazonaws.com/0/38889/7bd37a1a-a780-a6c7-af43-0bf253cf3bda.png "スクリーンショット 2015-10-16 18.14.00.png")


ターゲットでframeworkが参照されてるか確認
![スクリーンショット 2015-10-16 18.18.50.png](https://qiita-image-store.s3.amazonaws.com/0/38889/24bbf4f6-c994-57b3-33eb-df00afc740ee.png "スクリーンショット 2015-10-16 18.18.50.png")



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

![スクリーンショット 2015-10-16 18.16.57.png](https://qiita-image-store.s3.amazonaws.com/0/38889/98792936-0259-4b84-b10f-83c1b7da4eb1.png "スクリーンショット 2015-10-16 18.16.57.png")
（TkTkApp-Bridging-Header.hを作成）

作成したヘッダにFrameworkのヘッダをインクルードする。
![スクリーンショット 2015-10-16 18.20.14.png](https://qiita-image-store.s3.amazonaws.com/0/38889/e8e28c53-5580-39e0-09d1-8b09e1822b9a.png "スクリーンショット 2015-10-16 18.20.14.png")

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

11.Build Phasesを確認

Link Binary With Librariesを確認

![スクリーンショット 2015-10-16 18.23.36.png](https://qiita-image-store.s3.amazonaws.com/0/38889/7f36d6cc-f763-aec2-f82e-17e2a18091e7.png "スクリーンショット 2015-10-16 18.23.36.png")

入ってると思う。。。

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

![スクリーンショット 2015-10-16 18.26.58.png](https://qiita-image-store.s3.amazonaws.com/0/38889/3bd1c754-f283-3ed6-6eba-8fbaa8f3a585.png "スクリーンショット 2015-10-16 18.26.58.png")


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

11.FrameworkのAPIを使ってみる

![スクリーンショット 2015-10-16 18.29.21.png](https://qiita-image-store.s3.amazonaws.com/0/38889/cdef368e-6a77-88db-0ac5-a65eee0428fd.png "スクリーンショット 2015-10-16 18.29.21.png")


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

シミュレーターで実行してみる。
![スクリーンショット 2015-10-16 18.32.33.png](https://qiita-image-store.s3.amazonaws.com/0/38889/0c0fc98b-e6c1-521a-cff0-3b2f054b20b0.png "スクリーンショット 2015-10-16 18.32.33.png")

動いた。。。

実機で実行
![スクリーンショット 2015-10-19 8.06.30.png](https://qiita-image-store.s3.amazonaws.com/0/38889/a4dbc100-5847-07e7-99ac-cd90fd6f868c.png "スクリーンショット 2015-10-19 8.06.30.png")


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


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

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