[iOS]げにCarthageでFirebase管理は世知辛い Analytics導入時のビルドエラー殲滅していく(Xcode10.0対応版)

**追記** (2018/9/20)

## Firebase SDK v5.8.0 (iOS12.0リリース時点で最新)を通すために必要な依存ライブラリ

(環境は Xcode 10.0 Build version 10A255 です)

### FirebaseAnalyticsBinary(v5.8.0)

こうじゃった

![Screen Shot 2018-09-19 at 18.17.18.png](https://qiita-image-store.s3.amazonaws.com/0/105411/71b4bbbd-4e6f-e76a-f212-aa673727a308.png)

(`FirebaseAnalytics`は気にしないでください。依存ライブラリは5個)

### FirebaseMessagingBinary(v5.8.0)

↑をすべて含めることに加え、こうじゃった

 ![Screen Shot 2018-09-19 at 18.37.45.png](https://qiita-image-store.s3.amazonaws.com/0/105411/e752ea58-36a4-b6d7-0998-bdecfd0f02dd.png)

(依存ライブラリは3個)

我の環境の場合は、`Build Settings -> Other Linker Flags` は `-ObjC` のみでよかった。$(inherited) すら必要ではなかった。
`Build Active Architecture Only` は、Yes だった。

### Firebaseの各SDKが依存しているライブラリは、これらのヒントを糸口に探れ!!

各SDKによって依存するライブラリが異なるので、
これらのヒントを糸口に、探っていきたいです。

#### 1 (PRJROOT)/Carthage/Build 以下の、.SDK名(例: FirebaseMessagingBinary).version ファイル

このような記載がしてある。これは`FirebaseMessagingBinary.version`の例。
例えばiOS開発の場合、キー "iOS" の各オブジェクトが持つキー "name" の値の情報が、
必要なライブラリを知る一助になるかも知れない。
(でも、↑のキャプチャ画像のライブラリと必ずしも一致しないんだよなぁ...要研究)

```
{
  "Mac" : [

  ],
  "watchOS" : [

  ],
  "tvOS" : [

  ],
  "commitish" : "5.8.0",
  "iOS" : [
    {
      "name" : "FirebaseAnalytics",
      "hash" : "550e166a23d8401f5d5ad63d5455fe86d700a347d16be00b0228c3f2253c7e3a"
    },
    {
      "name" : "nanopb",
      "hash" : "31e0c9870b373b7f96b258e782e1246eed00b9ab7f29ccde21984e8b8d725e3e"
    },
    {
      "name" : "Firebase",
      "hash" : "a8669248da9519e9955e00448e518e1ca6becb32689eedddde237e19ad1136ae"
    },
    {
      "name" : "FirebaseCore",
      "hash" : "dca5c7e90e052a2a8087cc2ae1e63292f954b8c04a1f371194895a1ea6a2ff52"
    },
    {
      "name" : "GoogleUtilities",
      "hash" : "aef8824414de90178a87db399c8d45ad2c0d2a27d1edcca001915a73ce198c8a"
    },
    {
      "name" : "FirebaseCoreDiagnostics",
      "hash" : "1cbbb0dc9e4bd78f26795bf1b4253aa60edd21c77d8edfdcd7bddac329e286bd"
    },
    {
      "name" : "FirebaseInstanceID",
      "hash" : "fe0c5474f699f502b1d9d80bf535ebdb4cd44bb6e343bf5b014091c186bc8508"
    },
    {
      "name" : "GoogleAppMeasurement",
      "hash" : "fedc367dc718b254041c48844f6f64a2401f6da4873572d6b892fbf625508620"
    }
  ]
}
```

#### 2 (PRJROOT)/Carthage/Build/iOS/SDK名.framework/Module/module.modulemap

これもなにかのきっかけになるかも

```
framework module FirebaseAnalytics {
  umbrella header "FirebaseAnalytics.h"
  export *
  module * { export *}
  link "sqlite3"
  link "z"
  link framework "Security"
  link framework "StoreKit"
  link framework "SystemConfiguration"
  link framework "UIKit"}
```

#### 3

あとはこのエラーメッセージに含まれるライブラリ名。
怪しそうなワードがあれば、それを含めてみる

![err1.png](https://qiita-image-store.s3.amazonaws.com/0/105411/755b30f2-8e91-68af-8efa-2fdb190163dc.png)

↑の写真なら、`sqlite3` とか

あとは、[ここ](https://github.com/firebase/firebase-ios-sdk/blob/master/Carthage.md#versioning)にあるように、
各SDKのバージョンを統一させることを忘れないことも重要だと思われます。

#### その他

`Carthage`には、

`~/Library/Caches/org.carthage.CarthageKit`

というパスに、キャッシュの保管庫(?)のようなものがあるらしい。

`carthage update` する前に、この中のファイル群を除去すると、問題が解決することがあるらしい。


(追記終了)

---

(ここから原文。SDK: ver `5.6.0` のときの話でした。)

`Carthage`で`Firebase`関連ファイル管理したい！一味なのですが、そんなプログラマが遭遇したお話

[この議論](https://github.com/firebase/firebase-ios-sdk/issues/9#issuecomment-387947163)がほぼ全てです。`Issues`ちゃんと読もう...。

## 環境

[こちら](https://firebase.google.com/docs/ios/setup?hl=ja)のページ「CocoaPods を使用せずに統合する」内のリンクからダウンロードできる最新SDKが5.6.0(2018/8/22時点最新)だったときのお話。
Xcode: 9.4.1

## 問題

`Analytics`(=`Firebase`の大半の機能にインポート必須なライブラリ群)のビルドが通らなかった

![err1.png](https://qiita-image-store.s3.amazonaws.com/0/105411/755b30f2-8e91-68af-8efa-2fdb190163dc.png)


## 対応策

[これ](https://stackoverflow.com/questions/42292090/firebase-undefined-symbols-for-architecture-x86-64)を参考に、

`libsqlite3.tbd, libz.tbd, libc++.tbd`

の3つを `General - Linked Frameworks and Libraries`に追加。

さらにそれに飽き足らず、[これ](https://github.com/evollu/react-native-fcm/issues/713)を参考に、

`StoreKit`

を、` General > Link binary with libraries > Add StoreKit.framework`  に追加。**なんでや...**

## 学んだこと

愚直にエラーメッセージでググる 基本をバカにしない😤
ハマったときこそ基本に立ち返る

今回は数十単位のエラーに圧倒されてググっていくのも一見憚られる感じなのですが、取りも直さず先達はきちんと回答を残してくれていました。
こんなえげつないエラーに見舞われているのは自分だけだという傲慢を捨て、集合知に教えを乞うていきましょう。
Firebaseの他の機能も追加しようとしてエラーに遭遇したら随時追記していきたいと思います😇

## これらも忘れずにね

- Targetを選択 -> Build Settings -> Other Linker Flags に `-ObjC`を追加
- `GoogleService-Info.plist`をプロジェクトに追加

## プロジェクト載せときます

なんとなく`GoogleService-Info.plist`だけ抜いたプロジェクトを載せておきます。[ここ](https://github.com/creaaa/FirebaseOnCarthageIsAsura)

単純にDLしてビルドしたらいきなりランタイムエラーが出るけど`(could not find a valid GoogleService-Info.plist in your project. Please download one from https://console.firebase.google.com/.')`、
`Bundle ID`変えて、自分用に`GoogleService-Info.plist`DLしてプロジェクトに追加すれば動くはず...。
ついでになんとなく`FireStore`も入れてみました

## link

[firebase/firebase-ios-sdk](https://github.com/firebase/firebase-ios-sdk/blob/master/Carthage.md)

## Happy Firebase on Carthage Life!

ビルドさえ通ればあとは楽しい`Firebase`コーディングの開幕ですね。
地雷を踏むたびに随時更新していければと思います。