Firebase C++ SDKをAndroid・iOSに入れる

FirebaseにはC++用のラッパーSDKが用意されていて、
これを使うとC++で開発しているiOS/Androidアプリから、
FirebaseのAPIを呼び出せるようになります。

[C++ プロジェクトに Firebase を追加する](https://firebase.google.com/docs/cpp/setup?hl=ja)

まだbetaのようです。
手順はリンク先のドキュメントに書かれていますが、結構ハマりポイントがあったので、
念のため残しておきます。


# Android

## 設定ファイル

`google-services.json`をFirebaseのコンソールからダウンロードし、
プロジェクトに入れます。

## build.gradle

プロジェクトルートの`build.gradle`に、`com.google.gms:google-services`を設定します

```groovy:build.gradle
buildscript {
...
    dependencies {
...
        classpath 'com.google.gms:google-services:3.1.0'
    }
}
...

```

appの`build.gradle`で、`com.google.gms.google-services`と、`dependencies`を設定します。
ドキュメントを見ながら必要な機能のみ追加してください。
`core`は`analytics`のエイリアスで、core（またはanalytics）は必須です。

```groovy:build.gradle
apply plugin: 'com.android.application'

android {
...
}

dependencies {
...
    compile 'com.google.android.gms:play-services-base:10.0.1'
    compile 'com.google.firebase:firebase-core:10.0.1'
    compile 'com.google.firebase:firebase-ads:10.0.1'
    compile 'com.google.firebase:firebase-crash:10.0.1'
    compile 'com.google.firebase:firebase-messaging:10.0.1'
    compile 'com.google.firebase:firebase-auth:10.0.1'
    compile 'com.google.firebase:firebase-database:10.0.1'
    compile 'com.google.firebase:firebase-invites:10.0.1'
    compile 'com.google.firebase:firebase-config:10.0.1'
    compile 'com.google.firebase:firebase-storage:10.0.1'
...
}

apply plugin: 'com.google.gms.google-services'
```

## CMakeLists.txt

CMakeLists.txtで、C++用ライブラリのリンク情報を記述します。
ダウンロードしたC++SDKを展開し、`firebase_cpp_sdk`ディレクトリ配下の、
`include`ディレクトリを`include_directories`に、
`.a`があるディレクトリを`link_directories`に設定します。
`target_link_libraries`で、`link_directories`で指定したディレクトリにある
`.a`ファイルを、必要な機能分指定します。

**この時、`libanalytics.a`は一番上に記載しないとエラーとなるため注意してください。**

[(参考) Errors when linking Firebase C++ (analytics) library](https://stackoverflow.com/questions/41204085/errors-when-linking-firebase-c-analytics-library)

```txt:CMakeLists.txt
...

set(FB_CPP_SDK "${CMAKE_CURRENT_SOURCE_DIR}/<SubDirectory>/firebase_cpp_sdk")
include_directories(${FB_CPP_SDK}/include)
link_directories(${FB_CPP_SDK}/libs/android/${ANDROID_ABI}/c++)

..

# add lib dependencies
target_link_libraries(native-lib
...
                      libanalytics.a
                      libapp.a
                      libadmob.a
                      libmessaging.a
                      libauth.a
                      libdatabase.a
                      libinvites.a
                      libremote_config.a
                      libstorage.a
                      )

```

## 初期化コード

上記までの設定でリンクが通ったはずなので、C++のソースで初期化処理を記載します。

```cpp:Sample
#include "firebase/app.h"
#include "firebase/analytics.h"

auto fbApp = firebase::App::Create(firebase::AppOptions(), env, activity);
firebase::analytics::Initialize(*fbApp);
```

AndroidはJNIの`env`、`activity`を渡す必要があります。
`env`は`JNIEnv*`、`activity`はJavaのActivityの`jobject`です。




# iOS

## 設定ファイル

iOSの場合は`GoogleService-Info.plist`をFirebaseコンソールからダウンロードし、
プロジェクトに入れておきます。

## iOS用frameworkの追加

iOS用のframeworkを追加します。
[iOSのドキュメント](https://firebase.google.com/docs/ios/setup?hl=ja)を参照してください。
`Firebase/Core`と、その他必要な機能のframeworkを入れます。
Podで入れるか、直接SDKをダウンロードしてプロジェクトに追加します。
SDKに含まれる、以下のframeworkも必要となります。

* FirebaseInstanceID.framework
* GoogleInterchangeUtilities.framework
* GoogleSymbolUtilities.framework
* GoogleToolboxForMac.framework

.frameworkのパスを、`Framework Search Path`に設定するのを忘れないでください。


## C++用frameworkの追加

C++用SDK内の、以下のframeworkファイルを、必要な機能の分追加します。
`firebase_cpp_sdk/frameworks/ios/universal/*.framework`
`firebase.framework`、`firebase_analytics.framework`は必須です。


## Other Liker Flagsの設定

`Other Liker Flags`に、`-ObjC` を設定します。


## 初期化コード

iOSの場合は引数1つだけでOKです。

```cpp:Sample
#include "firebase/app.h"
#include "firebase/analytics.h"

auto fbApp = firebase::App::Create(firebase::AppOptions());
firebase::analytics::Initialize(*fbApp);
```


****

以上です。
あとは各APIをC++から呼び出して使っていきます。