強火で進め

このブログではプログラム関連の記事を中心に書いてます。

iOS向けにXCFrameworkを作成し、署名する手順

この記事ではXCFrameworkを作成し、署名(コード署名)を行う手順を解説します。 解説前にまず、記事内に出てくる用語の解説を書いておきます。知らない用語が出てきたらここに戻ってきて確認して下さい。

用語解説

Archive

配布やストアに公開時に必要な実行可能ファイル、アセット、メタデータなどのリソースをBundle化したもの。

Bundle(バンドル)

標準化された階層構造を持つディレクトリにリソースをまとめたもの。通常は1つのファイルの様に扱われるが右クリックメニューから「パッケージの内容を表示」を選択するとディレクトリに含まれた内容が確認できる。

参考情報:Placing Content in a Bundle | Apple Developer Documentation

Framework

Dynamic shared library(動的共有ライブラリ)やStatic Library(静的ライブラリ)、アセット、メタデータなどをBundle化したもの。

Dynamic shared library(動的共有ライブラリ)

実行時にアプリから利用する形式のライブラリ。複数のアプリから同時に利用する事が可能である為、メモリが節約できるという利点が有る。また、必要になった時点でロードされる為に起動時に必要にメモリ量が抑えられるなどの利点が有ります。

Static Library(静的ライブラリ)

アプリのビルド時にアプリ内に取り込まれる形式のライブラリ。

署名

そのファイルやXCFrameworkに対して、以下の事を保証する仕組み。

  • 署名された時点から変更が行われていない
  • 制作者は署名した人である

制作者が署名処理を行う事で署名済みのファイルやXCFrameworkを作成する事ができます。

XCFrameworkを作成

まずはXcodeで普通にiOSのFrameworkを作成します。

※Frameworkの作成方法については別途検索して下さい。

Frameworkを作成する時にはXcodeプロジェクトのBuild Settingsタブで以下ものを検索して設定を変更して下さい。

  • Build Libraries for DistributionをYes
  • Skip InstallをNo

FrameworkのXcodeプロジェクトの準備できたらターミナルを開き、.xcodeprojファイルがあるディレクトリへ移動します。

ディレクトリで以下のコマンドを実行するとiOS環境向けのarchiveが作成されます。

例) TestFrameworkというプロジェクトの場合

xcodebuild archive \
    -project TestFramework.xcodeproj \
    -scheme TestFramework \
    -destination "generic/platform=iOS" \
    -archivePath "archives/TestFramework-iOS"

-projectXcodeのプロジェクトのパスを指定、-archivePathでarchiveの生成先のパスを指定します。

続いてiOSシミュレータ環境向けに作成します。コマンドはこちら。

xcodebuild archive \
    -project TestFramework.xcodeproj \
    -scheme TestFramework \
    -destination "generic/platform=iOS Simulator" \
    -archivePath "archives/TestFramework-iOS_Simulator"

これでiOS向けとiOSシミュレータ向けのarchiveが作成できました。

次に以下のコマンドで2つのarchiveからXCFrameworkを作成します。

xcodebuild -create-xcframework \
    -archive archives/TestFramework-iOS.xcarchive -framework TestFramework.framework \
    -archive archives/TestFramework-iOS_Simulator.xcarchive -framework TestFramework.framework \
    -output xcframeworks/TestFramework.xcframework

-archiveで指定したarchiveの中の含まれているどのFrameworkを使用するかを-frameworkで指定します。-outputで指定したパスにXCFrameworkが生成されます。

ここでNo 'swiftinterface' files found within '(ここにTestFramework.swiftmoduleのパス)'というエラーが表示された時にはFramework作成時の設定として記述したBuild Libraries for DistributionをYesが行われているか確認して下さい。

error: the path does not point to a valid framework: (ここにTestFramework.frameworkのパス)というエラーが表示された時にはSkip InstallをNoが行われているか確認して下さい。

もし、Frameworkではなく、.aファイル(Static Libraryファイル)からXCFrameworkを作成したい場合には-frameworkの代わりに-libraryで.aファイルのパス、-headersでヘッダファイルのディレクトリを指定します。

(コマンド例)

xcodebuild -create-xcframework
    -library products/iOS/usr/local/lib/libMyLibrary.a -headers products/iOS/usr/local/include
    -library products/iOS_Simulator/usr/local/lib/libMyLibrary.a -headers products/iOS/usr/local/include
    -output xcframeworks/MyLibrary.xcframework

署名

署名はApple Developer ProgramのID、もしくは自己署名証明書で行えます。

ここではApple Developer ProgramのIDで署名する方法を解説します。

Apple Distributionをまだ作成していない場合には作成が必要です。

Apple Distributionの作成方法については別途検索して下さい。

Apple Distributionを作成し、Keychain(「キーチェーンアクセス」アプリ)に追加済みで有れば以下の様な証明書が見つかるはずです。

この「Apple Distribution: 」で始まる行の文字列は署名を行う時に必要なのでメモしておいて下さい。

署名を行う

ターミナルで以下のコマンドを実行するとXCFrameworkに署名が行われます。

codesign \
    --timestamp \
    -s "Apple Distribution: XXXXX (YYYYYYYYYY)" 
    xcframeworks/TestFramework.xcframework

--timestampで署名時刻の認証を要求します。-sでAppple Distributionの情報を記載します。先ほどメモしていたApple Distribution:から始まる文字列を記載して下さい。最後に署名を行うXCFrameworkのパスを指定します。

これでXCFrameworkの作成と署名の作業が終わりました。

署名状況の確認

まず簡単な確認方法としてはXCFrameworkの中に_CodeSignatureというディレクトリが存在するかで確認できます。このディレクトリが存在する場合には署名済みです。

XcodeプロジェクトにXCFrameworkを追加済みの場合にはXCFrameworkを選択した状態で右側に有るインスペクターでファイルタブを見ると確認できます。ここに有るSignatureというブロックにStatus Verification succeededという記載が有ると署名に成功しています。

関連情報

developer.apple.com