亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 課堂 > 小程序 > 正文

微信小程序數據統計和錯誤統計的實現方法

2020-03-21 15:53:18
字體:
來源:轉載
供稿:網友

某些情況下我們需要對小程序某些用戶的行為進行數據進行統計,比如統計某個頁面的UV, PV等,統計某個功能的使用情況等。好讓產品對于產品的整個功能有所了解。 在網頁里,我們很多人都用過谷歌統計,小程序里也有一些第三方數據統計的庫, 比如騰訊的MTA等等。 但是,第三方的數據統計庫要么功能太簡單,滿足不了需求,要么就是要收費。(留下了貧窮的淚水。) 等等,又不是你出錢,怕啥? 貴一點就貴一點呀。

嗯,說的沒錯。但是,公司團隊內部想實現一套完整的自己的數據統計系統以滿足自己的需求。所以,還是沒有用第三方的。

所以,具體要統計些啥?

產品經理

  • 想知道用戶都是怎么進入我們的小程序的?
  • 用戶在我們小程序里那個頁面停留的時間最長?平均用戶停留時間是多少?
  • 想知道我們最近開發的那個功能用的人多不多?
  • 想統計小程序里的一些按鈕有多少用戶點擊了

開發自己

  • 總是很難復現用戶端出現的bug,
  • 要是可以知道用戶端發生錯誤時,知道用戶當時的用的手機型號,微信版本,網絡環境,頁面參數,和錯誤信息就好了
  • 想知道我們小程序啟動時間是多少?
  • 接口在用戶端的平均響應時間是多少ms? 哪些接口報錯了

針對產品經理的需求,我們可以知道,Ta想要的是就是數據統計要實現的功能。對于開發來說,我們關注的更多就是錯誤統小程序性能這塊的東西。

好,到這里,我們需求是明白了。就是要實現一套既能統計普通的埋點數據,也要能統計到小程序里一些特殊觸發的事件,比如appLaunch, appHide 等,還要可以統計錯誤。

好,那先來看看如何實現產品的需求吧

用戶進入小程序可以在 小程序 onLaunch 回調里拿到參數 的scene 值,這樣就可以知道用戶是怎么進入小程序的了。小case, 難不到我。

嗯,第一個需求實現了,那如何統計第二個呢?如何統計某個頁面的停留時間呢?

這也難不倒我,用戶在進入頁面時會觸發onShow 事件, 同樣,在離開頁面(或者切后臺時)會觸發onHide事件,我只需要在onShow里記錄一下時間,同時在onHide 里也記錄一下時間,把兩個時間一減就可以了。

Page({    data: {    beginTime: 0,    endTime: 0    },    onShow: function() {     // Do something when page show.     this.setData({      beginTime: new Date().getTime()     })    },    onHide: function() {     // Do something when page hide.     let stayTime = new Date().getTime() - this.beginTime;     // 這個就是用戶在這個頁面的停留時間了    },  })

等等,這樣確實實現了需求,萬一產品要統計所有也面的停留時長? 那我們豈不要在每一個頁面都這樣寫一遍?有沒有更好的方法呢?

好,接下來就是數據統計實現的要點了,即攔截微信原生事件,這樣可以在某個特殊事件觸發時,做一些我們統計的事情。同時,還要攔截微信發生網絡請求的方法,這樣可以拿到網絡請求相關的數據,最后,為了能統計到錯誤,還需要攔截微信發生錯誤的方法。

1.特殊事件的監聽

App(Object object)

注冊小程序。接受一個 Object 參數,其指定小程序的生命周期回調等。

App() 必須在 app.js 中調用,必須調用且只能調用一次。不然會出現無法預期的后果。

  • 攔截全局的事件:
  • 下面是小程序官方文檔對于App 注冊方法的文檔:
App({ onLaunch (options) {  // Do something initial when launch. }, onShow (options) {  // Do something when show. }, onHide () {  // Do something when hide. }, onError (msg) {  console.log(msg) }, globalData: 'I am global data'}) 

假如我們要在小程序onLaunch 時打印一句hello Word,我們有哪些方法實現?

方法1:

直接寫在onLaunch方法里

onLaunch (options) {   console.log('hello World') }

方法2:

使用 monkey patch方法 猴子補丁(monkey patch)

猴子補丁主要有以下幾個用處:

  1. 在運行時替換方法、屬性等
  2. 在不修改第三方代碼的情況下增加原來不支持的功能
  3. 在運行時為內存中的對象增加patch而不是在磁盤的源代碼中增加

舉個栗子,假如我們在console.log 方法里都先打印出當前的時間戳,我們可以這樣:

var oldLog = console.logconsole.log = function() { oldLog.call(this, new Date().getTime()) oldLog.apply(this, arguments)}

同理,我們針對onLaunch 進行猴子補丁

var oldAp = AppApp = function(options) { var oldOnLaunch = options.onLaunch options['onLaunch'] = function(t) {  // 做一些我們自己想做的事情  console.log('hello word....')  // 調用原來的onLaunch 方法  oldOnLaunch.call(this, t) }  // 調用原來的App 方法 oldApp(options)  // 想像一下,小程序內部調用onLaunch 方法應該是這樣子的: options.onLaunch(params)}// 問題,有的時候,我們可能沒有注冊某一個事件,比如頁面的onShow, 所有,我們在替換的時候還需要判斷一下參數是否傳了對應的方法Page({ onLoad (options) {}, onHide (options) {}})// 針對這種情況,我們需要這樣寫var oldPage = PagePage = function(options) { if (options['onShow']) {  // 如過有注冊onShow 這個回調  var oldOnShow = options.onShow  // onShow 方法調用時都是 傳了一個對象  options['onShow'] = function(t) {   // doSomething()   oldOnShow.call(this, t)  } } // 調用原來的Page 方法。 oldPage.apply(null, [].slice.call(arguments)) // 注意: 下面這兩種寫都會報錯: VM23356:1 Options is not object: {"0":{}} in pages/Badge.js 問題具體原因暫時未找到。 // oldPage.call(null, arguments) // oldPage(arguments)}

通過上面的方法,我們可以攔截了 App 方法注冊的一些全局方法,比如 onLaunch , onShow, onHide, 和Page 注冊的事件如 onShow, onHide, onLoad, onPullDownRefresh, 等頁面注冊事件。

2.網絡請求的監聽

思路: 攔截微信的請求事件。

let Request = {   request: function (e) {    let success = e[0].success,     fail = e[0].fail,     beginTime = smaUtils.getTime(),     endTime = 0    // 攔截請求成功方法    e[0].success = function () {     endTime = smaUtils.getTime()     const performance = {      type: constMap.performance,      event: eventMap.wxRequest,      url: e[0].url,      status: arguments[0].statusCode,      begin: beginTime,      end: endTime,      total: endTime - beginTime     }     smaUtils.logInfo('success performance:', performance)     // 這里做上報的事情     // SMA.performanceReport(performance)     success && success.apply(this, [].slice.call(arguments))    }    // 攔截請求失敗方法    e[0].fail = function () {     endTime = smaUtils.getTime()     const performance = {      type: constMap.performance,      event: eventMap.wxRequest,      url: e[0].url,      status: arguments[0].statusCode,      begin: beginTime,      end: endTime,      total: endTime - beginTime     }     smaUtils.logInfo('fail performance:', performance)     // 這里做上報的事情     // SMA.performanceReport(performance)     fail && fail.apply(this, [].slice.call(arguments))    }   },  }    // 替換微信相關屬性  let oldWx = wx,   newWx = {}  for (var p in wx) {   if (Request[p]) {    let p2 = p.toString()    newWx[p2] = function () {     Request[p2](arguments)     // 調用原來的wx.request 方法     oldWx[p2].apply(oldWx, [].slice.call(arguments))    }   } else {    newWx[p] = oldWx[p]   }  }  // eslint-disable-next-line  wx = newWx

疑惑:為什么要使用替換整個wx對象的方法呢? 不直接用我們的request 方法 替換 wx.request 方法

var oldRequest = wx.requestwx.request = function(e) { // doSomething(); console.log('請求攔截操作...') oldRequest.call(this, e); // 調用老的request方法}// 結果報錯了:// TypeError: Cannot set property request of [object Object] which has only a getter

3.錯誤的監聽

3.1 攔截App里注冊的 onError事件

var oldAp = AppApp = function(options) { var oldOnError = options.onErrr options['onErrr'] = function(t) {  // 做一些我們自己想做的事情  console.log('統計錯誤....', t)  // 調用原來的onLaunch 方法  oldOnError.call(this, t) }  // 調用原來的App 方法 oldApp(options)}

3.2 攔截 conole.error

console.error = function() {   var e = [].slice.call(arguments)   if (!e.length) { return true }   const currRoute = smaUtils.getPagePath()   // 統計錯誤事件   // SMA.errorReport({event: eventMap.onError, route: currRoute, errrMsg: arguments[0]})   smaUtils.logInfo('捕捉到error 事件,', e)   oldError.apply(console, e) }

至此,我們已經有能力在小程序發起請求時,發生錯誤時,生命周期或者特殊函數回調時,我們都能在里面做一些我們想要的數據統計功能了。

說了這么多大家估計也看累了。鑒于篇幅,具體的代碼就不在這里貼了。

最終實現的數據統計模塊大致實現了以下功能:

  • 普通埋點信息上報功能
  • 錯誤信息上報功能
  • 性能數據上報功能
  • 具體的上報時機支持配置
  • 支持指定網絡環境上報
  • 支持統計數據緩存到微信本地功能

整個統計代碼的配置文件如下:

const wxaConfig = { project: 'myMiniProgram', // 項目名稱 trackUrl: 'https://youhost.com/batch', // 后臺數據統計接口 errorUrl: 'https://youhost.com/batch', // 后臺錯誤上報接口 performanceUrl: 'https://youhost.com/batch', // 后臺性能上報接口 version: '0.1', prefix: '_wxa_', priority: ['track', 'performance', 'error'], // 發送請求的優先級,發送時,會依次發送 useStorage: true, // 是否開啟storage緩存 debug: false, // 是否開啟調試(顯示log) autoTrack: true, // 自動上報 onShow, onHide, 分享等 內置事件 errorReport: false, // 是否開啟錯誤上報 performanceReport: false, // 接口性能上報 maxReportNum: 20, // 當次上報最大條數 intervalTime: 15, // 定時上報的時間間隔,單位 s, 僅當開啟了定時上報有效。 networkList: ['wifi', '4g', '3g'], // 允許上報的網絡環境 opportunity: 'pageHide' // pageHide、appHide、realTime(實時上報)、timing(定時上報) 上報的時機,四選一}export default wxaConfig

具體上報時,上報的數據結構大致長這樣:

微信小程序,數據統計,錯誤統計

項目已傳到GitHub -> GitHub傳送門-wxa

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕成人精品久久不卡| 中文欧美在线视频| 久久久久久久国产精品视频| 亚洲精品xxx| 欧美性极品少妇精品网站| 国产一区二区在线播放| 美女av一区二区三区| 精品国偷自产在线| 91久久国产精品91久久性色| 国产精品中文字幕在线| 亚洲黄色有码视频| 欧美日韩国产在线| 日韩在线观看免费av| 国产成人一区二区三区| 久久久久久高潮国产精品视| 欧美巨乳美女视频| 欧美精品少妇videofree| 成人精品视频99在线观看免费| 97超级碰碰人国产在线观看| 97精品在线视频| 精品久久久久久中文字幕一区奶水| 日韩精品中文字幕视频在线| 精品亚洲一区二区| 久久久国产影院| 九九热这里只有在线精品视| 亚洲伊人久久大香线蕉av| 亚洲欧美激情精品一区二区| 久久久久久尹人网香蕉| 精品国内亚洲在观看18黄| 亚洲精品美女在线| 精品视频9999| 精品在线观看国产| 久久久精品久久久| 亚洲成人在线网| 欧美成人激情视频免费观看| 亚洲欧洲国产精品| 亚洲福利视频二区| 欧美影院在线播放| yw.139尤物在线精品视频| 91免费综合在线| 欧美午夜女人视频在线| 国产精品免费久久久久久| 亚洲国产成人久久综合一区| 国产成人精品免费久久久久| 91在线观看免费观看| 亚洲乱码一区av黑人高潮| 亚洲精品99久久久久中文字幕| 色噜噜狠狠色综合网图区| 欧美午夜视频在线观看| 日韩中文字幕视频在线观看| 国产精品av在线| www.日韩不卡电影av| 国产精品高潮呻吟久久av无限| 国产精品对白刺激| 91精品在线一区| 欧美激情免费观看| 日韩中文在线不卡| 日本高清久久天堂| 国产又爽又黄的激情精品视频| 日韩免费观看在线观看| 精品国产电影一区| 社区色欧美激情 | 中文字幕亚洲欧美| 精品性高朝久久久久久久| 亚洲成人精品视频| 综合国产在线视频| 国产精品尤物福利片在线观看| 欧美成人性生活| 欧美成人午夜激情在线| 欧美日韩国产二区| 久久99精品久久久久久琪琪| 91在线精品视频| 久久人人97超碰精品888| 亚洲电影第1页| 久久久久久久久国产精品| 日韩电视剧在线观看免费网站| 久久国产精品久久久久久| 欧美日本亚洲视频| 黄网站色欧美视频| 久久亚洲一区二区三区四区五区高| 亚洲精美色品网站| 亚洲精品国产精品自产a区红杏吧| 久久精品国产电影| 日韩欧美在线中文字幕| 亚洲小视频在线观看| 日韩色av导航| 欧美乱大交xxxxx另类电影| 国产精品偷伦免费视频观看的| 欧美性xxxxx极品| 国产亚洲福利一区| 亚州精品天堂中文字幕| 亚洲偷熟乱区亚洲香蕉av| 亚洲精品影视在线观看| 97超碰国产精品女人人人爽| 日本午夜精品理论片a级appf发布| 国产精品久久激情| 在线观看日韩欧美| 日韩高清电影好看的电视剧电影| 精品二区三区线观看| www.日本久久久久com.| 亚洲国产又黄又爽女人高潮的| 色七七影院综合| 日韩黄色在线免费观看| 日韩欧美极品在线观看| 亚洲国产成人精品女人久久久| 搡老女人一区二区三区视频tv| 成人www视频在线观看| 欧美不卡视频一区发布| 92看片淫黄大片看国产片| 亚洲风情亚aⅴ在线发布| 成人激情视频在线观看| 九九热在线精品视频| 亚洲xxxxx性| 久久精品人人做人人爽| 久久久91精品国产一区不卡| 欧美黑人一区二区三区| 久久高清视频免费| 日韩在线视频观看| 欧美激情图片区| 国内精品伊人久久| 欧美另类极品videosbest最新版本| 亚洲www永久成人夜色| 亚洲人成网站色ww在线| 国产精品美女久久久久av超清| 亚洲剧情一区二区| 色综合伊人色综合网站| 88国产精品欧美一区二区三区| 久久福利网址导航| 国产精品尤物福利片在线观看| 懂色aⅴ精品一区二区三区蜜月| 不卡在线观看电视剧完整版| 国产精品丝袜白浆摸在线| 亚洲人成在线观看网站高清| 色妞色视频一区二区三区四区| 日韩在线免费高清视频| 成人性生交xxxxx网站| 亚洲一区二区久久久久久久| 九九久久久久99精品| 国产aⅴ夜夜欢一区二区三区| 国产精品福利久久久| 亚洲国产欧美精品| 全色精品综合影院| 91亚洲精品久久久| 在线亚洲午夜片av大片| 久久免费国产精品1| 成人在线视频网站| www.久久色.com| 一本久久综合亚洲鲁鲁| 性欧美视频videos6一9| 久久久久久12| 国产精品久久国产精品99gif| 亚洲奶大毛多的老太婆| 欧美日韩一区二区三区在线免费观看| 国产精品入口尤物| 91精品视频播放| 亚洲国产精久久久久久久| 亚州国产精品久久久| 亚洲精品日韩久久久| 亚洲国产成人精品久久久国产成人一区| 日韩欧美中文字幕在线播放| 日韩高清电影免费观看完整版| 日韩欧美一区二区在线| 成人免费视频网址| 亚洲欧洲自拍偷拍|