ExpoでFirebase Analyticsを実装しました。
はじめに
ExpoにFirebase Analyticsを実装したので、それについて記述したいと思います。
色々調べているとGoogle Analyticsについてのドキュメントが出てきますが、モバイルアプリのトラッキングには、基本的にFirebase Analyticsを使用することをお勧めします。
Firebase AnalyticsはGoogle Analytics for Firebaseとして機能し、Google Analytics 4(GA4)の一部として扱われています。
トラッキング: 追跡
react-native-firebaseのanalyticsをインストールする
下記コマンドを実行して、Firebase Analyticsが使用できるようにします。
$ npm install @react-native-firebase/app
$ npm install @react-native-firebase/analytics
react-native-firebaseライブラリを使用したFirebase連携はこちらに詳しく書いてあるので、そちらが終わっていない方は見てください。
Firebase Analyticsでカスタマイズした値を発火させる
はじめに、このサンプルコードが発火するかどうか確認します。
import analytics from '@react-native-firebase/analytics'
・・・
<Button
title="Test Analytics"//サンプルコードから名前を変えました。
onPress={async () =>
await analytics().logSelectContent({
content_type: 'button',//サンプルコードから名前を変えました。
item_id: 'abcd',//サンプルコードから名前を変えました。
})
}
/>
EAS ビルドをして、実機で対象のボタンを押します。
Firebase consoleのRealtime Analyticsを見てイベントが飛んでいるか確認します。
Realtime Analyticsのアクティブユーザーに数値が入っていたら、何かしらの値は発火したことになります。
画面下の方にイベント数というのがあるので、そちらを確認します。
そこに、select_contentという値があると思います。
その中のcontent_typeを押下し、中に指定したbuttonの値が入っていたら、イベントの送信成功が確認できます。
同様に、item_idを押下し、中に指定したabcdの値が入っていたら送信成功です。
logSelectContentを設置
サンプルコードのイベント発火が確認ができたら、src/utils/analytics.tsに関数としてまとめます。
import analytics from '@react-native-firebase/analytics'
export const logSelectContent = async (contentType: string, itemId: string) => {
await analytics().logSelectContent({
content_type: contentType,
item_id: itemId,
})
}
import { logScreenView } from '../utils/analytics'
・・・
const handleClick = async (contentType: string, itemId: string) => {
await logSelectContent(contentType, itemId)
}
・・・
return (
<Button text="Test Analytics" onClick={() => void handleClick('button', 'bcde')} />
これでまた、先ほどと同じようにRealtime Analyticsを見て、表示されているか確認してください。
確認できたら、別のlogSelectContentを設置していきます。
別のlogSelectContent設置
ほかにも何個かlogSelectContent設置を設置して確認します。
const handleClick = async (contentType: string, itemId: string) => {
await logSelectContent(contentType, itemId)
}
・・・
<Link href="/home" style={styles.link} onPress={() => void handleClick('nav_home', 'cdef')}>
👉 【Stack】 Tabホーム
</Link>
<Link href="/about" style={styles.link} onPress={() => void handleClick('nav_about', 'defg')}>
👉 【Stack】 このアプリについて
</Link>
<Link href="/terms" style={styles.link} onPress={() => void handleClick('nav_terms', 'efgh')}>
👉 【Stack】 利用規約
</Link>
下記画像のLinkをクリックしたらイベントが発火するようなイベントを作成しました。これもRealtime Analytics表示されるか確認してください。
logScreenViewを設置
src/app/_layout.tsxにlogScreenViewを設置します。こちらの記事からコードをもらいました。
export default function RootLayout() {
const pathname = usePathname();
useEffect(() => {
const logScreenView = async () => {
console.log('Logging screen view:', pathname);
try {
await analytics().logScreenView({
screen_name: pathname,
screen_class: pathname,
});
} catch (err: any) {
console.error(err);
}
};
logScreenView();
}, [pathname]);
}
ここにこのコードを書くと、各ページのパス名がRealtime Analyticsに反映されます。
1枚目の画像のLinkを押下して、2枚目の画像の画面遷移した時に発火します。
Realtime Analyticsで表示されるか確認します。
表示回数にも反映されます。
イベント数のscreen_viewを押下します。
その中のfirebase_screen_classを押下します。
そこに各ページのパスが表示されていたら成功です。
Firebase Analyticsで実際に送られてきた値
自分で実装した値以外にも、自動で発火する値があります。下記は実際にFirebaseに送られてきた値です。
イベント名 | パラメータ名 | 説明 | 入ってた値 |
---|---|---|---|
screen_view |
firebase_event_origin |
イベントの発生元を示す内部パラメータ。 | 自動 |
firebase_screen_class |
表示された画面のクラス名。 |
/about など |
|
firebase_screen_id |
画面の一意の識別子。 | 自動 | |
ga_session_id |
現在のセッションの一意の識別子。 | 自動 | |
ga_session_number |
ユーザーのセッション番号。 | 自動 | |
firebase_previous_class |
前の画面のクラス名。 |
/home など |
|
firebase_previous_id |
前の画面の一意の識別子。 | 自動 | |
firebase_previous_screen |
前の画面の名前。 |
/home など |
|
firebase_screen |
現在の画面の名前。 |
/about など |
|
user_engagement |
engagement_time_msec |
ユーザーがアプリと対話した時間(ミリ秒単位)。 | 自動 |
firebase_event_origin |
イベントの発生元を示す内部パラメータ。 | 自動 | |
firebase_screen_class |
表示されている画面のクラス名。 | 自動 | |
firebase_screen_id |
画面の一意の識別子。 | 自動 | |
ga_session_id |
現在のセッションの一意の識別子。 | 自動 | |
ga_session_number |
ユーザーのセッション番号。 | 自動 | |
select_content |
content_type |
選択されたコンテンツの種類(例: 画像、テキスト)。 |
button など |
firebase_event_origin |
イベントの発生元を示す内部パラメータ。 | 自動 | |
firebase_screen_class |
表示されている画面のクラス名。 | 自動 | |
firebase_screen_id |
画面の一意の識別子。 | 自動 | |
ga_session_id |
現在のセッションの一意の識別子。 | 自動 | |
ga_session_number |
ユーザーのセッション番号。 | 自動 | |
item_id |
選択されたアイテムの一意の識別子。 |
bcde など |
|
session_start |
- | ユーザーの新しいセッションの開始を示すイベント。 | - |
app_exception |
- | アプリ内で例外(エラー)が発生したことを示すイベント。 | - |
first_open |
- | ユーザーがアプリを初めて開いたことを示すイベント。 | - |
firebase_event_origin,firebase_screen_class,firebase_screen_idなどのBigQueryはこちらに定義されています。
screen_view,user_engagement,session_start,app_exception,first_openは、GAのドキュメントで、自動で収集イベントとして記載されています。
ga_session_id,ga_session_numberについては、アナリティクスのセッションについてに書いてあります。
setUserProperty
setUserPropertyの実装したかったのですがうまくいかなかったので、実装できたら別の記事に書こうと思います。
setUserPropertyはRealtime Analyticsに反映されないので、半日以上待ってAnalytics Dashboardに表示されるのを確認しなくてはなりません。それだと、作業効率が悪いので、DebugViewを使用してリアルタイムに反映されるのを確認したかったのですが、それが上手く連携することができず、記事に書けませんでした。
Discussion