본문 바로가기

일::개발

[flutter] Firebase Analytics

flutter 프로젝트에 Firebase Analytics를 넣어본다.

일단 Analytics가 동작하게 하는 것은 하라는대로만 하면 잘 된다.

 

디버그모드를 활성화하고, Firebase console의 DebugView에서 보면 기본적으로 동작하도록 설정되어 있는 screen_view, user_engagement 이벤트 같은 것들이 집계되는 것을 실시간으로 확인할 수 있다.

❯ adb shell setprop debug.firebase.analytics.app KR.CO.MY.PACKAGE.NAME

그런데, 잘 보면 screen_view 이벤트에 문제가 있다.

화면 이동해도 제대로 기록되지 않거나, 기록이 되어도 screen_class가 MainActivity 라는 정보만 남아 있어서 거의 쓸모가 없다.

 

navigatorObservers: [
	FirebaseAnalyticsObserver(analytics: analytics),
],

일단 MaterialApp에 navigatorObservers 옵션을 주면 대부분의 경우에 screen_view 이벤트가 기록되는데, 여전히 스크린 정보가 없거나 기록되지 않는 경우가 발생한다.

 

FirebaseAnalyticsObserver 소스를 보면 

String? defaultNameExtractor(RouteSettings settings) => settings.name;


void _sendScreenView(PageRoute<dynamic> route) {
    final String? screenName = nameExtractor(route.settings);
    if (screenName != null) {
      analytics.setCurrentScreen(screenName: screenName).catchError(
        (Object error) {
          final _onError = this._onError;
          if (_onError == null) {
            debugPrint('$FirebaseAnalyticsObserver: $error');
          } else {
            _onError(error as PlatformException);
          }
        },
        test: (Object error) => error is PlatformException,
      );
    }
}

이렇게 screen_view 이벤트를 전송하게 되어 있는데, 화면 이름으로 PageSettings.name 을 사용하게 되어 있고, 이 이름을 screen_view 이벤트의 firebase_screen parameter로 전송하고 있다.

 

즉, NamedRoute를 사용하거나 RouteSetting.name을 수동으로 설정해줘야 필요한 스크린명이 analytics에 전송되는 것이다.

 

GetX를 사용하는 경우에는 Get.to() 에는 RouteSetting.name을 설정할 수 없기 때문에 Get.toNamed()를 사용해야 한다.

 

NamedRoute를 사용할 수 없는 경우에는 

analytics.setCurrentScreen(screenName: screenName)

를 직접 호출해줘도 되겠다. 기본적으로 불리는 screen_view 이벤트와 겹쳐서 screen_view count에 영향을 줄 수도 있으니 잘 확인하고 사용하자.