Edited at

Crashlytics (fabric) に dSYMをfastlane でアップロードする

fabric の Crashlytics に dsym の情報をアップロードしていない状態でクラッシュが発生させると ほんやらかんにゃら Missing dSYMs ほんやらかんにゃら という警告が表示されます。

この状態だとクラッシュの詳細が見れないのでちゃんと dsym をアップロードすべきです。


https://docs.fabric.io/apple/crashlytics/missing-dsyms.html


しかしながら手動でアップロードするのは非常に面倒な作業です。

なので、 fastlane を使ってアップロードするようにしましょう。 具体的な方法はリンク先にあります。


https://krausefx.com/blog/download-dsym-symbolication-files-from-itunes-connect-for-bitcode-ios-apps



もうちょっと説明

これだけだと URL を貼り付けただけの記事になってしまうので、自分の作っているアプリの lane のコードと fastlane の中身に関する説明を少し書きます。

アプリの概要としては1つのプロジェクトに有料版と無料版の複数のターゲットがあります。

それら2つのアプリに対して dsym を iTunesConnect からダウンロードして crashlytics にアップロード、後片付けを行う lane のコードが以下になります。 コードの説明はその下に書きます。

  lane :refresh_dsym do |options|

version = options[:version] || get_info_plist_value(path: "path/to/Info.plist", key: "CFBundleShortVersionString")

# 有料版
download_dsyms(
version: version,
app_identifier: "hoge.huga.app"
)
# 無料版
download_dsyms(
version: version,
app_identifier: "hoge.huga.app-free"
)

upload_symbols_to_crashlytics(
api_token: '<crashlytics token>'
)

clean_build_artifacts
end


download_dsyms

この action で dsym をダウンロードしています。

version でアプリのバージョンを指定しています。 指定しないと全部ダウンロードするのかどうかはちょっとわからないですが凄く時間かかると思います。 ちなみに build_number を指定することもできます。

app_identifier は他の action と同様なので説明不要だと思います。

ダウンロードした結果ってどうなってるの??? と思いませんか?

ダウンロードした dsym ファイルのパスは Actions.lane_context[SharedValues::DSYM_PATHS] に保存して他のアクションから参照できるようになっています。


https://github.com/fastlane/fastlane/blob/master/fastlane/lib/fastlane/actions/download_dsyms.rb#L58



upload_symbols_to_crashlytics

この action で dsym を crashlytics にアップロードしています。

api_token は"Info.plist" という名前でアプリの "Info.plist" があるなら勝手に探してくれるが別の名前 (ex: hoge-Info.plsit)にしている場合は明示的に指定する必要があります。

dsym の path は 先程述べた SharedValues::DSYM_PATHSに格納されているのでどれをアップロードするかは特に指定する必要がありません。 この辺が fastlane 最高です。

ちなみに自前で path を指定したり追加したりすることもできます。


https://github.com/fastlane/fastlane/blob/master/fastlane/lib/fastlane/actions/upload_symbols_to_crashlytics.rb#L12



clean_build_artifacts

ダウンロードした dsym のファイルを削除しています。

この action は汎用的で他にも色々削除する機能があるのですが、全て状況に合わせていい感じに削除してくれるので非常に賢いです。


https://github.com/fastlane/fastlane/blob/master/fastlane/lib/fastlane/actions/clean_build_artifacts.rb#L12



実際の運用

このアクションを CI で定期的に稼働させれば問題ないと思います。

ただし現状、そんなに高頻度でやる必要性を感じていないので手動でこのアクションを実行させています。

TestFlight で配布するときや新しいバージョンを AppStore で配布したときなどです。

ただし、割と時間がかかるのでお昼に外出する前に動かしてたりします。