Android - Firebase Event 使用方法

语言: CN / TW / HK

theme: juejin highlight: androidstudio


持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

上一篇文章 Android - 接入 Firebase Analytics 和 Crashlytics ,接入后需要学习 Event 如何使用

Event 可让您了解您的应用中发生了什么,例如用户操作、系统事件或错误。
Analytics 会自动为您记录一些事件,您无需为此添加任何代码。如果应用需要收集其他数据,您可以在其中记录多达 500 种不同的 Analytics 事件类型。应用可记录的事件总量不受限制。请注意,事件名称区分大小写。即便两个事件的名称只是大小写不同,系统也会将其视作两种不同的事件。

Event 限制

  • 事件最多记录 500 种

创建 FirebaseAnalytics 实例

kotlin val firebaseAnalytics: FirebaseAnalytics by lazy { Firebase.analytics }

记录事件

Analytics SDK 定义了许多常见于各类型应用(零售、电子商务、差旅以及游戏应用等)的推荐事件。如需详细了解这些事件及其适用情形,请参阅推荐事件

下面为记录事件的两种方式,logEvent 方法第一个参数为 事件名,第二个参数为参数集合体,可以用 Bundle 表示,也可以用 Firebase 自带的函数也就是第一种方式。 kotlin firebaseAnalytics.logEvent("test_event") { param("time", "2022-6-26") } firebaseAnalytics.logEvent("test_event", Bundle().apply { putString("time", "2022-6-26") })

设置默认事件参数

设置的默认参数会跟随未来发生的所有事件,相当于设置了公共的事件参数。 kotlin firebaseAnalytics.setDefaultEventParameters(bundle) 清除默认参数,只需要设置为 null kotlin firebaseAnalytics.setDefaultEventParameters(null)

设置用户属性

Analytics 会自动记录一些用户属性,您无需为此添加任何代码。如果您需要收集其他数据,可以为每个项目设置各种用户属性,最多可达 25 种。请注意,用户属性名称区分大小写。即便您设置的两个用户属性只是名称的大小写不同,Analytics 也会将它们当成两个完全不同的用户属性来记录。

kotlin firebaseAnalytics.setUserProperty("country", "China")

调试事件

要在 Android 设备上启用 Analytics 调试模式,请执行以下命令:

kotlin adb shell setprop debug.firebase.analytics.app package_name package_name 替换为包名

科学上网哈!!! 在 firebase 后台中 分析 下的 DebugView 中选择你的调试设备,在时间线上可以看到大约1分钟左右延迟的事件信息。算是非常好用。

WX20220626-104518@2x.png

关闭调试: kotlin adb shell setprop debug.firebase.analytics.app .none.

以上为 Event 一个大概的使用方法,下面分享下我在开发中是如何使用 Firebase Event

项目中使用 Event

定义工具类

``` kotlin object Track { // 创建 FirebaseAnalytics 对象 private val firebaseAnalytics: FirebaseAnalytics by lazy { Firebase.analytics }

// 做一个监听,可以在上报事件到 firebase 时,也上报到自己服务器
private var trackListener: TrackListener? = null
fun setTrackListener(trackListener: TrackListener) {
    Track.trackListener = trackListener
}

// 初始化 firebase 信息,只设置了默认参数,默认参数值为设备信息
fun initTrack(user_id: String = "") {
    val channel = BuildConfig.BUILD_TYPE
    val country = LanguageUtils.getSystemLanguage().country
    val language = LanguageUtils.getSystemLanguage().language
    val deviceId = DeviceUtils.getAndroidID()
    val oSVersion = DeviceUtils.getSDKVersionName()
    val oSModel = DeviceUtils.getModel()
    val abi = DeviceUtils.getABIs().joinToString(";")
    val timeZone = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        TimeZone.getDefault().id + ""
    } else ""
    val network = NetworkUtils.getNetworkType().name
    val carrierName = EncodeUtils.urlEncode(NetworkUtils.getNetworkOperatorName(), "UTF-8").toString()
    val deviceInfo = "$channel,$country,$language,$deviceId,$oSVersion,$oSModel,$abi,$timeZone,$network,$carrierName"
    Track.setDefaultEventParameters(Bundle().apply {
        putString(Track.DefaultParam.DEVICE_INFO, deviceInfo)
        if (user_id.isNotEmpty()) {
            putString(Track.Param.USER_ID, user_id)
        }
    })
}

fun logEvent(event: String) {
    logEvent(event, null)
}

// 最终会调用 logEvent,上报 Firebase 和 自己的监听事件
fun logEvent(event: String, bundle: Bundle? = null) {
    if (BuildConfig.DEBUG)
        Log.d("TrackFA", "event = $event, bundle = $bundle")
    trackListener?.track(event, bundle)
    firebaseAnalytics.logEvent(event, bundle)
}

// 设置用户 id
fun setUserId(userId: String) {
    firebaseAnalytics.setUserId(userId)
}

// 设置用户属性
fun setUserProperty(name: String?, value: String?) {
    name ?: return
    if (name.isEmpty()) return
    firebaseAnalytics.setUserProperty(name, value)
}

// 设置事件的默认参数
fun setDefaultEventParameters(bundle: Bundle) {
    firebaseAnalytics.setDefaultEventParameters(bundle)
}

// 所有业务事件定义
object Event {
    const val LOGIN_CLICK = "login_click" // 登陆页点击登录
}

// 所有开发事件定义 由开发者定义,但是要考虑 500 种事件限制!!!
object DevEvent {
    const val DEV_HTTP_RESP = "dev_http_resp" //http请求结果 异常
}

// 所有时间参数的 名称
object Param {
    const val USER_ID = "user_id"
    const val PHONE = "phone"
}

// 所有默认参数的 名称
object DefaultParam {
    const val DEVICE_INFO = "device_info" // Channel,Country,Language,DeviceId,OSVersion,OSModel,TimeZone,Network,CarrierName
}

// 所有需要记录用户属性名称
object UserProperty {
    const val USER_ID = "user_id"
    const val AGE = "age"
    const val BIRTHDAY = "birthday"
    const val COUNTRY_NAME = "country_name"
    const val GENDER = "gender"
}

interface TrackListener {
    fun track(event: String, bundle: Bundle?)
}

} ```

初始设置 Firebase 公共参数时机

  • Application 中,(建议,但是如果未登录状态下,登录后需要再设置下公共参数,目的把登录相关公共参数赋值)
  • 登录后

``` kotlin class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)

    Track.initTrack()
}

} ``` 这里是 demo 所以随意在 Activity 中设置了。

设置 用户属性 时机

  • 登录后,或者是拥有用户属性信息后

``` kotlin class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)

    Track.initTrack()

    findViewById<Button>(R.id.btn_login).setOnClickListener {
        Track.logEvent(Track.Event.LOGIN_CLICK)
        // 登录成功
        Track.setUserProperty("name", "Dany")
    }
}

} ```

setUserId 时机

  • 登录后,或者是拥有用户属性信息后 ``` kotlin class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)
    Track.initTrack()
    
    findViewById<Button>(R.id.btn_login).setOnClickListener {
        Track.logEvent(Track.Event.LOGIN_CLICK)
        // 登录成功
        Track.setUserProperty("name", "Dany")
        Track.setUserId("uid123456")
    }
    

    } } ```

    setTrackListener 时机

    • 记录事件之前 避免丢失事件 ``` class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main)

      Track.initTrack()

      Track.setTrackListener(object : Track.TrackListener { override fun track(event: String, bundle: Bundle?) { // 上报服务器 } })

      findViewById

初次接入后,使用 logEvent,Firebase 后台中不会立马收集到 首次上报的 Event,需要在24小时左右之后再来看才会显示在 Event 列表中!!!

限制

  • Event 最多 500 种