[Firebase][iOS] Firebase CrashlyticsにdSYMをアップロードしたい!

2020.08.01

こんにちは。きんくまです。

今回はFirebase版のCrashlyticsにdSYMをアップロードします。(Fabric版ではないです)

CrashlyticsといえばdSYMです。これがうまく連携されていないと、管理画面でうまくエラーが表示されなかったりします。
なので、ハマりどころをチェックしながらアップロードできるようにします。

Debug Information FormatをDWARF with dSYM Fileにする

XcodeのBuild Settings > Build Options > Debug Information Formatを DWARF with dSYM File にします。

Configurationごとに別の設定の場合もあると思います。
開発用は DWARF だとしても、AdHocやEnterprise、App Store Connect用の書き出しは DWARF with dSYM File になるようにします。

アプリ書き出し時の注意

Ad HocやEnterpriseをFirebase App Distributionなどのアプリ配信サービスで使う場合

Archiveしてから書き出し時にbitcodeをオフにします。最初結構ハマりました、、。

bitcodeをオフにして書き出せばdSYMが同梱されたままipaが書き出されます。そのため、これをFirebase App Distributionなどにアップロードすれば、あとは何もしなくても、Crashlytics管理画面でエラーが表示できるようになります。

App Store Connect(アプリ申請時)用

アプリ申請時にはbitcodeをオンにします。

この状態で、バイナリをApp Store Connectにアップロードします。

App Store ConnectのときのdSYMのアップロード

dSYMのダウンロード

前の手順で書いたように、bitcodeをオンにしてストアにアップロードまでします。
ストアのProcessingが終わると、dSYMをダウンロードできるようになっています。

Activity > All Builds > Version

ダウンロードリンクがあります。

dSYMのzipファイルをダウンロードします。

upload-symbolsコマンドでアップロード

コマンドの場所

CocoaPodsの場合

Pods/FirebaseCrashlytics/upload-symbols

Carthageの場合

Carthage版は直接コマンドのバイナリファイルをダウンロードします。
以下のページの中に upload-symbols のリンクがあります。

https://github.com/firebase/firebase-ios-sdk/blob/master/Carthage.md

以下は直リンクなので、パスが変わることもあると思われ。
upload-symbols

スクリプトファイル作った

あとは、upload-symbolsを使ってアップロードすれば大丈夫です。
毎回コマンドを入力するのが面倒なので、スクリプトを作りました。良かったら使ってみてください。
全てフルパスで指定してください

upload_dsyms.sh

#!/bin/sh

# CrashlyticsにdSYMsをアップロードする

# upload-symbolsの場所
UPLOAD_SYMBOLS="/path/to/upload-symbols"

# GoogleService-Infoファイルを指定する(ファイル名はなんでもOK。ここでは本番用に設定したファイル名にしてます)
GOOGLE_SERVICE_INFO_PLIST="/path/to/GoogleService-Info-PRD.plist"

# App Store ConnectからDownloadしたdSYMフォルダのパスを指定する。(zipファイルから解凍するとappDsymsフォルダができる)
DSYMS="/path/to/appDsyms"

"$UPLOAD_SYMBOLS" -gsp "$GOOGLE_SERVICE_INFO_PLIST" -p ios "$DSYMS"

うまくアップロードできれば、Crashlyticsの管理画面で確認できるようになっていると思います。
ではでは。

余談

bitcodeをオンにすると、中間ファイルが作成されます。
その状態でApp Store Connectにアップロードされると、ストアで各デバイスごとに最適化されたバイナリが改めて書き出されます。
その書き出し時に、dSYMも書き出される。
FirebaseApp Distributionなどの配信サービス用にbitcodeをオフにした場合は、中間ファイルが生成されないので、そのままdSYMつきのバイナリができるということかなと思ってマス。

LLVM bitcode基礎知識
CPUがARMに変わればアプリも変わる -- 「もうひとつのユニバーサル」について考える