この記事では、SwiftLintのカスタムルールを使い、Google Analyticsのスクリーン計測用コードの実装漏れを防ぐ方法をご紹介します。
SwiftLintのカスタムルールを使うと、気合や根性で何とかしていた問題を、ルールに落とし込むことができ、ミスが減ります。
背景
アプリを開発する際に、ユーザーの行動計測を目的として、Google Analyticsのスクリーン計測を使うことは多いと思います。このスクリーン計測を利用する際には、各ViewControllerに手動でイベント計測コードを埋め込むことになりがちです。1
手動でのイベント計測は正直苦行であり、実装漏れも起きやすくなります。
Method swizzlingを使って、viewDidAppear()
を置き換え、自動計測を行うような方法も提案されていますが2、黒魔術的なコードを本番アプリに組み込むのは気が引けました。
そのため、以下のような方針を立てました
- 各ViewControllerに1行だけトラッキング用コードを書く
- 実装漏れがあった場合はSwiftLintでwarningを出す
実装
1行だけでトラッキングコードを書けるようにする
extensionを使えば、UIViewControllerのサブクラスからは1行のトラッキングコードを書くだけで済みます。
extension UIViewController {
func trackScreenView() {
let className = NSStringFromClass(self.dynamicType)
// トラッキング処理を書く
}
}
トラッキングコード自体は以下のように1行で3済みます。
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
trackScreenView()
}
SwiftLintのカスタムルールで実装漏れにwarningを出す
SwiftLintのカスタムルールを使うと、正規表現をベースにwarningを出すことができます。
今回は以下のような条件でwarningを出すルールを作りました
- ファイル内にUIViewController, UITableViewController, UICollectionViewControllerのいずれかのサブクラスが実装されている
- ファイル内に
trackScreenView
という文字列が書かれていない
.swiftlint.yml
custom_rules:
unimplemented_screenview_tracking:
name: "Unimplemented trackScreenView()"
regex: "class\s+\w+\s*:\s*UI(Table|Collection)?ViewController(?![\s\S]*trackScreenView)"
message: "Please implement trackScreenView() method in viewDidAppear()"
severity: warning
結果
このような形でwarningが出るため、実装忘れに気づけます。
ViewController.swift:11:7: warning: Unimplemented trackScreenView() Violation: Please implement trackScreenView() method in viewDidAppear() (unimplemented_screenview_tracking)
SwiftLintのカスタムルールを使うと、スクリーン計測を忘れてしまうといった問題を、ビルド時のwarningで解決することができます。
その他のケースでも、このような気合や根性でなんとかするしかない問題をルールに落とし込むことができますので、皆様もご活用ください。