iOSアプリの開発をしているとクラッシュレポートが欲しいときがある.
「バグあるんだけど」と言われてもシミュレータでも自分の端末でも再現できないし,それどころか報告者の端末でも再現性が低かったりすることがある.
というか,報告してくれるだけマシで,ほとんどの人はバグがあると「それを使わない」という選択になってきてしまう.
だから,できるだけ早くバグは検知したいのだけれど,どうにも再現できない場合には,クラッシュログを見ないと対応できなかったりする.
特に,Objective-Cもswiftも「ヤバイ時はアプリを殺す」仕様なので(ARCだから仕方ない),何が起こったかはログを見ないと本当にわからなかったりする.
というわけでクラッシュレポートを導入するにあたって,Crashlyticsというサービスを使ってみた.
Objective-C - Crash Report解析サービスのCrashlyticsを試してみた - Qiita
無料なところは最高ですね.
Fabricに吸収されたCrashlytics
上記の説明は,古いCrashlyticsの画面で説明されています.
2014年10月の発表で,twitterが買収したCrashlyticsは,twitterが運営するFabricというサービスの一部として取り込まれています.
というわけで使うためにはFabricへの登録が必要になります.
Fabric - Twitter's Mobile Development Platform
登録すると,「You're on the list to get Fabric」というタイトルのメールが届きます.
つまり待ってろってことなんですが,15分くらい待っていたら,「You're in! Welcome to Fabric」というメールが届いたので,本文の指示通りに登録をすると,ログインできるようになります.
FabricをXcodeのプロジェクトに組み込む
Fabricの公式サイトからFabric Pluginを自分のMacにインストールします.
ツールの選択を迫られるので,Xcodeを選択しましょう.
普通にインストールすると,ステータスバーにFabricのアイコンが表示されるようになります.
基本的にFabricのナビゲーションに従えば,プロジェクトを動かすところまではすぐにできます.
まず,新しいアプリケーションを追加します.
インストールするものの選択を迫られるので,Crashlyticsを選択します.
Xcode側に設定しろと言われます.
ここでRunScriptを追加しましょう.
次は,Xcodeに突っ込めと言われます.
このフォルダっぽいアイコンをそのままドラッグして突っ込みます.
どこでもいいんですが,今回はプロジェクトの直下に置きました.
frameworksみたいなフォルダを作っておくと楽なのかもしれませんね.
AppDelegate
にコードを記述しろと言われたので,その通りに書いておきます.
ビルドして,走らせてねって言われるので,走らせます.
無事完了しました.
どうやって使うの?
Fabricというのは,TestFlightのように使うことができます.
つまり,AdHoc版のアーカイブを作成して,テスター達の実機に配布することができるんですね.
プロビジョニングファイルの設定をすべて終えて,実機テストを挟む段階まで持っていきます.
その状態でアーカイブすると,アーカイブの完了後にこのような画面になります.
TestFlightなどだと,ipaファイルを出力したりしますが,その必要はありません.
Fabricのウィンドウで,Distributeを押してやると,メールアドレスを求められます.
これがテスターのメールアドレスです.
このアドレス宛てに,テスト用のアーカイブのダウンロード方法が記述されたメールが送られます.
送り終わると,このようになります.
受け取った端末側で,メールを開き,指示通りにアプリをインストールします.
このときに,Crashlyticsのインストールを求められるので,端末にインストールしてやると,見事クラッシュログが送られるようになります.
ブラウザでFabricのダッシュボードを開いておくと,クラッシュ時にこんな感じのが送られてきます.
Fabric経由じゃないアプリはどうなるの?
Fabricを経由せず,TestFlightのようなものでipaファイルを送ったりした場合には,Crashlyticsにクラッシュログは送られません.
Crashlyticsを入れた状態でAppStoreにアプリが並びましたが,無事クラッシュレポートは送られてきます.
適当にクラッシュするコードを書いて,TestFlight経由で実機に移します.
class ViewController: UIViewController { var num: Int! override func viewDidLoad() { super.viewDidLoad() var sum: Int! self.num = sum! } }
起動すると,アプリは落ちますが,やはりログは送られませんでした.
やっぱりFabricですべてまとめて管理するのが楽なのかなぁ.
こういうことを考えると,テスターって大事なんだと思い知らされますね.