Android - Firebase Event 使用方法
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分鐘左右延遲的事件資訊。算是非常好用。
關閉除錯:
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 種