Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした