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

  • 7
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

はじめに

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

CocoaPods

PodFile
pod 'GoogleAnalytics'

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

GoogleAnalytics

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

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;
        # 2分毎に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)
    }
}

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

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

AppDelegate

設定を読み込ませる。

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

スクリーン名の自動取得

ここの使い方は簡略化している。
取得したいスクリーン名をしっかり定義したい場合はこちらを使うと良さそう。
以下のコードの元はSwiftalyticsです。

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的なことが簡単にできるライブラリーが今の所なさそうなのが残念。
(探す力がないだけかもしれない。)