iOSアプリ開発者は知らなきゃヤバイ！「Mixpanel iOS SDK」の導入と設定


[Mixpanel](https://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CDcQFjAA&url=https%3A%2F%2Fmixpanel.com%2F&ei=XygGU5mEKsyQkwWdn4GQCA&usg=AFQjCNEwfR7fGT09fq2nWzxGIHCv4etVbw&sig2=xktuVgGTBA_KDJLflEZ8_g)というユーザイベントにフォーカスした解析サービスがあって、それのiOS SDKの導入と設定についてのメモ。タイトルは完全に釣りです。

似たようなサービスで[Flurry](http://dev.flurry.com/)というものもあり、これについては[別の記事で同じように説明している](http://qiita.com/yimajo/items/752f69bba344a68a5f9a)ので比較しても面白いかもしれません。

# インストール

MixpanelのiOS SDKはcocoapodsでインストールできる。

```
pod 'Mixpanel'
```

Xcode 4系でiOS SDK 6以下の場合は2.1.1未満を使う必要がある

```
pod 'Mixpanel', '< 2.1.1'
```

# ライブラリの初期化

```objc
#import <Mixpanel.h>

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //最初にトークンで初期化
    [Mixpanel sharedInstanceWithToken:@"トークン"];
    //...
}
```

トークンはMixpanel管理画面で該当するプロジェクトを作成後、設定画面のManagementのタブからTOKENの項目に書かれている。

```objc
//以降はsharedInstanceで呼び出す
Mixpanel *mixpanel = [Mixpanel sharedInstance];
```

# イベントのトラッキング

## 通常のトラッキング

イベント名と任意の情報をDictionaryで指定する。

```objc
Mixpanel *mixpanel = [Mixpanel sharedInstance];

//イベント名のみ指定
[mixpanel track:@"Play Video"];

//イベント名と任意の情報を指定
[mixpanel track:@"Plan Selected" properties:@{
    @"Gender": @"Female",
    @"Plan": @"Premium"
}];


```

DictionaryのKeyはNSString、ValueはNSString, NSNumber, NSNull, NSArray, NSDictionary, NSDate, NSURLいずれかの必要がある。 

## トラッキング項目の固定登録

都度送る必要がない場合は、registerSuperProperties:メソッドでDicrionaryの項目を登録しておくことができる。

```objc
Mixpanel *mixpanel = [Mixpanel sharedInstance];

//登録することで常にこの項目が送られる
[mixpanel registerSuperProperties:@{@"User Type": @"Paid"}];
```

## 一度きりのトラッキング項目

registerSuperProperties:と機能は同じだが、一度きりで良い場合はregisterSuperPropertiesOnce:を使う。

```objc
Mixpanel *mixpanel = [Mixpanel sharedInstance];

[mixpanel registerSuperPropertiesOnce:@{@"source": @"ad-01"}];
```

これはキャンペーンなどで利用することを想定している様子。

# ユーザーの情報

## idを明示的に指定する

Mixpanelはアプリがインストールされた個々のユーザに対してdistinct IDを割り当てている。identify:メソッドでは任意のIDに置き換えることも出来る。

```objc
Mixpanel *mixpanel = [Mixpanel sharedInstance];

[mixpanel identify:@"13793"];
```

自分が運営しているウェブサービスのユーザーIDなどであれば端末をまたいで同じIDにできるのでメリットがある。

## idをひもづける

distinct IDと特定の情報をひもづけることが出来る。

```objc
[mixpanel createAlias:@"joe@example.com"
    forDistinctID:mixpanel.distinctId];

[mixpanel identify:mixpanel.distinctId];
```

例えばこれによって運営しているウェブサービスがなく端末をまたがるidを明示的に指定する事ができなくても、ユニークな特定の情報とdistinct IDを紐付け端末をまたいでユーザーの同定を行うことができる。

## ユーザー情報の付加

distinct IDを指定後、peopleプロパティに任意のDictionaryをセットすることでユーザー情報の指定ができる。

```objc
Mixpanel *mixpanel = [Mixpanel sharedInstance];

[mixpanel identify:@"13793"];

// Sets user 13793's "Plan" attribute to "Premium"
[mixpanel.people set:@{@"Plan": @"Premium"}];
```

## ユーザーの情報を変更する

peopleプロパティのincrement:メソッドで任意の情報の値を変爻することが出来る。

```objc
//ユーザー情報の値を変爻することが出来る
[mixpanel.people increment:@"point count" by:500];

//NSDictionaryで指定
[mixpanel.people increment:@{
    @"dollars spent": @17,
    @"credits remaining": @-34
}];
```

例えばゲームアプリであればスコアを変更することや、ダイエットアプリなどであれば体重などユーザー情報を上書きするためのものだと思う。

## ユーザーの課金をトラッキングする

```objc
[mixpanel identify:@"13793"];

// $100払ってくれた
[mixpanel.people trackCharge:@100];

// $50払い戻された
[mixpanel.people trackCharge:@-50];

// $25払われた日にちも指定
[mixpanel.people trackCharge:@25 withProperties:@{
    @"$time": @"2012-01-02T00:00:00"
}];
```

上のコードではidが13793というユーザーがどれだけ課金してくれたかが分かる。また、Mixpanelの管理画面ではトータルや平均額を計算してくれる。こりゃ便利。しかしドルで送ることを前提にされているようでそこだけ不自由。

https://mixpanel.com/revenue/


# Push通知

Push通知も出来る様子。設定はAPNsからデバイストークンが返ってくるメソッドで処理を行う。

```objc
- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:
        (NSData *)deviceToken
{
    Mixpanel *mixpanel = [Mixpanel sharedInstance];

    // Make sure identify has been called before sending
    // a device token.
    [mixpanel identify:@"13793"];

    // This sends the deviceToken to Mixpanel
    [mixpanel.people addPushDeviceToken:deviceToken];
}
```

きっとUIApplicationのregisterForRemoteNotificationTypes:メソッドはコールする必要があるのだろう。

# デバッグ設定

プリプロセッサマクロで指定する

MIXPANEL_LOG=1でトラックイベントのログ出力
MIXPANEL_DEBUG=1は何をやってくれるか不明

# 雑感

ライブラリのインストールがcocoapodsなのはとても便利。またユーザーのヒモ付をメールアドレス等特定の情報で出来るのも開発者のことをよく分かっている感があります。ただ、残念なのはユーザー課金の金額をトラッキングする部分がドル固定なのが痛いですね。日本限定アプリの場合は日本円で送っても問題無いとは思いますが。