こんにちは。オブザーバビリティの世界へようこそ。
アプリをリリースした直後、ユーザーの端末で「プツン」とアプリが落ちる。開発者にとって、これほど胃が痛くなる瞬間はありません。そんな時、Crashlyticsが送ってくる「意味不明な16進数の羅列」を見て絶望したことはありませんか?
あれは、「暗号化された設計図」です。それを解読するための鍵がdSYM(debug symbols)。今日は、この「鍵」を自動で管理し、障害の真相を一瞬で突き止めるための極意を伝授します。
—
1. なぜ「dSYM」が必要なのか?(本質を知る)
Xcodeでビルドされたバイナリは、アプリのサイズを小さくし、リバースエンジニアリングを防ぐために「最適化」されます。その結果、コード内の関数名や変数名は機械的な符号に置き換えられます。
Crashlyticsは、そのままでは「どこで落ちたか」を特定できません。そこで、「この符号は、ソースコードのこの行を指している」という対応表が必要になります。それがdSYMファイルです。
これを手動でアップロードするのは、現代のエンジニアがやるべき仕事ではありません。自動化しましょう。
—
2. 【必須】自動アップロードのセットアップ
Firebase Crashlyticsを導入したら、Xcodeの「Build Phases」に魔法のスクリプトを仕込みます。
手順:Run Scriptを追加する
1. Xcodeのプロジェクト設定を開く。
2. Build Phases タブを選択。
3. 左上の「+」ボタンから [New Run Script Phase] を追加。
4. 名前を「Crashlytics dSYM Upload」などに変更し、以下のスクリプトを貼り付けます。
FirebaseのdSYMアップロードスクリプト
${DWARF_DSYM_FOLDER_PATH} に生成されたdSYMをFirebaseへ送る役割を担う
“${BUILD_DIR%/Build/}/SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run”
※ここが重要:
プロジェクトの構成によってはパスが異なる場合があります。最も確実なのは、Firebase公式が提供している `run` スクリプトを直接プロジェクトのルートに配置し、そこから呼び出す方法です。
—
3. 「Bitcode廃止」という時代の転換点
かつて、iOS開発には「Bitcode」という仕組みがありました。これはAppleのサーバー側で最適化を再コンパイルする仕組みで、これにより「dSYMを自分でアップロードしなくてもAppleがやってくれる」という時代がありました。
しかし、現在はBitcodeが廃止されています。
つまり、「dSYMのアップロードは完全に自分たちの責任」になったということです。この変更により、自動アップロード設定が漏れていると、エラーレポートが「Unknown」の山になり、何が起きているか全くわからなくなります。今すぐ設定を確認してください。
—
4. よくある落とし穴とトラブルシューティング
「設定したのにアップロードされない」という時に見るべきチェックリストです。
- Build Settingsの確認:
- `Debug Information Format` が `DWARF with dSYM File` になっているか?(これがないとそもそもdSYMが生成されません)
- Build Phasesの順序:
- このスクリプトは、コンパイルが終わった後の「最後」に実行される必要があります。Build Phasesのリストの一番下に配置しましょう。
- 権限の壁:
- CI/CD(GitHub ActionsやBitriseなど)環境で動かす場合、Firebaseの認証トークンが必要です。`FIREBASE_TOKEN` 環境変数をシークレットに設定することを忘れないでください。
—
5. 精度高い「HelloWorld」的動作確認
設定が正しく機能しているか確認するには、「わざとアプリをクラッシュさせる」のが一番です。
// ボタンタップ時などに実行してみてください
fatalError(“Crashlyticsのテスト用クラッシュ”)
1. アプリを実機で起動し、上記を実行してクラッシュさせる。
2. 再度アプリを立ち上げ、Crashlyticsがログを送信するのを待つ。
3. Firebaseコンソールで、「メソッド名」まで表示されているか確認する。
もし、メソッド名が表示されず「Address 0x000…」のようにしか出ていないなら、dSYMが届いていません。その場合は、XcodeのOrganizerからdSYMを手動でダウンロードし、Firebaseコンソールへドラッグ&ドロップして補完してください。
—
先輩からのアドバイス
オブザーバビリティとは、「システムの中身がどうなっているか」を常に透かして見ることです。Crashlyticsを単なる「エラー通知ツール」として使うのはもったいない。
dSYMを自動化し、障害発生から数分で「原因コードの行番号」まで特定できる環境を整える。それができれば、あなたは「障害に怯えるエンジニア」から「障害を即座に鎮圧するアーキテクト」に進化できます。
毎日の「なぜ落ちたんだ…」という謎解きから解放され、もっと創造的なコードを書くことに集中しましょう。応援していますよ。