如何使用 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 很正常 - 处理如此大量的数据需要时间。
【讨论】:
你认为最好的地方是调用这个方法?在onStart
、onResume
或其他方法中? (在片段中)
我认为 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 上传其分析数据?