asken テックブログ

askenエンジニアが日々どんなことに取り組み、どんな「学び」を得ているか、よもやま話も織り交ぜつつ綴っていきます。 皆さまにも一緒に学びを楽しんでいただけたら幸いです!

iOSでGoogle Analyticsへのイベント送信の実装と確認作業を効率化した話

こんにちは。システム部の大澤です。 普段は北米版あすけんのiOSアプリを開発しています。 今回はGoogle Analyticsに送信する行動ログのイベントの実装を効率化したことについてまとめました。

Google Analyticsとは

Google Analyticsはアプリの使用状況とユーザーエンゲージメントについて分析できる、無料のアプリ測定ソリューションです。 Google Analyticsは元々、WebのツールであったがFirebase Analyticsと統合されて、アプリも計測できるようになりました。 北米版あすけんでは行動ログのイベントを計測するためにFirebaseのSDKを使って、Google Analyticsに送信しています。

行動ログとは

行動ログとは、ボタンのタップイベントや画面のPVなどがあります。 Firebaseを使うことで初期設定でもある程度の行動ログを計測できます。

細かいデータを分析するには独自に実装することが必要です。 Swiftでの実装例として、ボタンのタップイベントの下記のようになります。

import Firebase

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "Test"
    }
    @IBAction func buttonTapped(_ sender: Any) {
        Analytics.logEvent("tap_button_event", parameters: [
            AnalyticsParameterItemID: "id-\(title!)",
            AnalyticsParameterItemName: title!
        ])
    }
}

移行前の実装フロー

f:id:techaskeninc:20211203121820p:plain

  • 実装する人はGoogleスプレッドシートに追加、変更するイベントを追加。
    • 主にドキュメントとして使用していた。
  • 追加したイベントをiOSのプロジェクトで実装する。

課題

  • Googleスプレッドシートに定義されたものと同じものが実装される保証はない。
    • スペルミスやコピーミスで意図しない実装になる可能性がある。
  • 差分を追いづらい。
  • バージョン管理の仕組みがない。

変更後のフロー

f:id:techaskeninc:20211203121935p:plain

  1. 行動ログの実装で必要な情報はGitHubで管理するように変更。
  2. YAMLで実装するイベントを定義する。
  3. YAMLの定義の仕方は移行前のGoogleスプレッドシートと同じにした。
  4. スクリプトを使って、YAML -> CSVに変換して、ドキュメントとして利用する。(エンジニア以外の人も確認を容易にするため)
  5. このタイミングでSpell checker、重複チェック、文字列の長さのチェックを行っている。収集と設定の上限
  6. YAML -> JSONに変換し、JSONを元にして、Swiftのクラスを生成する。
  7. quicktypeを使うことでJSON -> Swiftへ変換が容易にできます。
  8. 実装時に関係ないデータはこのタイミングで消している。
  9. JSONを元に変換されたSwiftのクラスをSwift Package Managerを使って、配布する。
  10. 実装するプロジェクトでSwift Package Managerを使って追加する。それによって、プロジェクトで生成したSwiftのクラスの呼び出しが可能になる。

ここでは上記で作成したものをEventTrackerというフレームワークにして、Swift Package Managerで追加しました。 例として、下記のような実装になります。

import Firebase
import EventTracker

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        title = "Test"
    }
    @IBAction func buttonTapped(_ sender: Any) {
        let result = EventTrackStore.shared.apply(request: FirebaseEvent.Get(keyPath: \.tapButtonEvent))
        Analytics.logEvent(result.eventName, parameters: [
            result.params.key.analyticsParameterItemID: "id-\(title!)",
            result.params.key.analyticsParameterItemName: title!
        ])
    }
}

解決した課題

  • スペルミスやコピーミスで意図しない実装になる可能性がある。
    • スクリプトやツールを使い変換するのでドキュメントと実装するコードが一致する。
  • 差分を追いづらい。
    • GitHubで管理するので差分が追いやすくなる。
  • バージョン管理の仕組みがない。
    • Swift Package Managerで管理するのでバージョン管理が容易になる。

動作確認の改善

  • 実装完了後、意図通りにイベントが送信されているかを確認する必要があります。

改善前

  • 確認方法として、Firebaseの管理画面で確認する。(Debug Viewなどを使う)
  • Xcodeのログで送信されているかエンジニアが確認する。
  • 上記のともにアプリ内で完結できず、作業に手間がかかります。

改善策

  • エンジニア以外の方にも確認を容易にするため、デバッグメニューで送信したデータを見れるようにしました。
    • SwiftのコードでAnalytics.logEventを呼び出す前にデバッグメニューのクラスにそのデータを渡すように実装した。

f:id:techaskeninc:20211202113934p:plain:w320

  • デバッグメニューで実装したものが意図通りに動いているか、エンジニア以外の方に確認してもらえます。
    • 前提として、イベントがFirebaseに正常に送信されていることを確認済み。

今後の展開

  • Androidに同じ仕組みを展開する。
  • 未使用のイベントを検知する。
    • 未使用のイベントはムダなデータとなるため、検知できるように仕組み化して今後対応していきたいです。

まとめ

行動ログのイベント実装はサービスを成長させるために必要であり正確な実装が要求されます。 また、正確な行動ログの収集には、機械的にミスが入り込まない仕組みにしていくことが重要だと思います。 今後も継続的に改善していきたいです。

積極採用中です!

askenでは、一緒に働いてくれるiOSエンジニアを募集しています。少しでも興味を持っていただけたら、ぜひ採用情報をご確認ください。 www.wantedly.com

募集職種 — 株式会社asken (あすけん)www.asken.inc

参考記事