uirouのひとりごと

不定期に何か書こうと思います。

自作アプリに不都合報告のボタンをつけた話(ボタン一発で操作ログが送られるようにした話) 実装編

承前

趣味で iOS のアプリを作ってて、まぁ普通に使えなくもない、位のクオリティになったので公開しているんですけれど、一応使ってくれる人もちらほらおりまして、不都合が出たりするとアプリのレビュー欄に書かれたりしていたのです。

かなり昔は、アプリのレビュー欄を監視するような事をしてなかったとか、RSSで監視するようにしたんだけれどFeedlyさんが不定期にしか読み込んでくれないので気づくのが遅れるとか、アプリのレビュー欄だけだと反応を返せない(昔は反応を返せなかったんですけれど最近は反応を返せるようになってます)であるとかいった問題があって、アプリのサポートページ側に Google Forms にアンケートを作る形で「ご意見ご要望フォーム」を立てて、そこから不都合報告や改善案を受け付けたりしていたんです。

情報量の少ない不都合報告

先日、その「ご意見ご要望フォーム」にとても短い投稿がありました。具体的な内容は転記しませんが、言っている事は「30分使うと確実に落ちる」という内容だけでした。残念なことに返信するためのmail addressが書かれていません(mail address欄は返信が欲しい場合に書いてねということになっているので書いていない事は特に問題はないですけれども)。 これでは「もうちょっと詳しく、具体的にはどの小説を読み上げさせようとしたら30分しないで落ちたのか教えてもらえる?」みたいな返事を返すこともできず、正直お手上げでした。なので自分の取れる選択肢としては、残念に思いながら無視する、という事になりました。

と、いうような不都合報告って結構多いんですよ。もちろん色々わかっていて端末の初期化までして条件を揃えて再現実験をして特定の端末でしか起こらないがこうすれば確実に起こる、というところまで突き止めた上で報告をしてくれるような逆にわかりすぎてるんでgithub側に降臨してpull requestしてくれてもいいですよ、みたいな人までおられるんですが、まぁだいたいの不都合報告は情報が足りないという状況です。

不都合報告への対応としては、手元で再現できるようにした上でそれが再現しないように改善することで問題が解消した、と判断するため、とりあえずは手元で再現できないとどうしようもないです。なので、「落ちます」だけのものであるといった、情報量の少ない不都合報告では再現することができず、対応できない事も多くなります。

誰も詳細な情報は書きたくない(よね?)

さて、そのような情報量の少ない不都合報告が多く生成されてしまう原因というのは、多分いろんな理由が考えられるでしょう。例えば、詳細な不都合報告とはどういう意味かをわからないので書けないであるとか、再現できる情報って何だかわからないので書けないであるとか、そんなのなんで私が説明しなきゃなんないの?って逆ギレするであるとか。 まぁぶっちゃけ、そんな面倒なこと(やったことが無い事はだいたいの人は面倒なことのはずです)はやりたくないんですよ。人は。

ということで、人間には頼らないで情報を手に入れる必要があると考えるわけです。

ざっと考えると、アプリ側で操作のログを取っておいて、それを取り出せるようにすれば良いのではないかと思います。 操作ログがあれば、手元で同じ操作をしてみて、再現するかどうかを確認できそうです。まぁそれで再現しない場合はそれ以上の情報が必要となりますけれども。 とりあえず思いついたら実装してリリースできちゃうのが自作アプリのいいところですよね。ということでやってみましょう。

そんな車輪は誰かが作ってるだろうということで、調べる

私のGoogle力のショボさをナメないで頂きたい! ちょっと調べた範囲では https://www.treasuredata.co.jp/ みたいな、今回の目的には大鉈すぎるものしかみつけられませんでした!(゚∀゚)b

まぁ、そういうのを作って売り込みたい気持ちもわかりますけれども、正直広告もつけてない無料アプリみたいな金銭は何も生み出されない物に金銭的なコストはかけたくないのでサーバとリンクするようなものは使わない方向にしたいです。

設計

とりあえず、ログを取るだけであれば簡単にできそうです。syslog(3) みたいな感じでlogを取りたい所にログを追加する命令を一行書いていく感じにしましょうか。

そのようなログが出来たとして、それをどのように取得するかを考えましょう。目的は不都合報告に対する付加情報としての操作ログデータですので、不都合報告を送る時に追加で送信してもらうことにしましょう。 この場合、現状の Google Forms を用いたアンケート形式のご意見ご要望フォームにその操作ログを含めるのは難しそうです。だとするとこの操作ログも受け取つけられるWebFormを作成しましょうか。でもそれだとそのWebFormを24時間365日維持しつづけなければなりません。そういうのはもっとお金を儲けられるようになってからやりましょう。今のところはそういうのには頼らないようにします。 自前のサーバを設置できないとすると、他人のサーバに頼りましょう。e-mailのサーバなんてどうでしょう。つまりは作業ログと不都合報告をe-mailで送ってもらうんです。幸いe-mailはファイルの添付もできますので目的には合致しています。悪くなさそうですね。

さて、作業ログと不都合報告(落ちた、みたいなユーザ側の文章)が手に入ったとして、それを受け取った私はそこから状況を再現できるでしょうか。操作ログが理想的に取られていれば、多分、操作は再現できるのではないでしょうか。ただ、問題が起こった時そのものはログに残らないため、さらに情報が必要です。

ということで、操作ログには日時を付記しておいて、不都合報告の場合は問題が起こった日時を書いてもらう事にしましょう。入力は必須ということにしておけば入力しないということも起こらないでしょう。

まぁだいたいこれくらいでだいたい最初に思っていた事はできるようになるんじゃないでしょうか。それでは実装しましょう。

実装

ログを取る部分はあんまり捻らずに作っちゃいましょう。こんな感じになりました。

https://github.com/limura/NovelSpeaker/blob/master/NovelSpeaker/BehaviorLogger.swift

色々と固定値が入っていたり、UserDefaults への保存の仕方が毎回すべてのlog配列を上書きしていたりしてゲンナリな感じですが、まぁ良しとしましょう。

次に不都合報告のボタンをアプリ側に作ります。これもまぁあんまり捻らずに単にボタンを押されたら必要そうな情報を入力してもらって、mail の雛形を作って送信ボタンを押してもらう、というものです。Eureka を使ってちゃちゃっと作っちゃいます。Eureka は簡単でいいんですけれど、書き方が独特で毎回ドキュメントとにらめっこになりますね。(´・ω・`)

せっかくなので AppDelegate.m で NSSetUncaughtExceptionHandler() を使ってハングした時にも先程のloggerを使ってスタックトレース等を保存するようにしました。

https://github.com/limura/NovelSpeaker/blob/46b7acb7f0029c8350464948aba835abf954ae50/NovelSpeaker/AppDelegate.m#L19

これでログからハングしたタイミングもわかるようになるので、ハングした日時を入れ損なわれてもなんとかなりそうです。よしよし。

個人情報保護っぽい何かへの配慮

よくわかっていないので詳しい人教えてください。(´・ω・`)

とりあえずアプリ側で収集したログを送信する前に、「アプリの操作ログを送信することになるけどいいですか?(Y/N)」みたいなダイアログで確認はしているのだけれど、それだけでいいのかどうかわからないです……

その後

まだこの修正を行った物をAppleの審査に出している段階なのでどうなるかはわからないんですけれど、うまくいくといいなぁと思ってます。 この修正をきっかけとした何かステキな事が起きたり予想外な事が起こったりしたら続編を書こうかなぁと思います。

作ってるアプリの紹介

一応、話題にしていたアプリを紹介しておきます。コレです。iOS でしか動きませんが。

ことせかい

ことせかい

  • Takuji Iimura
  • ブック
  • 無料

本文中でも link していますが、source は github にて公開しているのでテキトーに参照していただいて構いません。