GMOアドマーケティングのT.Oです。
SwiftでiOS用のフレームワークを作成する手順についてまとめます。
前提、フレームワークの作成手順は以下の通りです。
●前提
作成するフレームワークは、iOS8以降で利用可能なEmbedded Frameworkとします。
開発環境としてXcode 10.2を利用しSwift4.2を使用します。
●フレームワークの作成手順
1. フレームワーク開発のためのプロジェクト作成
2. 実機用とシミュレータ用のフレームワークを1つのフレームワークにまとめる
3. フレームワークテスト用のアプリを作成する
4. Bitcode対応
5. Appleへのアプリ申請対応
1度にすべてをお伝えするのは難しいため、今回は上記の手順のうちの
「1. フレームワーク開発のためのプロジェクト作成」
「2. 実機用とシミュレータ用のフレームワークを1つのフレームワークにまとめる」
についてまとめます。
1.フレームワーク開発のためのプロジェクト作成
Xcodeで「File→New→Project..」メニューを選択し、テンプレートの選択画面で「Cocoa Touch Framework」を選びます。
新規プロジェクトのオプション選択画面が表示されるので、Product Nameなどの設定を行います。
次に「New File」を選択し、テンプレート選択画面で「Cocoa Touch Class」を選び、フレームワークの処理をSwiftで記述します。
ここでは以下のように文字をコンソール出力することにします。
1 2 3 4 5 6 7 |
import UIKit public class Ore: NSObject { public func oreMethod(){ print("Hello Ore Framework"); } } |
Product→Buildを選択しビルドします。エラーがないことを確認します。
2.実機用とシミュレータ用のフレームワークを1つのフレームワークにまとめる
作成手順1.までの状態では実機用とシミュレータ用のフレームワークを別々にビルドしなければなりません。
また生成したフレームワークがそれぞれ別になりますので、アプリを作成する時に実機の時には実機用のフレームワーク、シミュレータの時にはシミュレータ用のフレームワークを参照するように設定を変更しなければならず不便です。
そこでビルドの設定を追加して1つのフレームワークにまとめます。1つにまとめたフレームワークはユニバーサルフレームワークとよばれています。
ビルド設定を追加するために「File→New→Target」で新規ターゲットのテンプレート選択画面で「Cross-platform→Aggregate」を選びます。
作成したAggregateを選択した状態で「Build Phases」を選び、「+」を選択して「New Run Script」を選びます。
以下のRun ScriptをScript部分に貼り付けます。これは実機、シミュレータ用のフレームワークをビルドしてユニバーサルフレームワークを作成するためのスクリプトです。
(ユニバーサルフレームワーク作成用のスクリプトは「参考URL」に掲載のスクリプトを参考にさせていただいています)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
#!/bin/sh UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal # make sure the output directory exists mkdir -p "${UNIVERSAL_OUTPUTFOLDER}" # Step 1. Build Device and Simulator versions xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build # Step 2. Copy the framework structure (from iphoneos build) to the universal folder cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/" # Step 3. Copy Swift modules from iphonesimulator build (if it exists) to the copied framework directory SIMULATOR_SWIFT_MODULES_DIR="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/." if [ -d "${SIMULATOR_SWIFT_MODULES_DIR}" ]; then cp -R "${SIMULATOR_SWIFT_MODULES_DIR}" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule" fi # Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}" # Step 5. Convenience step to copy the framework to the project's directory cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}" # Step 6. Convenience step to open the project's directory in Finder open "${PROJECT_DIR}" |
追加したビルド設定を選択してビルドします。ビルドが成功したら生成されたフレームワークを確認します。
実機用のモジュールとシミュレータ用のモジュールが両方とも含まれている状態になっていればここまでの手順は完了です。
いかがだったでしょうか?
次回は「3. フレームワークテスト用のアプリを作成する」からです。
参考URL
■ユニバーサルフレームワーク作成用スクリプト
https://gist.github.com/cromandini/1a9c4aeab27ca84f5d79