Twitter Fabric(Crashlytics)のAnswersに追加されたイベントトラッキング機能を導入してみた


Twitter Fabric(Crashlytics)のAnswersにイベントトラッキング機能が追加されたので、導入してみました。

![Screen Shot 2015-07-24 at 10.51.21 AM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/c4097302-8dc8-0391-ecd6-d4ac868ac245.png "Screen Shot 2015-07-24 at 10.51.21 AM.png")
(アクセス少ないのはDev版のためです)



これまで、イベントトラッキングは、Google Analyticsを使っていましたが、若干使いにくいなと思っていました。

- 元々Webに特化してあったものがモバイル対応もしたという位置づけなので、モバイル用途として見ると余計な機能が多かったりかゆいところに手が届かない感じ
- 見にくいので、数値解析には使えても普段目にしようとあまり思えない

とりあえず共存させてみて、良かったらGoogle Analyticsのイベント機能は切ろうかなと思います。

---

以下、オフィシャル記事です。

- [Fabricブログ記事](https://fabric.io/blog/milestone-achieved-one-billion-devices)

> Introducing Answers Events

> Two months ago, we opened access to our public beta for Answers’ custom events -- our mobile analytics event tracking feature within Crashlytics Kit. After testing with hundreds of top developers and building out the feature even further, we’re excited to officially release Answers Events today. Not only does Answers Events give you total visibility into your users, but also tells you what’s important to track — all in real time.

> Read more about Answers Events here.

- [Introducing Answers Events](http://answers.io/blog/introducing-answers-events)
- [From Answers Labs: Custom Events](http://answers.io/blog/from-answers-labs-custom-events)
	- 元々はβ公開されていた模様

元々はこの記事で知りました:

- [TwitterのAnswersアップデートでアプリのパフォーマンス測定機能が向上 | TechCrunch Japan](http://jp.techcrunch.com/2015/07/23/20150722twitters-answers-service-gets-an-update-to-provide-better-app-performance-tracking/)
	- 原文: [Twitter’s Answers Service Gets An Update To Provide Better App Performance Tracking | TechCrunch](http://techcrunch.com/2015/07/22/twitters-answers-service-gets-an-update-to-provide-better-app-performance-tracking/)


# Answersのイベント機能で出来ること

[Introducing Answers Events](http://answers.io/blog/introducing-answers-events)に詳しく載っていますが、読み解きつつ簡単にまとめてみます。

## 概要

- ユーザーの行動がリアルタイムに分かる
- 単にデータが蓄積されるだけではなく、大事なイベント抽出など、してくれる

## どんなイベントもトラッキング出来る

- サインアップなどの代表的なプリセットが容易
- カスタムイベントを追加出来る

## インパクトのあるイベントが一目で分かる


![gif](http://static1.squarespace.com/static/54dbc3a4e4b012c34eac02fb/t/55afbe3be4b05c73f25fe9d3/1437580948491/?format=1500w)
(http://answers.io/blog/introducing-answers-events より)

## 導入が簡単

Web上でイベント追加ボタンを押すと、こんな導入方法が出てくる親切設計です。

![Screen Shot 2015-07-24 at 11.18.39 AM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/51734f3b-d5f3-45d4-4f7b-83d81d464575.png "Screen Shot 2015-07-24 at 11.18.39 AM.png")

# 導入

とりあえず、導入して実際の自分のアプリで見てみるのが一番だと思います。

上記のような親切設計かつ、ドキュメント自体も充実しているので、作業しやすいです: 
[Answers Events — Fabric iOS latest documentation](http://docs.fabric.io/ios/answers/answers-events.html)

## Crashlyticsのライブラリをアップデート

メニューバーのFabricからCrashlyticsのUpdateボタンを押すだけです。
![Screen Shot 2015-07-24 at 11.22.33 AM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/664d7673-2b36-a617-32d0-3f594e1d529f.png "Screen Shot 2015-07-24 at 11.22.33 AM.png")

差分が出るので、とりあえずコミットしましょう。

## イベントを埋め込む

まず、`import Crashlytics`の追加が必要です。

僕は今までGoogle Analytics使ってイベントトラッキングメソッドを用意していましたので、とりあえず共存期間ということでそちらに追加します。

```swift
func eventOccured(category: String, action: String, label: String? = nil) {
    // Google Analytics(Answers良かったら、次の版で消すかも)
    let builder = GAIDictionaryBuilder.createEventWithCategory(category, action: action, label: label, value: nil)
    let build = builder.build()
    let instance = GAI.sharedInstance()
    let tracker = instance.defaultTracker
    tracker.send(build as [NSObject: AnyObject])
    // Fabric Answers event
    Answers.logCustomEventWithName(category, customAttributes: trimNilValue(["action": action, "label": label]))
}
```

話が逸れますが、`label`をoptionalにしていたため、`AnyObject`では無いとコンパイルエラーになってしまったので、他で使っていた`trimNilValue`という自前関数を噛ませています。

```
public func trimNilValue(source: Dictionary<String, AnyObject?>) -> Dictionary<String, AnyObject> {
    var ret = Dictionary<String, AnyObject>()
    for (k, v) in source {
        if v != nil {
            ret[k] = v
        }
    }
    return ret
}
```

ドキュメント: [Custom Event](http://docs.fabric.io/ios/answers/answers-events.html#custom-event)

これだけで、既存のGoogle Analyticsのイベント発行と同時に、Answersにもイベントが発行されるようになりました。

![Screen Shot 2015-07-24 at 11.33.51 AM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/2de20394-996e-e87c-17a6-515bab4073a5.png "Screen Shot 2015-07-24 at 11.33.51 AM.png")

![Screen Shot 2015-07-24 at 11.34.16 AM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/59711636-b34d-93c5-ed0e-860b392c49fa.png "Screen Shot 2015-07-24 at 11.34.16 AM.png")

ただ、Google Analyticsのイベント発行をそのまま上記方法で置き換えてもしっくりした結果にならないところがあるので、調整中です。

Google Analyticsよりかなり見やすいですが、これだけではまだまだAnswersの良さを有効活用してないと思うので、`Content View`や`Sign Up`など、プリセットの良さそうなイベント発行も追加して使い倒そうと思います（｀・ω・´）

## [Custom Attributes](http://docs.fabric.io/ios/answers/answers-events.html#custom-attributes)について

上記で、`customAttributes`にDictionary型で情報を渡していますが、値には2つのtypeを指定可能です。

### 文字列

100文字以下の文字列を設定出来ます。
カテゴライズされた情報が形成されます。
分類問題として扱うべきときはこちらですかね。

![Screen Shot 2015-07-24 at 2.43.50 PM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/1a045676-5df2-b3c5-b874-a9ce73c0bcc3.png "Screen Shot 2015-07-24 at 2.43.50 PM.png")


### 数値

数の分布情報が形成されます。
回帰問題として扱うべき時はこちらですかね。

![Screen Shot 2015-07-24 at 2.48.10 PM.png](https://qiita-image-store.s3.amazonaws.com/0/19398/6c0e602e-42be-d44f-f694-e89dbc9ea1f7.png "Screen Shot 2015-07-24 at 2.48.10 PM.png")


注意としては、数値型のIDとして識別しているものをCustom Attributesに含める場合、大抵は文字列として渡すべきです。

- x: ["key": 1]
- o: ["key": "1"]

どのIDであるかを分類したいのあって、IDがいくつであるかが計測対象では無いので、質的変数として扱うべき対象だと思います。

# 今いちなところ

一通り使ってみて、以下が気になっています。

- 統計データのエクスポート機能が無さそう(一部あり)
- 検索も無さそう
- データ削除も出来なさそう
	- イベント発行ミスしたときにノイズが残ってしまう
- 一覧性が悪い
	- カスタムイベント数が増えたときに使いにくそう 
	- 項目列幅が調節出来ずはみ出してしまうカラム名・値が多い

やはりGoogle Analyticsや他のツールとの共存が良いかなと感じてきています。
ただ、こちら側でデータ分析しなくてもある程度スマートに面倒見てくれそうなので、とりあえずしばらく使ってみてどんな結果が得られるか期待しています。

# 実際に仕込んだ例

[analytics - Twitter Fabric(Crashlytics)のAnswersの新機能イベントトラッキング結果例を紹介 - Qiita](http://qiita.com/mono0926/items/885ebeba4db5d7b834ac)