如何使用 Firebase 分析跟踪 android 片段

Posted

技术标签:

【中文标题】如何使用 Firebase 分析跟踪 android 片段【英文标题】:How to track android fragments using firebase analytics 【发布时间】:2017-12-25 08:41:12 【问题描述】:

在我的 android 应用程序中,我有一个 Activity,它有 3 或 4 个片段,可以根据一些用户或服务器事件按顺序附加。

我想在 firebase 中将所有这些片段作为屏幕进行跟踪。

所以理想情况下,如果可能的话,我可以在片段的 onCreate 中调用 API,并告诉 firebase 用户当前位于片段 1、片段 2 或片段 3 中吗?

【问题讨论】:

【参考方案1】:

由于setCurrentScreen弃用,您可以改用firebaseAnalytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW, bundle)

有一篇博文 here 解释了有关手动跟踪屏幕的更多信息。

这是一个例子:

private fun setCurrentScreen(screenName: String) = firebaseAnalytics?.run 
    val bundle = Bundle()
    bundle.putString(FirebaseAnalytics.Param.SCREEN_NAME, screenName)
    bundle.putString(FirebaseAnalytics.Param.SCREEN_CLASS, this@BaseFragment.javaClass.simpleName)
    logEvent(FirebaseAnalytics.Event.SCREEN_VIEW, bundle)

此外,如果您想自动跟踪屏幕,您可以在BaseFragment 生命周期方法之一中调用此函数,例如onResume。请记住,某些片段可能不必更改当前屏幕,例如在ViewPager 中创建的片段,因此我声明了一个open val,您可以使用override 来更改默认行为。

这是BaseFragment中的代码:

protected open val trackScreenView: Boolean = true

override fun onResume() 
    super.onResume()

    if (trackScreenView) setCurrentScreen(this.javaClass.simpleName)

您可以通过在目标Fragment 中覆盖它来禁用它:

override val trackScreenView: Boolean = false

顺便说一句,如果你使用NavigationUI组件,目前还没有自动跟踪屏幕的解决方案,它只跟踪你拥有的单个活动,所以你可以通过把这个meta-data来防止firebase自动屏幕报告在您的应用清单中:

<application
    android:name=".App"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">
    
    <!-- .... -->
    
    <meta-data
        android:name="google_analytics_automatic_screen_reporting_enabled"
        android:value="false" />
</application>

【讨论】:

【参考方案2】:

对于使用NavigationUI的项目,您可以使用监听器NavController.OnDestinationChangedListener

内部onCreate()

override fun onCreate() 
      super.onCreate()
      .
      .
      .
      .
      navController = Navigation.findNavController(context!!, R.id.nav_host_fragment)
      navController?.addOnDestinationChangedListener(listener)

在 3 个监听函数参数中,

controller 可用于获取类名 destination 可用于通过属性android:label 在 nav_host_fragment 中获取目标的布局 xml 名称字符串
private val listener = NavController.OnDestinationChangedListener  controller, destination, arguments ->
      
      val bundle = Bundle()
      val currentFragmentClassName = (controller.currentDestination as FragmentNavigator.Destination).className
      bundle.putString(FirebaseAnalytics.Param.SCREEN_NAME, destination.label.toString())
      bundle.putString(FirebaseAnalytics.Param.SCREEN_CLASS, currentFragmentClassName)
      FirebaseAnalytics.getInstance(requireContext()).logEvent(FirebaseAnalytics.Event.SCREEN_VIEW, bundle)
      

别忘了清理

override fun onDestroy() 
      super.onDestroy()
      navController?.removeOnDestinationChangedListener(listener)

【讨论】:

好方法,这是一种非常干净的方法!【参考方案3】:

更新

由于setCurrentScreen已被弃用,您可以使用logEvent方法

Bundle bundle = new Bundle();
bundle.putString(FirebaseAnalytics.Param.SCREEN_NAME, fragment.getClass().getSimpleName());
bundle.putString(FirebaseAnalytics.Param.SCREEN_CLASS, fragment.getClass().getSimpleName());
mFirebaseAnalytics.logEvent(FirebaseAnalytics.Event.SCREEN_VIEW, bundle);

我使用以下 adb 命令检查是否一切正常。

adb shell setprop log.tag.FA VERBOSE
adb shell setprop log.tag.FA-SVC VERBOSE
adb logcat -v time -s FA FA-SVC

执行此操作后,您将在 logcat 中看到 screen_view 事件。喜欢这个:

10-15 13:14:13.744 V/FA-SVC (20323):记录事件: origin=app,name=screen_view(_vs),params=Bundle[ga_event_origin(_o)=app, 参与时间_毫秒(_et)=31600, ga_previous_class(_pc)=内容片段, ga_previous_id(_pi)=8077407744361472421, ga_previous_screen(_pn)=内容片段, ga_screen_class(_sc)=TestFragment, ga_screen_id(_si)=8077407744361472423, ga_screen(_sn)=TestFragment]

上一个答案

有一种特殊的方法可以设置当前屏幕-setCurrentScreen

我是这样使用的

mFirebaseAnalytics.setCurrentScreen(this, fragment.getClass().getSimpleName(), fragment.getClass().getSimpleName());

调用该方法后,LogCat 中会出现以下消息

记录事件 (FE): screen_view(_vs), 捆绑[firebase_event_origin(_o)=auto, firebase_previous_class(_pc)=HomeFragment, firebase_previous_id(_pi)=4121566113087629222, firebase_previous_screen(_pn)=HomeFragment, firebase_screen_class(_sc)=StatisticsFragment, firebase_screen_id(_si)=4121566113087629223, firebase_screen(_sn)=StatisticsFragment]

自动活动跟踪中出现以下事件:

记录事件 (FE): screen_view(_vs), 捆绑[firebase_event_origin(_o)=auto, firebase_previous_class(_pc)=StatisticsFragment, firebase_previous_id(_pi)=4121566113087629223, firebase_previous_screen(_pn)=StatisticsFragment, firebase_screen_class(_sc)=登录活动, firebase_screen_id(_si)=4121566113087629224]

如您所见,它们几乎相同,因此 setCurrentScreen 正在工作。

我只能在第二天在 Firebase 控制台中看到这些课程。 Firebase 很正常 - 处理如此大量的数据需要时间。

【讨论】:

你认为最好的地方是调用这个方法?在onStartonResume 或其他方法中? (在片段中) 我认为 onResume 是最好的选择。当您从另一个片段返回片段时调用它。 您可以在 60 秒内跟踪它:firebase.google.com/docs/analytics/debugviewsupport.google.com/firebase/answer/… 必须在 UI 线程上调用:***.com/a/48117692/1177083 setCurrentScreen 已弃用 :(【参考方案4】:

在此处为 Artem Mostyaev 答案添加更多见解。 GA/Firebase 面板在 DEV 版本中反映了类名,但在 PROD 版本中没有。这里的罪魁祸首是

fragment.getClass().getSimpleName()

混淆了 prod 中的片段名称。所以 GA/Firebase 显示类名类似于 (a,b,ah, etc)

getSimpleName() 在其他情况下使用也很危险。

更多文献:https://medium.com/@elye.project/the-danger-of-using-class-getsimplename-as-tag-for-fragment-5cdf3a35bfe2

Progaurd 规则

-keepnames class com.somepackage.yourclass 

【讨论】:

或者你可以对所有片段使用这个proguard规则-keepnames class * extends androidx.fragment.app.Fragment

以上是关于如何使用 Firebase 分析跟踪 android 片段的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ionic v1 中跟踪 Firebase 分析中的事件

如何在 Play Store 上的 React Native 应用程序中使用 Firebase Analytics 上传其分析数据?

Google Analytics for Firebase:如何分析事件 [关闭]

Firebase 不跟踪动态链接的点击次数

Firebase IOS UTM 安装跟踪

在 Firebase 中禁用自动活动跟踪