SwiftLintのカスタムルールを使って、スクリーン計測用コードの実装漏れを防ぐ

  • 39
    いいね
  • 0
    コメント

この記事では、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.png

ViewController.swift:11:7: warning: Unimplemented trackScreenView() Violation: Please implement trackScreenView() method in viewDidAppear() (unimplemented_screenview_tracking)

SwiftLintのカスタムルールを使うと、スクリーン計測を忘れてしまうといった問題を、ビルド時のwarningで解決することができます。

その他のケースでも、このような気合や根性でなんとかするしかない問題をルールに落とし込むことができますので、皆様もご活用ください。


  1. GAITrackedViewController というクラスを継承して自動計測も行えますが、UITableViewControllerやUICollectionViewControllerでは使えず、使い勝手が悪いです。 

  2. http://qiita.com/horimislime/items/71702594363b17483567 

  3. super.viewDidAppear(animated) とかは見逃してください