iOSDC2021のDaiki Matsudateさんの発表を聞いて今までなんとなく理解していたFrameworkのことがXCFrameworkとSPMとの関連を含めかなり理解が進んだのでその復習がてら知識の整理をしようと思います。この発表ではMulti ModulesやMulti Projectsについても非常に素晴らしい内容が含まれていますがここではFrameworkのみにフォーカスしてまとめようと思います。
Frameworkとは
- Build TargetとLinkする実行可能なバイナリ
- FrameworkはBuild Targetに設定することができる
- Linkの仕方には2種類ある
Static Link
- ビルド時にObject Code(.oファイル)をひとつのFrameworkにまとめアプリとLinkしひとつのバイナリにまとめる
- よって起動時間は短くなる
- このLink方法のFrameworkをStatic Frameworkという
Dynamic Link
- ビルド時にObject Code(.oファイル)をひとつのFrameworkにまとめアプリとは別にバイナリを生成し、アプリ実行時にLinkしメモリに保持する
- よって起動時間は長くなる
- このLink方法のFrameworkをDynamic Frameworkという
Linkの仕方
Linkは一度にすべてのObject Codeに対して行うのではなくModule単位で.oファイルを生成しさらにまとめていってFrameworkやアプリのバイナリにまとめている
Moduleとは
importできる単位のこと
すなわちソースコードにimportをかけるものはModuleとして生成されている
import Resource
import Styles
import SwiftUI
生成物はDerived Dataに.swiftmodleというBundleとして置かれている
Bundleとは
ディレクトリ構造を持つがファイルのように振る舞うもの
ソースコードがコンパイルまでされると利用可能になる
ex) Xcodeのプロジェクト - ファイルとして扱えるのでダブルクリックで実行できる
LibraryとFramework
一番の大きな違いはBundleを保持しているかいないか
LibraryはBundleを保持していない
詳しくは ライブラリのインポートとリンクの仕組み完全解説 - フレームワークとライブラリの違い
XCFrameworkとは
- 配布可能なBundle形式のFramework
- 以下のような複数のBuild環境で動くFramework(ビルド済みバイナリ)を含むことができる
- Platform(iOS/macOS/tvOS/watchOS)
- Simulator/Device
- Static/Dynamic
- Build Architecture(x86_64,arm64,...)
Swift Package Manager(SPM)とは
一言でいうとCarthageやCocoaPodsと同様パッケージ管理ツール
メリット
- Swiftに同梱されている(特にCIの面で効力発揮)
- rubyのセットアップやCarhageそのものを落とす必要がない
- Xcodeに統合されている
- 開発しながらパッケージの更新を同じIDE上で行える(=コマンドラインツール不要)
- macOS/Linux両対応
- 自動で依存関係の解決、更新
デメリット
- Xcode11以降のみが対応(これ以前を使ってることはあまり考えられないが)
SPMにおけるXCFrameworkの立ち位置
- SPMでバイナリ提供のSDKを使いたい場合(広告SDKやAnalyticsなどソースコードを開示したくない場合)XCFrameworkでないといけない
- targetに.binaryTargetを使う
- 指定urlはローカルでもリモートでもいいがリモートの場合はchecksumが必要
補足1: その他特徴
3rd party ライブラリを管理するだけではない
- ModuleやFrameworkを自在に構成することができる(=Multi Modules)
- Multi Moduleにすることでビルド時間を短縮できる
- ビルドはModule毎に行われるため、Moduleに変更がなければキャッシュを使うようになっている
- そのためインクリメンタルビルドが高速で行われる
- プロジェクトファイルのダイエットができる(=Multi Projects)
補足2: SPMに対応していない場合
- Package.swiftがない
- ソースコードが公開されていればビルド可能なためPRでPackage.swiftを追加してもらうかForkして追加
- ソースコード非公開かつXCFrameworkもない(Frameworkしかない)
- CocoaPodsで代用するのが手っ取り早い