GMOアドマーケティングのT.Oです。
前回に引き続き、SwiftでiOS用のフレームワークを作成する手順についてまとめます。
前提、フレームワークの作成手順は以下の通りです。
●前提
作成するフレームワークは、iOS8以降で利用可能なEmbedded Frameworkとします。
開発環境としてXcode 10.2を利用しSwift4.2を使用します。
●フレームワークの作成手順
1. フレームワーク開発のためのプロジェクト作成
2. 実機用とシミュレータ用のフレームワークを1つのフレームワークにまとめる
3. Bitcode対応
4. フレームワークテスト用のアプリを作成する
5. Appleへのアプリ申請対応
今回は作成手順3.からになります。
3.Bitcode対応
Bitcodeはコンパイルされたプログラムの中間表現です。Bitcode対応するとApp StoreにアップロードしたアプリをAppleがそれぞれのデバイスやOSにあわせて最適化してくれます。
フレームワークプロジェクトを選択し、「Build Settings」タブに切り替えます
まずフレームワークを作成するための基本設定を行います。
今回はiOS8以上に対応したいので[Deployment]で、[iOS Deployment Target]を[8.0]に設定します。
次にフレームワークをBitcode対応するには以下のような設定を行います。
[Enable Bitcode]を[YES]に設定します。
「Apple Clang – Custom Compiler Flags」→「Other C Flags」で、DebugとReleaseの両方に-fembed-bitcodeを追加します
「+」ボタンをクリックして、「ユーザー定義の設定を追加」を選択します
値としてBITCODE_GENERATION_MODEを入力します
BITCODE_GENERATION_MODEをbitcodeに設定しフレームワークをビルドします。
4.フレームワークテスト用のアプリを作成する
フレームワークの機能をテストするためのアプリを作成します。今回はフレームワークと同じプロジェクトに追加することにします。
フレームワークのプロジェクトでメニューから「File」→「New」→「Target」を選択します。テンプレートの選択画面で「Sigle View App」を選択します。
Product Nameにテストアプリ名を指定して「Finish」を選択します。
ここではテストアプリ名を「OreTest」としました。
テストアプリにフレームワークを利用するための設定を行います。
「TARGETS」で「General」タブを選びます。「Embedded Binaries」に手順3.でビルドしたフレームワークファイルをドラッグ&ドロップします。
テストアプリのViewControllerにフレームワークを利用するためのコードを記述します。
1 2 3 4 5 6 7 8 9 10 |
import UIKit import OreFramework class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() Ore().oreMethod(); } } |
5.Appleへのアプリ申請対応
直前の手順でテストアプリにフレームワークを利用するための設定を行いましたが、ユニバーサルフレームワークには実機用とシミュレータ用の両方のバイナリが含まれています。Appleへのアプリ申請時には、実機用のバイナリのみ必要でシミュレータ用のバイナリは不要です。またシミュレータでの実行時には実機用のバイナリは不要です。そこで実機、シミュレータのそれぞれに適合するバイナリのみを抽出して組み込むための設定を行います。
アプリのプロジェクトを選択し、ビルド設定を追加するために「TARGETS」で「Build Phases」を選びます。次に「+」を選択して「New Run Script」を選びます。
Run Scriptを参照すると以下のような状態となっています。
以下のスクリプトをRun 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 |
# This script loops through the frameworks embedded in the application and # removes unused architectures. find "$APP_PATH" -name 'NativeAd.framework' -type d | while read -r FRAMEWORK do FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable) FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME" echo "Executable is $FRAMEWORK_EXECUTABLE_PATH" EXTRACTED_ARCHS=() for ARCH in $ARCHS do echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME" lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH" EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH") done echo "Merging extracted architectures: ${ARCHS}" lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}" rm "${EXTRACTED_ARCHS[@]}" echo "Replacing original executable with thinned version" rm "$FRAMEWORK_EXECUTABLE_PATH" mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH" done |
アプリをビルドし動作を確認します。
今回のフレームワークはログ出力を行いますので、ログ出力を確認するためにXcodeの表示設定を変更します。画面上部のツールバーからデバッグエリアを表示する「Hide or show the Debug Area」ボタンを選択します。次に画面下部の「Show the Console」ボタンを選択します。
画面の実行設定がテストアプリになっていることを確認して(本例ではOreTest)、実行ボタンを選択します。フレームワークの組み込みに問題がなければ、以下のようにコンソールに文字(”Hello Ore Framework”)が表示されているはずです。
問題なければ、次にアーカイブ可能かを確認します。
この作業はアプリをipaファイルとしてビルドする作業になります。
Xcodeで「Generic iOS Device」を選び、Archiveを選択して、ビルドを行います。
問題なければここまでの手順は完了です。
いかがだったでしょうか?
次回はXcode11で導入されたxcframeworkについてご紹介します。
参考URL
■Stripping Unwanted Architectures From Dynamic Libraries In Xcode
http://ikennd.ac/blog/2015/02/stripping-unwanted-architectures-from-dynamic-libraries-in-xcode/