Swift Package ManagerでXCFramework形式のFirebaseを使って、ビルド時間を大幅に短縮する

12349 ワード

Firebaseライブラリでは、XCFramework形式のバイナリビルドが提供されています。バイナリビルドを使うと、ライブラリをビルドしないためアプリ全体のビルド時間を削減できます。調査した結果、Swift Package Manager(SPM)でバージョン管理しつつバイナリ版のFirebaseライブラリを利用できたので、その方法を紹介します。

結論

  1. XcodeのAdd Packageshttps://github.com/akaffenberger/firebase-ios-sdk-xcframeworks を追加します[1]。バージョニングはfirebaseと同じものが使えます。
  2. ターゲットのBuild Settingsから、Other Linker Flagsに-ObjCを入れます[2]

なお、FirebaseFirestoreSwiftなど、Beta版の機能はバイナリに含まれていないので利用できません。
→ (2022.05.13追記) 5/3にリリースされたv9.0.0で(サービス名)SwiftパッケージがGAになり、FirebaseInAppMessagingSwiftを除くライブラリのバイナリも利用できるようになりました!これにより、バイナリ版を利用した上でasync/awaitを使いつつfirebaseの各機能を利用できるようになります[3]

前提

Firebase SDK for iOSでは、XCFramework形式でビルド済みライブラリが提供されています。公式リポジトリのreleasesページにて、Firebaseの全サービスのXCFrameworkをダウンロードできます。

このzipファイルを開くと、以下のようになっています。

- Firebase.h: 各サービスimport用ヘッダ定義
- module.modulemap: modulemap定義
- NOTICES: 依存ライブラリのオープンソースライセンス一覧
- Firebase***: サービスごとのXCFramework一式。XCFrameworkごとにInfo.plistとアーキテクチャごとのXCFramworkの実体を持つ。

これらのファイルをプロジェクトに導入することで、Firebaseのサービスで利用できるようになります。

XCFrameworkを使う方法

以下の2種類があります。

  1. firebase-ios-sdk-xcframeworksライブラリを使う方法
  2. (自前でライブラリを依存させる)

2021年12月頃に1.が開発され、SPM上でバージョン管理ができるようになっています。ライブラリ管理のしやすさとビルド時間の削減を両立できておすすめです。

1. firebase-ios-sdk-xcframeworksライブラリを使う方法

akaffenberger氏が提供しているfirebase-ios-sdk-xcframeworksライブラリを利用します。本ライブラリはGitHub Actionで大体2時間ごとにfirebase公式の最新リリースを見に行くようになっており、最新のバイナリのリリースがcommitされる仕組みとなっています。

上記仕組みのため、SPMで上記リポジトリを登録することで、firebaseの最新バイナリを利用できます。すでにSPMでfirebase-ios-sdkを登録している場合は、そちらを削除して上記リポジトリを登録するとOKです。

また、プロジェクトのBuild Settingsから、Other Linker Flagに-ObjCを入れるようにしてください。このフラグがないと、ビルドは通るものの実行時に結果が返ってこないなど、Firebaseライブラリが正常に動作しません。


2. (おまけ) 自前でライブラリを依存させる

どのようにすればFirebaseのXCFrameworkを自前で使えるかどうか、具体例を記載しています。通常の用途では2.の方法は管理が煩雑になるものの、参考として記載しています。

サンプルコード

公式のXCFrameworkについて、bin/pull_firebase_xcframeworks.shによりダウンロード・抽出しています。抽出したXCFrameworkはxcframeworks/firebase下に自動的に同期(rsync)されるため、後はプロジェクト側で下記の設定などを行えばOKです。