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

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

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

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

【问题讨论】:

    标签: android android-fragments firebase firebase-analytics


    【解决方案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 很正常 - 处理如此大量的数据需要时间。

      【讨论】:

      【解决方案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
      猜你喜欢
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 2022-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-01
      相关资源
      最近更新 更多