ObjecTips

Swift & Objective-C で iOS とか macOS とか

Google Firebase で Crash Reporting を使う

まず初めに

後からこの issue で分かった事だけど
https://github.com/firebase/quickstart-ios/issues/13

Google Cloud Platform の利用規約に同意しておかないと下の手順の dSYM アップロード用のアカウントの作成やその権限付与でサーバエラーが起きて進めなくなってしまうので、Firebase にアプリを登録したらまずGCPのダッシュボードをチェックしてアクセスできるか確認しておいた方がいい。(これで結構時間を潰した)

GCPのダッシュボードを開くと以下のようなダイアログが出る場合があるので設定しておく
https://console.cloud.google.com/

f:id:Koze:20160607224715p:plain


セットアップ

Google Firebase の Crash Reporting を使うには dSYM アップロードのための準備を行う必要がある。
設定手順は以下
https://firebase.google.com/docs/crash/ios#upload_symbol_files

1 Download a service account key to authenticate your uploads
  • プロジェクトの歯車アイコン「権限」から「サービスアカウント」を選択
  • 「サービスアカウントを作成」を選択
  • 任意のサービスアカウント名とサービスアカウントIDを入力して「新しい秘密鍵の提供」をチェック、「キーのタイプ」でJSONを選択して「作成」を選択
  • アカウントを作成して鍵の作成に成功するとJSONファイルがダウンロードされる。また、作成したサービスアカウントに自動でプロジェクトの編集者権限も付与される。*1
2 Ensure that the service account has write permission

ここは権限の確認。
先の手順でサービスアカウント作成が正しく行われていれば、鍵が作成された事と必要な権限が付与された事がダイアログ表示されるのでこの確認作業はスキップしても良い。

3 Add an upload script for your symbol files

Xcode の Build Phase に Run Script を設定する。

# Replace this path with the path to the key you just downloaded
JSON_FILE=Path/To/ServiceAccount.json

# Replace this with the GOOGLE_APP_ID from your GoogleService-Info.plist file
GOOGLE_APP_ID=1:my:app:id

defaults write com.google.SymbolUpload version -integer 1   # creates file if it does not exist
JSON=$(cat "${JSON_FILE}")
/usr/bin/plutil -replace "app_${GOOGLE_APP_ID//:/_}" -json "${JSON}" "$HOME/Library/Preferences/com.google.SymbolUpload.plist"
"${PODS_ROOT}"/FirebaseCrash/upload-sym

2行目のJSON ファイルのパス設定は、JSONファイルをプロジェクトディレクトリ内に置いて $SRCROOT や $PROJECT_DIR を使ってパスを指定すると分かりやすい。*2

以下のように指定する
JSON_FILE="$(PROJECT_DIR)"/<リソースフォルダ>/<ファイル名>.json

10行目の ${PODS_ROOT} はCocoapodsを使っていないので
以下のように設定した
"${PROJECT_DIR}"/<外部ライブラリフォルダ>/FirebaseCrash/upload-sym

Cocoapods を使わない場合

Cocoapods を使わない場合、以下からリンク先のページから Firebase SDK を直接ダウンロードして必要な framework をXcodeプロジェクトに手動で入れていく。
Crash Report に必要な framework は FirebaseCrash.framework と Analytics 関連の framework 一式なので、これらを全てプロジェクトに取り込む。
どのサービスにどの framework が必要なのかは README に書いてある。

ダウンロードリンク
https://firebase.google.com/docs/ios/setup#frameworks

このダウンロード版の Firebase SDK には upload-sym など幾つかの必要なファイルが入っていないので、それらのファイルは適当なダミープロジェクトを用意して Cocoapods 経由で Firebase/Crash をインストールしてゲットするか、以下の FirebaseCrash の podspec に書かれている source のURLから直接ファイルを拾ってきてやる必要がある。

https://github.com/CocoaPods/Specs/tree/master/Specs/FirebaseCrash

ダウンロードした source のZIPファイルを解凍するとCLIスクリプトファイルが同梱されているので、それらをまとめて Xcode の Run Script で指定したディレクトリへ移動orコピーする。

最終的にXcodeプロジェクトのディレクトリ内に用意したファイル一式は以下のようになった

f:id:Koze:20160607222928p:plain

試す

実際に試してみる。
ドキュメントでは assert を仕込んで Build&Runして、一旦 Xcode からアプリをStopさせてアプリをホーム画面から起動。
アプリがクラッシュしたのを確認したら assert を取り除いて再度 Xcode からBuild&Runしてログがレポートが送信されたのを確認したらウェブのダッシュボードを確認。
という流れになっている。

実際に試してみると

2016-06-07 21:58:57.160 AppName[76436:] <FIRAnalytics/INFO> Firebase Analytics v.3200000 started
2016-06-07 21:58:57.162 AppName[76436:11233546] Firebase Crash Reporting: Successfully enabled
2016-06-07 21:58:57.166: <FIRInstanceID/WARNING> FIRInstanceID AppDelegate proxy enabled, will swizzle app delegate remote notification handlers. To disable add "FirebaseAppDelegateProxyEnabled" to your Info.plist and set it to NO
2016-06-07 21:58:57.160 AppName[76436:] <FIRAnalytics/INFO> To enable debug logging set the following application argument: -FIRAnalyticsDebugEnabled (see http://goo.gl/Y0Yjwu)
2016-06-07 21:58:57.185 AppName[76436:] <FIRAnalytics/INFO> Successfully created Firebase Analytics App Delegate Proxy automatically. To disable the proxy, set the flag FirebaseAppDelegateProxyEnabled to NO in the Info.plist
2016-06-07 21:58:57.194 AppName[76436:] <FIRAnalytics/INFO> Firebase Analytics enabled
2016-06-07 21:58:57.911 AppName[76436:11233921] Firebase Crash Reporting: Crash successfully uploaded

という感じでログが出て、ドキュメントには15秒内にレポートが送信されると書いてあるところテストした環境ではアプリ起動後すぐにクラッシュレポートが送信されたのが確認できた。
ダッシュボードへの反映はドキュメントには20分かかると書いてあって、これはテスト時には15分弱でダッシュボードに反映された。


Known Issues

iOS の Crash Reporting は現在β版で現時点での Known Issues としてデバイスのモデル名が表示されないと書かれている。
この点はアップデートを待つしかない。

Device models may not be showing in error reports. This will be addressed in an upcoming Pod update.

*1:もしここでアカウント作成のエラーが起きた場合、ブラウザをリロードするとアカウントは存在しているけど鍵が作成されてなくて権限も付与されていないという状態になるので、改めて手動で鍵の作成と権限の付与を行う必要がある。

*2:Xcodeプロジェクトのターゲットのリソースとしてファイルを追加してしまうとビルドしたアプリに内包されて配布されてしまうので注意。