Swiftで Google Analytics (3.10) を使用してスクリーンをトラッキングする（Bridging Headerもあるよ）

この前、ベースがSwiftのプロジェクトにGoogle Analytics (以後、GAと書いたりします) を導入する機会があったのでメモ。

Google AnalyticsはSwiftサポートをまだしていないため、基本はObjective-CとSwiftのブリッジ作ってからObjective-Cと同じコードを書くだけです。

なので、これからGAをプロジェクトに導入したい人向けかと思われます。


## 今回作成したプロジェクト

- [GoogleAnalytics-Sample-iOS](https://github.com/kaneshin/GoogleAnalytics-Sample-iOS)

※結論：このプロジェクトを見れば十分。


## 環境

- iOS8+
- Xcode version 6.1 (6A1052d)
- Swift version 1.1 (swift-600.0.54.13)
- CocoaPods 0.34.4 

[CocoaPods公式](http://blog.cocoapods.org)は0.35のrc版を配布していますが、今回使っていません。


## 実装

### 前提

- 既にプロジェクトが存在しているものに導入します。
- GAのTrackingIDも取得済みとします。
- GAのセットアップなどは[公式のリファレンス](https://developers.google.com/analytics/devguides/collection/ios/v3/)を参考にしています。

### 1. Google Analytics のインストール

Google Analytics の iOS SDK 最新版は 3.10 なので、それを CocoaPods 経由でインストールします。

**Podfile**

```rb
source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
xcodeproj 'GoogleAnalytics-Sample'
pod 'GoogleAnalytics-iOS-SDK', '3.10'
```

もしくは、[公式のダウンロードページ](https://developers.google.com/analytics/devguides/collection/ios/resources)から導入してください。


### 2. Google Analyticsのセットアップの前に

GAを使用するために、まずはSwiftで使えるようブリッジングします。

#### ブリッジングの導入

1. ブリッジングのヘッダーファイルを作成する。（名前は何でも良い。今回は`Objective-C-Bridging-Header.h`にしました）
2. プロジェクト（もしくはターゲット
）のBuild Settingsにて、「bridging」で検索する
3. `Objective-C Bridging Header` というのがあるので、そこの値に作成したヘッダーファイルのパスを入力する

![Screen_Shot_2014-11-12_at_11_42_57_AM.png](https://qiita-image-store.s3.amazonaws.com/0/3353/e3aeba93-c7da-6ead-70c1-a1b16374f7c5.png)

参照：[Swift and Objective-C in the Same Project](https://developer.apple.com/library/ios/documentation/swift/conceptual/buildingcocoaapps/MixandMatch.html)


----

これでブリッジングを導入できました。

今回、GAをSwiftで使用するために下記のように書いています。

**Objective-C-Bridging-Header.h**

```
// Objective-C-Bridging-Header.h

#ifndef GoogleAnalytics_Sample_Objective_C_Bridging_Header
#define GoogleAnalytics_Sample_Objective_C_Bridging_Header

#import <GoogleAnalytics-iOS-SDK/GAI.h>
#import <GoogleAnalytics-iOS-SDK/GAIFields.h>
#import <GoogleAnalytics-iOS-SDK/GAILogger.h>
#import <GoogleAnalytics-iOS-SDK/GAIDictionaryBuilder.h>

#endif
```

※1 インクルードガードはお作法でいれてます。
※2 CocoaPodsでない場合は記載が変わります。

### 3. Google Analyticsのセットアップ

ブリッジングしているので、既にSwiftで使用できるようになっています。

`AppDelegate`にGAを初期化するコードを書きます。

今回はAppDelegateを使用していますが、普段はユーティリティーなクラスを作成しています。

**AppDelegate.swift**

```swift
import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    
    var tracker: GAITracker?
    
    class func setupGoogleAnalytics() {
        GAI.sharedInstance().trackUncaughtExceptions = true;
        GAI.sharedInstance().dispatchInterval = 20
        GAI.sharedInstance().logger.logLevel = .Verbose
        if let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
            appDelegate.tracker = GAI.sharedInstance().trackerWithTrackingId("UA-XXXXXXXX-X")
        }
    }

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        AppDelegate.setupGoogleAnalytics()
        return true
    }

}
```

これでGAを使用する準備は整ったので、あとはスクリーントラッキングに必要なコードを埋め込むだけです。


### 4. スクリーントラッキングコード

今回、ベースクラスで使われる `GAITrackedViewController` は使用せず、自分でベースクラスを作成し、その中で `GAIDictionaryBuilder` を用いて送信する実装をします。

ベースクラスを`BaseViewController`という名前で作成し、下記のコードを仕込みます。

**BaseViewController.swift**

```swift
class ViewController: UIViewController {

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        if let appDelegate = UIApplication.sharedApplication().delegate as? AppDelegate {
            let screenName = reflect(self).summary
            let build = GAIDictionaryBuilder.createAppView().set(screenName, forKey: kGAIScreenName).build()
            appDelegate.tracker?.send(build)
        }
    }

}
```

このベースを継承させたViewControllerを作成していけば、そのControllerが表示されるときにトラッキングされるようになります。

**TopViewController.swift**

```
class TopViewController: BaseViewController {}
```

**DetailViewController.swift**

```
class DetailViewController: BaseViewController {}
```

実際に、GAに送られてくる値は下記のようになります。

![Screen Shot 2014-11-12 at 1.14.42 PM.png](https://qiita-image-store.s3.amazonaws.com/0/3353/7a1b20cd-cde7-b99f-c678-bff30d0bf4e6.png)


## おわりに

ブリッジングヘッダーの導入方法とGAのセットアップの簡単な説明でしたが、これからやろうかな、って思っていた人の助けになればと。

あと、GAのSwiftサポートはいつなんでしょうかね。（64bit対応も遅かったですし）

### Advent Calendar 2014

今年ももう終わり。今年は４つ書きます！

- [Swift 12日目](http://qiita.com/advent-calendar/2014/swift)
- [iOS 25日目](http://qiita.com/advent-calendar/2014/ios)
- [Android 24日目](http://qiita.com/advent-calendar/2014/android)
- [SublimeText 8日目](http://qiita.com/advent-calendar/2014/sublimetext)

---

- 本当はGolangも書きたかったけど、満員でした。
- SublimeTextは触った事が数分しかない。
- Vimは今回書きません。（Xcodeばっかりなので、、）