はじめに
iOSアプリにFirebaseを導入する際、選択肢として主にCocoapods
とCarthage
の2通りがありますが、それぞれ一長一短があります。
Firebaseをよく利用する私としては、どちらも使いにくいなと感じました。色々調べていく中で、公式ドキュメントにあるような第3の方法がシンプルで早かったので、その方法をまとめました。
Cocoapods
導入が簡単だが、ビルド時間がかかる(特にFirestore)。Xcodeのビルドキャッシュもあるので、ある程度は全体的なビルド時間の短縮はありますが、それでも長いと感じます。
Carthage
FirebaseのリポジトリをみてみるとCarthageはまだベータ版だそうです。ビルドはバイナリを使っていますが、依存関係が複雑でXcodeに導入するときに注意を払わないとなりません。
第3の方法
この2つ以外の方法としては、直接githubからバイナリをダウンロードして使用する方法です。公式ページにも記載がありますが、「ダウンロードしてくれ」だけだったのでスクリプトを組むことにしました。
最新のリリースはこちらからダウンロードできます。スクリプトを組むことで、ダウンロードが簡単になります。
メリット
- スクリプトを動かすだけで指定のバージョンをダウンロード
- ダウンロードしたバイナリは、それぞれのプロダクトごとにフォルダ分けされているので、Xcodeにバイナリを追加する際に迷わない
- Carthage用の追加Build Phaseはない
デメリット
- ダウンロード時のサイズは約1GB
- MLを使わない場合は、ダウンロード後に削除することで、ディスク上でのサイズは300MB以下
- バージョンは手動で管理する
導入方法
導入方法としては、ダウンロードスクリプトを作成し、プロジェクトをgithubなどからチェックアウト後に実行します。gitにスクリプトを追加しておくのが良いでしょう。
環境
- ターミナルが使える
-
wget
が使える(Homebrewでインストール) - プロジェクトのトップディレクトリに
Firebase/
のディレクトリを作成するので、.gitignore
に/Firebase/
を追加している- 最初に
/
が入っていることに注意
- 最初に
スクリプト
以下のスクリプトを作成し、実行します。
#!/bin/sh
# Firebaseをダウンロード
if [ -d "Firebase" ]; then
echo "directory Firebase/ is not empty";
exit 0;
fi
wget https://github.com/firebase/firebase-ios-sdk/releases/download/[version]/Firebase-[version].zip -O Firebase.zip
unzip Firebase.zip
rm -f Firebase.zip
rm -rf Firebase/ML*
[version]
については、Firebaseのgithubから必要なバージョンを指定します。
個人的にですが、ファイル名はfirebase.sh
としscripts/
ディレクトリに配置しております。さらに実行権限を付加して実行しやすくしています。
Xcodeに追加
必要なフレームワークをFirebaseに追加していきます。FirestoreやStorageなど、プロダクトごとにディレクトリに分かれているので、選びやすいかと思います。
- 必要なフレームワークを追加
- Xcode11以降については、
Embed
をDo not embed
に変更します。
- Xcode11以降については、
- ターゲットのビルド設定で、Other Linker Settings に
ObjC
リンカーフラグを追加します。
(2020/04/28 追記)
最近ではFirebaseでもxcframework
に対応しているものが増えてきました。
必要なフレームワークをを追加する際は、プロジェクトのFrameworks
フォルダにDrag&Drop
するとDo not embed
やパスの設定を自動でしてくれます。Project > General > Frameworks, Librariesから追加すると、Info.plistが見つからないなどのエラーが出ていました。
注意点
特にチーム開発における注意点ですが、この方法ではバージョン管理はしてくれません。なので、バージョンを変更した際にはチームに通知し、それぞれでFirebase
ディレクトリを一度削除してから上記スクリプトを実行してもらう必要があります。
終わりに
出来るだけシンプルにかつ早く導入できる方法を書きました。もちろんデメリットはありますが、運用でカバーできると考えております。