LoginSignup
6
7

More than 5 years have passed since last update.

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

Posted at

はじめに

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

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

6
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
7