[iOS][Tune] iOS プロジェクトにTune SDK を導入する

iOSプロジェクトの効果測定用にTuneを導入した際のメモ書きです。
ユーザ識別子(User ID)の設定や イベント送信方法、流入元計測方法やそれらの確認方法を記載します。

SDK導入に関してはシンプルなので特筆することはあまりないですが、Tune管理画面での動作確認で多少手間取った部分があったので共有します。

- Swift 3.1
- Tune SDK 5.0.1
- CocoaPods 1.2.1

# :grey_question: Tune とは
https://www.tune.com
TUNE Japanの紹介文では以下のように紹介されていました。
''
TUNEは、現代のデジタルマーケターが効率的にマーケティングキャンペーンを運用、的確なグループをターゲッティング、そして、アプリパフォーマンスの最適化を通して、ビジネス成長に繋げるためのモバイルマーケティングツールを提供します。
''
![actual.png](https://qiita-image-store.s3.amazonaws.com/0/156085/18e40ce3-bcfd-4931-8c96-f7068efb167f.png)


# :pen_ballpoint: 登録
1. tune.comにアクセスし、画面右上のLOGINを選択します。
2. 必要なフィールドに情報入力し、SUBMITします。  
![request.png](https://qiita-image-store.s3.amazonaws.com/0/156085/d57c4ab2-2766-a0f2-95e1-fa7c8aeba128.png)
3. 暫くすると先方の担当者からメールがあるのでログインします。

# :pencil: アプリ追加
Tune SDKを組み込む際に **Advertiser ID** と **Conversion Key** なるものが必要なため、Tuneの管理画面から事前にAppを作成し取得しておきます。

1. Loginすると、Marketing Console が表示されるので画面右上のメニューボタンからAttribution Anlayticsを選択します。
2. 左ペインの `APPLICATIONS > Apps` を選択し、`Add a New App` します。
3. 各項目を入力し、 `Create App & Continue` します。  
![add_a_new_app.png](https://qiita-image-store.s3.amazonaws.com/0/156085/79997623-2239-fd1a-cd93-89e84128aa00.png)
   - App Name: アプリ名
   - Channel: Mobile
   - Platform: iOS
   - Package Name: アプリのバンドルID
   - Store App ID: AppStore のID
   - Destination URL: AppStore のURL
4. 作成すると `Details` が表示されるのでその中の `Conversion Key` と `Advertiser Id` を控えておきます。  
![app_details.png](https://qiita-image-store.s3.amazonaws.com/0/156085/1cb2a7f0-1f23-5cef-c57b-5591cf2c8949.png)


# :tools: SDKの導入
導入はシンプルなので[こちらのクイックスタートページ](https://developers.tune.com/sdk/ios-quick-start/?lang=ja)を参考に進めてもらえれば問題ありません。

実装についてはObjective-Cで書かれていますが、Swiftでも文法以外同じです。
Swiftで書かれている参考ページは[こちら](https://developers.tune.com/sdk/including-tune-ios-objective-c-sdk-in-a-swift-project/#)。

## 初期化と測定の開始

```Swift
import Tune

@UIApplicationMain
final class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {

        ...

        // 初期化
        Tune.initialize(withTuneAdvertiserId: "<ADVERTISER_ID>", tuneConversionKey: "<CONVERSION_KEY>")

        ...
    }

    func applicationDidBecomeActive(_ application: UIApplication) {
        // 測定の開始
        Tune.measureSession()
    }
}
```

`<ADVERTISER_ID>` ... 控えておいたAdvertiser IDを指定します。
`<CONVERSION_KEY>` ... 控えておいたConversion Keyを指定します。 

別のBundle IDを指定したい場合は下記の初期化関数を利用するか、もしくは `setPackageName()` が利用できます。

```Swift
Tune.initialize(withTuneAdvertiserId: "<ADVERTISER_ID>", tuneConversionKey: "<CONVERSION_KEY>", tunePackageName: Bundle.main.bundleIdentifier!, wearable: false)
```

```Swift
Tune.setPackageName(Bundle.main.bundleIdentifier!)
```

## User ID の設定
initializeの後に `setUserId()` を行うと管理画面上で `User ID` として確認可能になります。アプリのサービスで一意に扱われるIDを指定したりします。
これとは別にTune 上で一意なものとしては `Tune ID` があります。
確認方法は後述。

```Swift
        ...
        // 初期化
        Tune.initialize(withTuneAdvertiserId: "<ADVERTISER_ID>", tuneConversionKey: "<CONVERSION_KEY>")
        // `User ID`のセット
        Tune.setUserId("<USER_ID")
        ...
```

## イベントの送信
任意の識別子で属性を5つまで与えられるイベントが送信できます。
Attribution AnalyzeではCustom Field が使用できないのでそういった要素はこれで行う。確認方法は後述。

```Swift
func sendSetUserIdentifierEvent() {
    if let event = TuneEvent(name: "hogehoge"),
        let item1 = TuneEventItem(name: "fugafuga", attribute1: "fugafuga value1", attribute2: "fugafuga value2", attribute3: "", attribute4: "", attribute5: ""),
        let item2 = TuneEventItem(name: "piyopiyo", attribute1: "piyopiyo value", attribute2: "", attribute3: "", attribute4: "", attribute5: "") {
        event.eventItems = [item1, item2]
        Tune.measure(event)
    }
}
```

## iOS IFA(IDFA)の取得
SDKの方で自動的に取得して記録されます。
もし自前APIなどに紐付けしたい場合は以下で取得できます。

```Swift
let idfa = Tune.appleAdvertisingIdentifier()
```

Tune IDの場合、以下で取得します。 

```Swift
let tuneId = Tune.tuneId()
```

## 流入元計測
どこからアプリのストアページに行き着いてインストールしたのかが計測できます。
まずはパートナーを追加してそれを元に計測URLを作成します。

### 1. パートナーの追加
1-1. 管理画面左ペインの `PARTNERS > Partners` から `Add Partner` します。
![add_partner_1.png](https://qiita-image-store.s3.amazonaws.com/0/156085/2e4089b0-ff5f-7212-98cb-3c867089301e.png)

1-2. 名称入力、Typeを選択し `Add Partner` します。TypeはAdvertising PartnerとTechnology Partnerがあります。
![add_partner_2.png](https://qiita-image-store.s3.amazonaws.com/0/156085/6ad8d066-ca0b-19fa-a505-9b57134a7e72.png)

### 2. 計測URLの追加
2-1. 管理画面左ペインの `PARTNERS > Measurement URLs` から `Create Measurement URLs` します。
2-2. それぞれ適切に設定します。  
   Select your App: 対象アプリを選択します。  
   Select your Partner: 上のセクションで追加したパートナーを選択します。  
   Select your Agency: 代理店があれば選択します。  
2-3. Saveボタンの上にURLが表示されますので控えます。
2-4. Saveします。  
下記に各設定についての詳細が記載されています。  
[測定 URL を作成する - TUNE HELP](https://help.tune.com/marketing-console/測定-url-を作成する/?lang=ja)

![measurement_url.png](https://qiita-image-store.s3.amazonaws.com/0/156085/d131c001-090b-5fb5-1154-116ad2c46f32.png)

端末のSafariで上記生成したURLを踏み、その後にXcodeやFabricからアプリをインストールしておきます。
確認方法は後述。

# :eyes: 確認方法
管理画面にLoginして記録されているか確認します。

割と重要なことですがInstallsやOpensのレポートへの反映は **先勝ちで１日１回しか記録されません** 。
つまりInstallした場合、再Installしても同端末、同日なら記録されません。
どうしても当日中にその同端末で記録させたい場合は、iOSの広告IDをリセットするしかなさそうです。
`iOS設定 > プライバシー > 広告 > Advertising Identifierをリセット...` します。
*＊全アプリで共通のためご注意ください*

Eventは１日に複数回記録されることを確認しています。

## インストールの確認
左ペインの `REPORTING > Test Logs > Installs` にだいたい数分で反映されます。
直近、12時間以内のものが表示されるのでそれ以上経っている場合は、`REPORTING > Logs > Installs` で確認できます。
![test_logs.png](https://qiita-image-store.s3.amazonaws.com/0/156085/2904e102-9b8b-3ccd-90ce-1a287ef47c3e.png)

## オープンの確認
左ペインの `REPORTING > Logs > Opens` に反映されますが、こちらは `Test Logs` とは異なり、数時間ほど経過しないと反映されないような感じですので気長に待つしかありません。
![logs_open.png](https://qiita-image-store.s3.amazonaws.com/0/156085/653b5f16-b8f0-d82b-cef2-e52eebc4ad88.png)


## User ID の確認
1. `Logs`, `Test Logs` にある `Configure Report` を選択して `Metrics > Internal > +14 more` を押して他の候補を表示します。
![user_id_1.png](https://qiita-image-store.s3.amazonaws.com/0/156085/4590b0fc-9e22-d904-4054-43d3437a6868.png)
2. `User ID` を有効にして `Apply` します。
![user_id_2.png](https://qiita-image-store.s3.amazonaws.com/0/156085/69474429-c631-d74e-011c-ba1d1e29d2a2.png)
3. 右にスクロールすると最後に `User ID` が追加されています。
![user_id_3.png](https://qiita-image-store.s3.amazonaws.com/0/156085/10a0cfa0-0798-3677-a5ee-3fb3edb01ff0.png)


## イベントの確認
`Logs`, `Test Logs` にある `Event Items` から確認できます。
`Configure Report` から `Attribute 1` ~ `Attribute 5`を有効にしておくと表示されます。
![event_log.png](https://qiita-image-store.s3.amazonaws.com/0/156085/9c7900b4-fa0a-2b80-e968-2241579c43ec.png)

## 流入元計測の確認
`Logs`, `Test Logs` のPartnerカラムに表示されます。
![measurement_url_result.png](https://qiita-image-store.s3.amazonaws.com/0/156085/416b40c2-5423-3e0d-3152-73ed366742ec.png)


## 何が取れているのか？
実際、どのような情報が取得できているのかを確認するには、（UI操作的に少し面倒ですが） `Configure Report` の全ての項目にチェックして cvsでexportすると見やすいかもしれません。
![export_1.png](https://qiita-image-store.s3.amazonaws.com/0/156085/49b725c6-d6fa-b007-bcbb-e147744a71aa.png)

![export_2.png](https://qiita-image-store.s3.amazonaws.com/0/156085/d508fa89-630a-c57b-8d11-5fd648f2b8fe.png)


# その他
セッションが切れ、reloadすると"File not found."とエラー表示された空白ページになってしまい読み込みできなくなってしまう問題があるようです。
tune.comにアクセスし直してもう一度Loginする必要があります。

またページによっては日本語だと若干情報が欠けている部分があったりするのであれ？と思ったら左上のLanguages メニューからEnglishを選択してください。

# 感想
マーケ的に有用なのかどうか詳しくないので私には判断できませんが、折角いろいろ端末情報が取れていてよくできているように思うのですが、管理画面を使用していると細かい部分でUIがイケてなくて損しているように感じましたw
反映に時間がかかるのはしょうがないとして、下記だけでも改善をお願いしたいところです。

- LogsやTest Logsだけでなく色々なページに日付選択やConfigure設定がありますが、ページ切り替え都度都度選択が解除されてしまうので面倒（タイムゾーンだけはMy Account Settingsで設定できる）
- 日付のデフォルト選択がなぜか昨日のみの選択になっている
- セッション切れエラー表示のままになってしまう件
- Configure Reportでたくさん選択すると横スクロールが長大になりがち
- 全体的に読み込みが少し重め

---
[tune.com](tune.com)
[TUNE Japan Facebook](https://www.facebook.com/tunejapan/)