うな(。・ε・。)

Android, iOS, AppEngine まわりのめもめも

リリース後のデバッグのために、ログと DB のダンプを送る機能を付ける

アプリはリリースするととにかくデバッグしにくいです。 Crashlytics を入れておくのは当然としても、これだけでは対応しにくいケースが沢山あります。

たとえば、データの不整合が出たり、予期せずデータが消えてしまったりするケース。 これらのケースは例外が発生しないので、とてもデバッグがしにくい。サポートもしにくい。

という事態が現在進行形なので対策を考えました。

解決策

「ログ」と「DB」のダンプを送れる機能を付ける。

容量の問題。 DB については、件数にもよりますが 1000 件のレコードがあっても ~1MB で済むと思いますので、送れない範囲ではない。 ログについては、1 レコード ~100bytes ほどだと思うので、直近のレコード数で切って送信すれば問題ないでしょう。

とりあえず実装方法を妄想するだけしてみました

ログの保管の仕方(妄想)

iOS の場合、マクロを使って専用のロガーを作って上げると良いと思います。 つまり、NSLog を直接つかうのではなく適当な Prefix を付けた SOMELog を使ってログするようにします。

#if DEBUG
#define SOMELog(...) NSLog(@"SOME: %@", [NSString stringWithFormat:__VA_ARGS__]);
#else
#define SOMELog(...) SOMEStoreLog(@"SOME: %@", [NSString stringWithFormat:__VA_ARGS__]);
#endif

これで SOMEStoreLog を実装すれば OK です。中身は適当にバッファしてファイルに保存するだけ。 CocoaLumberjack/CocoaLumberjack · GitHub とかがイイ感じに実装を提供していたと思います。

DB データの取得方法(妄想)

.sqlite ファイルを丸ごとアップロードすれば良いと思います。 CoreData を使っていれば NSPersistentCoordinator でファイルパスを指定しているはずなので、こちらを取得してアップロードします。

まとめ

こんな感じでやってみるかもしれないし、良かったらまた書くかも