为什么埋点?
在鸿蒙(HarmonyOS)开发中,埋点(也称为事件追踪或数据收集)是一个非常重要的环节,它用于收集用户行为、系统状态等信息,以便进行数据分析、优化产品体验或实现其他业务目标。为了简化埋点操作,通常会进行埋点封装,使得开发者可以更方便地记录所需的数据。
如何进行埋点? 接下来我就一个埋点题目详情的案例进行讲解
先封装一个数据埋点类
class TrackingService {
// 数据埋点数据结构
timeItem: iTimeItem = {
endTime: 0,
questionId: '0',
startTime: 0
}
// time:毫秒 专门用来设置用户进入的时间
public async setStartTime(startTime: number) {
this.timeItem.startTime = startTime
}
// 专门用来设置用户进入的时间
public async setEndTime(endTime: number) {
this.timeItem.endTime = endTime
}
//用来设置上报的题目id
public async setquestionId(questionId:string){
this.timeItem.questionId = questionId
}
// 每满20条埋点数据,则推送到服务器并清空
public async save() {
await timeListStore.setTimeList(this.timeItem) // 加入首选项
timeListStore.getTimeList().then(res => {
console.log('mylog->TrackingService', JSON.stringify(res.timeList))
if (res.timeList.length >= 20) {
hdHttp.post<string>('time/tracking', { timeList: res.timeList } as iTimeList).then(ret => {
timeListStore.delTimeList()
promptAction.showToast({ message: '统计时长埋点上报成功' })
})
}
}, (err: BusinessError) => {
console.log('mylog->TrackingService err', JSON.stringify(err))
})
}
}
在我们进入页面的时候, 开始记录埋点信息
aboutToAppear(): void {
// 获取路由参数id的值
let params: ParamsType = router.getParams() as ParamsType
this.questionId = params.id
// 在进入页面时,设置要上报的题目id和当前时间
trackingService.setquestionId(params.id.toString())
trackingService.setStartTime(Date.now())
this.getData()
}
在我们离开页面的时候, 记录离开页面的信息, 并上传埋点数据给后台
async aboutToDisappear() {
try {
// 设置最后时间,并上报埋点数据
await trackingService.setEndTime(Date.now())
await trackingService.save()
} catch (err) {
console.log('mylog->QuestionDetailPage.ets aboutToDisappear err',JSON.stringify(err))
throw new Error(JSON.stringify(err))
}
}
在这里需要注意的两点
- 每次访问都将数据发送给服务器,将会因为很频繁的访问服务器而给服务器带来很大的访问压力,所以我们优化成了,每收集到20条数据才统一发送给服务器,当然这个数量是可以动态调整的.
- 我们也可以考虑把这些数据持久化到应用的首选项中,这样就算应用退出后再打开,也不会让数据丢失.