はじめに
大したことを書いてません。
毎回プロジェクトを作るときに忘れるので単なるメモです。
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的なことが簡単にできるライブラリーが今の所なさそうなのが残念。
(探す力がないだけかもしれない。)