Firebase の依存関係を静的または動的にリンクする

CocoaPods 1.9.0 と Firebase 7 以降では、Firebase の依存関係を静的フレームワークと動的フレームワークのどちらとして構築するかを選択できます。特定の動的ライブラリの動作が必要な場合を除き、静的フレームワークを使用することをおすすめします。

GitHub の外部で開発されたライブラリは、CocoaPods 1.9.0 以降とも静的でのみリンクできます。現在、このライブラリのリストには AdMobAnalyticsFirebase MLPerformance Monitoring が含まれています。zip ファイル、Swift Package Manager、Carthage など、他のすべての配布チャネルでは、静的にリンクされたライブラリのみが用意されています。

このドキュメントは、Apple プラットフォームでの動的リンクと静的リンクに関する実用的な知識のある読者を前提としています。これらのコンセプトに馴染みがない場合は、次のドキュメントを参照してください。

このドキュメントの内容は、実行不可能なリソース バンドルの読み込みではなく、ライブラリのリンクの種類に関連しているため、「ライブラリ」と「フレームワーク」という用語は同じ意味で使用されます。

静的リンク

静的にリンクされたライブラリは、ビルド時にアプリケーションの実行可能ファイルにバンドルされます。その結果、静的ライブラリ内のオブジェクト ファイルは、アプリの起動時にアプリ内に存在するため、アプリ起動時に動的リンカーが解決する必要はありません。結果として、静的リンクを使用するアプリの起動が速くなります。バイナリとアプリの実行可能ファイルがわずかに大きくなりますが、実行可能ファイルのサイズが大きくなると、バンドルされる動的ライブラリの不足が相殺される点に注目してください。

Podfile でリンクを明示的に指定することで、Firebase の依存関係の静的リンクを強制できます。

# cocoapods >= 1.9.0
use_frameworks! :linkage => :static

動的リンク

動的にリンクされたライブラリは、アプリのメインの実行可能ファイルとは別のアプリバンドルに保存され、アプリの起動時に動的リンカーによる読み込みが必要です。Apple のフレームワークはすべて動的にリンクされることで、プロセス間のコード共有が可能になります。これと同じように、動的フレームワークを使用して、アプリや拡張機能のターゲット間でコードを共有できます。2 つのアプリケーションが同じデベロッパーに署名されていても、これらのアプリケーション間で動的フレームワークを共有することはできません。

Firebase を動的フレームワーク ターゲットの依存関係として使用する場合は、Firebase も動的にリンクする必要があります。動的にリンクしないと、アプリのランタイムでクラスの重複定義が発生します。動的リンクは use_frameworks! のデフォルトの動作ですが、Podfile で動的リンクを明示的に指定することが可能です。

# cocoapods >= 1.9.0
use_frameworks! :linkage => :dynamic

特に、アプリに多くの依存関係がある場合には、動的リンクによってアプリの起動時間が長くなる可能性があることに注意してください。