Android - Firebase Event 使用方法

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

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

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

Event 限制

  • 事件最多记录 500 种

创建 FirebaseAnalytics 实例

val firebaseAnalytics: FirebaseAnalytics by lazy { Firebase.analytics }

记录事件

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

下面为记录事件的两种方式,logEvent 方法第一个参数为 事件名,第二个参数为参数集合体,可以用 Bundle 表示,也可以用 Firebase 自带的函数也就是第一种方式。

firebaseAnalytics.logEvent("test_event") {
    param("time", "2022-6-26")
}
firebaseAnalytics.logEvent("test_event", Bundle().apply { 
    putString("time", "2022-6-26")
})

设置默认事件参数

设置的默认参数会跟随未来发生的所有事件,相当于设置了公共的事件参数。

firebaseAnalytics.setDefaultEventParameters(bundle)

清除默认参数,只需要设置为 null

firebaseAnalytics.setDefaultEventParameters(null)

设置用户属性

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

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

调试事件

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

adb shell setprop debug.firebase.analytics.app package_name

package_name 替换为包名

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

扫描二维码关注公众号,回复: 14323533 查看本文章

WX20220626-104518@2x.png

关闭调试:

adb shell setprop debug.firebase.analytics.app .none.

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

项目中使用 Event

定义工具类

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 中,(建议,但是如果未登录状态下,登录后需要再设置下公共参数,目的把登录相关公共参数赋值)
  • 登录后
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        Track.initTrack()
    }
}

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

设置 用户属性 时机

  • 登录后,或者是拥有用户属性信息后
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 时机

  • 登录后,或者是拥有用户属性信息后
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<Button>(R.id.btn_login).setOnClickListener {
            Track.logEvent(Track.Event.LOGIN_CLICK)
            // 登录成功
            Track.setUserProperty("name", "Dany")
            Track.setUserId("uid123456")
        }
    }
}

logEvent 时机

一般记录事件为动作发生和结束,比如点击登录按钮,登录成功和登录失败。 我比较强烈建议的,在接口请求失败或者报错后也上报 firebase 和 自己服务器后台日志,方便出问题时查找问题原因(减少斯比。毕竟日志铁证如山!!!)

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

限制

  • Event 最多 500 种

猜你喜欢

转载自juejin.im/post/7113375824635494408