SwiftでGoogleAnalyticsの設定とスクリーン名自動設定

## はじめに
大したことを書いてません。
毎回プロジェクトを作るときに忘れるので単なるメモです。

## CocoaPods
```rb:PodFile
pod 'GoogleAnalytics'
```

※`Carthage`は未だにプロジェクで使ってない・・・

## GoogleAnalytics
Swiftの雛形はこんな感じ。
CategoryやActionはある程度統一してたほうがデータ集計が行いやすい。

```swift:GoogleAnalytics.swift
class GoogleAnalytics: NSObject {
    
    // トラッキングカテゴリー
    enum Category:String {
        case User = "User"
    }
    
    // トラッキングアクション
    enum Action:String {
        case Show = "Show"
        case Tap = "Tap"
    }
    
    // セットアップ
    class func setup() {
        GAI.sharedInstance().trackUncaughtExceptions = true;
        # ２分毎にgoogleへデータ送信
        GAI.sharedInstance().dispatchInterval = 120
        GAI.sharedInstance().logger.logLevel = .Warning //.Verbose
        GAI.sharedInstance().trackerWithTrackingId("UA-XXXX-XX")
    }

    // トラッキングスクリーン
    class func trackScreen(screenName: String) {
        let build = GAIDictionaryBuilder.createScreenView().set(screenName, forKey: kGAIScreenName).build() as [NSObject: AnyObject]
        GAI.sharedInstance().defaultTracker.send(build)
    }

    // トラックイベント
    class func trackEvent(category:Category, action:Action, label:String?, value:NSNumber = 1) {
        let build = GAIDictionaryBuilder.createEventWithCategory(category.rawValue, action: action.rawValue, label: label, value: value).build() as [NSObject: AnyObject]
        GAI.sharedInstance().defaultTracker.send(build)
    }
}
```

見て分かるとおりだけど、使用方法は以下のように行う。

```swift
// スクリーン名
GoogleAnalytics.trackScreen("ScreenName")
// イベント
GoogleAnalytics.trackEvent(.User, action: .Show, label: "USER-ID")
```

## AppDelegate
設定を読み込ませる。

```swift:AppDelegate.swift
    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject : AnyObject]?) -> Bool {
        // GoogleAnalytice
        GoogleAnalytics.setup()
    }
```

## スクリーン名の自動取得
ここの使い方は簡略化している。
取得したいスクリーン名をしっかり定義したい場合は[こちら](https://github.com/MrAlek/Swiftalytics)を使うと良さそう。
以下のコードの元は`Swiftalytics`です。

```swift:ScreenTracking.swift
extension UIViewController {
    public override class func initialize() {
        struct Static {
            static var token: dispatch_once_t = 0
        }
        
        // make sure this isn't a subclass
        if self !== UIViewController.self {
            return
        }
        
        dispatch_once(&Static.token) {
            let originalSelector = #selector(UIViewController.viewDidAppear(_:))
            let swizzledSelector = #selector(UIViewController.swiftalytics_viewDidAppear(_:))
            
            let originalMethod = class_getInstanceMethod(self, originalSelector)
            let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)
            
            let didAddMethod = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
            
            if didAddMethod {
                class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod))
            } else {
                method_exchangeImplementations(originalMethod, swizzledMethod)
            }
        }
    }
    
    func swiftalytics_viewDidAppear(animated: Bool) {
        swiftalytics_viewDidAppear(animated)
        // 除外するクラスを指定
        if !(self is UINavigationController) {
            // クラス名を取得
            var className = NSStringFromClass(self.dynamicType)
            GoogleAnalytics.trackScreen(className)
        }
    }
}
```

## 最後に
SwiftでAOP的なことが簡単にできるライブラリーが今の所なさそうなのが残念。
（探す力がないだけかもしれない。）