LoginSignup
47
45

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-09-28

この記事では、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) とかは見逃してください 

47
45
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
47
45