トレタでのアプリクラッシュ対策

下記トレタブログからの転載となります。
http://toreta.blog.jp/archives/20075222.html

# クラッシュ
業務で使っていて一番困るのがアプリのクラッシュです。閲覧の時ならまだしも、予約入力中のクラッシュはあってはならないことです。店舗様がお客様からの電話を受けて予約を入力するため、店舗様はもちろんのこと一般のお客様へも迷惑がかかってしまいます。

どれだけ気をつけて実装していても絶対に起きないとは言い切れないのがiOSアプリの難しいところです。このためトレタでは万が一予約受付中にアプリがクラッシュしてしまった場合の救済措置として、予約情報の復元機能を用意しています。

![9bb31a09-s.png](https://qiita-image-store.s3.amazonaws.com/0/2569/08ff9ed1-8ea0-5a75-f632-d6dc13175c00.png)

※予約受付中にクラッシュした場合、アプリを起動すると上記ダイアログが表示されます。

クラッシュ自体あってはいけないことなので、正直一番活躍してほしくない機能ではあります。それでも、万が一でもお客様から受け付けた予約情報を無くしてしまってはいけないため用意させて頂いています。

# クラッシュレポート

弊社ではクラッシュレポートの収集にHockeyAppを使用しています。
HockeyAppは元々テストアプリ配布のために使用していました。
昔はTestFlight（Apple買収前）を使用していたそうですが、一時期調子が悪いことが続いたためHockeyAppに乗り換えたという経緯があります。

最初は有名どころのCrashlyticsなんかを使おうかなと思っていたのですが、導入済みのHockeyAppで出来ることがわかったため今はHockeyAppを使用しています。
 
# HockeyApp

トレタでの使い方の特徴ですが、Crash LogsのUserという欄に店舗名を出力するようにしています。
![99badd66-s.png](https://qiita-image-store.s3.amazonaws.com/0/2569/a8043bea-88c9-957e-5dbd-92b9aee2dae9.png)

トレタは店舗様で使ってもらうB2Bサービスということもあって、店舗名さえ分かればお店に直接電話や訪問して詳細をヒアリングすることが出来ます。B2Cサービスだとなかなかそうはいかないですよね。こういうことが出来るのはB2Bならではだなと思います。

少し話が逸れてしまいますが、店舗様にはトレタ用にiPadを用意して頂いています。 そのため、例えば下位OSが改修の負担になりそうな場合、普通ならしばらくは頑張って対応するしかないと思います。トレタの場合は店舗様に直接OSアップデートを依頼して下位OSを無くしてしまうなんてことも出来てしまいます。もちろんコストは掛かりますので（店舗様側にも）慎重に判断しなければいけませんが、選択肢として残っているということはエンジニアからするととても心強いです。

話は戻って実装の話です。
 ```userNameForHockeyManager:componentManager:``` というデリゲートメソッドがあるので、ここで店舗名を返してあげるだけです。
http://hockeyapp.net/help/sdk/ios/3.0.0/Protocols/BITHockeyManagerDelegate.html#//api/name/userNameForHockeyManager:componentManager: 

```
#pragma mark - BITHockeyManagerDelegate
- (NSString *)userNameForHockeyManager:(BITHockeyManager *)hockeyManager componentManager:(BITHockeyBaseManager *)componentManager {
    return restaurant.name;
}
```
これだけで、先ほどのUser欄に店舗名が出力されます。


またHockeyAppのAPIを使用してSlackにデイリーでクラッシュ件数を通知するようにもしています。こちらはサーバエンジニアの沢田が作ってくれました。

![bebdb0eb-s.png](https://qiita-image-store.s3.amazonaws.com/0/2569/ac900c24-9d1a-ae2e-6af4-ef71974bb319.png)

これは全員が見れるようになっているので、、僕は非常にプレッシャーであります。はい。


# クラッシュレポートにおけるHockeyAppへの不満

今のところ便利に使わせてもらっているHockeyAppですが、少し不満があります。検索や分析に非常に弱いんですよね。
 
例えば、下記のような見方が出来ません。

- 昨日のクラッシュのうち、一番多い店舗を見たい
- ◯◯店舗の昨日のクラッシュ件数を見たい
- 一番クラッシュの多い店舗を見たい
 
ダッシュボードでの検索だけでなくAPIも見てみたのですが、どうも今のところこういった検索はできない様です。

# HockeyNokogiri
これでは分析する上で不便なのでダッシュボードのクラッシュレポートをスクレイピングしてCSV化するスクリプトを書きました。

もっと分析しやすいクラッシュレポートサービスがあるかもしれないのですが、ちょうど慣れてきたところなので今のところはHockeyAppが使えるならそのまま使っていきたいなと思っています。

https://github.com/yoonchulkoh/HockeyNokogiri

先ほどのクラッシュの例ですと、こんな感じで出力されます。

```
Device,OS,Jailbroken Device,Description Attached,User,Contact,Date,-,Description
iPad Air (Wi-Fi),8.1.2,"",x,"",,2014-12-22T16:05:34Z,,"__pthread_kill SIGABRT"
```

アプリのバージョンを指定してそのクラッシュレポート一覧を取得するようにしています。使い方に関してはgithubを見ていただければと思います。とりいそぎベタ書きしただけなのでコードは微妙なところがありますが要件は満たせています。時間を見つけて少しずつ改善していきたいなと思っています。プルリクなんかも歓迎します！

# まとめ

長々と書いてきましたが、正直特別なことをやっているわけではありません。他のサービスでも同様のことは当然やっているでしょう。当たり前のことを当たり前にやる。しかしこれは思いのほか難しかったりします。

実際に僕がジョインするまではクラッシュレポート収集と分析の仕組みはありませんでした。ただそれは優先順位の問題だったと思います。僕は8月にジョインしたのですが、その頃にはトレタアプリは機能的には一段落しているところでした。なのでクラッシュレポートの仕組みを導入したりと改善に力を入れることが出来ました。

アプリやサービスの品質を高めるのは当たり前の積み重ねだと思っています。ただ、今iOSエンジニアは社内に僕一人しかいません。やりたいけれど出来ていないことがまだまだたくさんあります。

▼「トレタ」の進化を加速し、サービスの可能性を拡大するエンジニアを募集！
https://www.wantedly.com/projects/11460