小程序統(tǒng)計(jì)來(lái)源信息的方案與具體代碼
背景
從用戶認(rèn)知的角度看,廣義的小程序啟動(dòng)可以分為兩種情況,一種是冷啟動(dòng),一種是熱啟動(dòng)。
- 冷啟動(dòng):如果用戶首次打開(kāi),或小程序銷(xiāo)毀后被用戶再次打開(kāi),此時(shí)小程序需要重新加載啟動(dòng),即冷啟動(dòng)。
- 熱啟動(dòng):如果用戶已經(jīng)打開(kāi)過(guò)某小程序,然后在一定時(shí)間內(nèi)再次打開(kāi)該小程序,此時(shí)小程序并未被銷(xiāo)毀,只是從后臺(tái)狀態(tài)進(jìn)入前臺(tái)狀態(tài),這個(gè)過(guò)程就是熱啟動(dòng)。
統(tǒng)計(jì)小程序來(lái)源信息并不容易,為什么?
- 小程序初次啟動(dòng)時(shí),會(huì)調(diào)用App的onLaunch生命周期。里面有來(lái)源信息。
- 小程序有熱啟動(dòng)和冷啟動(dòng)機(jī)制。冷啟動(dòng)時(shí),并不會(huì)調(diào)用onLaunch這一生命周期,所以不能依賴onLoad做來(lái)源統(tǒng)計(jì)。
- 小程序每個(gè)頁(yè)面都有onLoad生命周期,但是無(wú)論內(nèi)部跳轉(zhuǎn)、還是外部跳轉(zhuǎn),都會(huì)執(zhí)行這一生命周期,我們無(wú)法區(qū)分,所以不能依賴onLoad做來(lái)源統(tǒng)計(jì)。
這樣看,統(tǒng)計(jì)來(lái)源似乎是不可能的事情。
但是,如果你閱讀過(guò)這篇文章《如何全局重寫(xiě)小程序 Page函數(shù) wx對(duì)象?》和這篇文章《小程序安全指南:如何禁止外部直接跳轉(zhuǎn)到小程序某頁(yè)面》,也許你能自己想到最佳方案。
方案
區(qū)分「內(nèi)部跳轉(zhuǎn)」還是「外部跳轉(zhuǎn)」
先用一種方式,區(qū)分「內(nèi)部跳轉(zhuǎn)」還是「外部跳轉(zhuǎn)」。
具體方案:全局改寫(xiě)內(nèi)部跳轉(zhuǎn)API(wx.redirectTo、wx.navigateTo),每次內(nèi)部跳轉(zhuǎn)時(shí),都帶個(gè)特殊參數(shù),在onLoad中,判斷有沒(méi)有這個(gè)特殊參數(shù),就知道是來(lái)自內(nèi)部還是外部了。
來(lái)源信息如何獲得?
- 通過(guò)wx.getLaunchOptionsSync可以獲得。
- 可以在App.onShow時(shí)獲得。但這種方式需要把來(lái)源信息先保存到某個(gè)全局變量中(如app.globalData.xxx),才能方便的使用。
主要來(lái)源信息有什么?
- scene場(chǎng)景值,這是小程序官方定義的來(lái)源場(chǎng)景,還是比較全面的。參考場(chǎng)景值列表,場(chǎng)景值指南。
- referrerInfo.appId。來(lái)源的公眾號(hào)APPID或者小程序APPID。
在onLoad中統(tǒng)計(jì)來(lái)源
在每個(gè)頁(yè)面onLoad時(shí),如果沒(méi)有特殊參數(shù),就上報(bào)來(lái)源信息。
但是不能傻乎乎的給所有頁(yè)面都手動(dòng)加這些上報(bào)邏輯,我們要用《如何全局重寫(xiě)小程序 Page函數(shù) wx對(duì)象?》的方法,一次性給所有頁(yè)面加上。
具體代碼
全局修改跳轉(zhuǎn)API增加特殊參數(shù)
function addFromInner(url) {
const app = getApp();
const symbol = url.includes('?') ? '&' : '?';
return `${url}${symbol}fromInner=1`;
}
export function redirectToProxy(redirectTo) {
return function (object) {
return redirectTo({
...object,
url: addFromInner(object.url),
});
};
}
function wxProxy(wx) {
const newWx = { ...wx };
newWx.navigateTo = redirectToProxy(wx.navigateTo);
newWx.redirectTo = redirectToProxy(wx.redirectTo);
return newWx;
}
wx = wxProxy(wx);全局修改onLoad自動(dòng)上報(bào)外部跳轉(zhuǎn)
function onLoadProxy(onLoad) {
return function (options) {
// 如果沒(méi)有參數(shù)fromInner,表明是外部跳轉(zhuǎn)來(lái)的,就上報(bào)一次來(lái)源
if (!options.fromInner) {
const launchOptions = wx.getLaunchOptionsSync();
// 這里上報(bào)launchOptions
// 可以通過(guò)this.route 獲得當(dāng)前頁(yè)面的路由信息,一并上報(bào)
}
if (onLoad) {
return onLoad.call(this, options);
}
};
}
const PageProxy = (Page) => function (options) {
const newOptions = {
...options,
onLoad: onLoadProxy(options.onLoad),
};
Page(newOptions);
};
Page = PageProxy(Page);總結(jié)
到此這篇關(guān)于小程序統(tǒng)計(jì)來(lái)源信息的方案與具體代碼的文章就介紹到這了,更多相關(guān)小程序統(tǒng)計(jì)來(lái)源信息內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript實(shí)現(xiàn)多個(gè)重疊層點(diǎn)擊切換效果的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)多個(gè)重疊層點(diǎn)擊切換效果的方法,實(shí)例分析了javascript實(shí)現(xiàn)點(diǎn)擊切換效果的相關(guān)技巧,需要的朋友可以參考下2015-04-04
JavaScript前端面試扁平數(shù)據(jù)轉(zhuǎn)tree與tree數(shù)據(jù)扁平化
這篇文章主要為大家介紹了JavaScript面試中扁平數(shù)據(jù)轉(zhuǎn)tree以及tree數(shù)據(jù)扁平化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
JS實(shí)現(xiàn)1000以內(nèi)被3或5整除的數(shù)字之和
今天在技術(shù)群里看到一道這樣的提:求1000以內(nèi)被3或5整除的數(shù)字之和。小編把我的解決辦法分享到腳本之家平臺(tái),供大家參考2016-02-02
IE6/7/8中Option元素未設(shè)value時(shí)Select將獲取空字符串
可以看到當(dāng)忘記寫(xiě)option的value時(shí)這些現(xiàn)代瀏覽器都會(huì)盡量返回正確的(客戶端程序員想要的)結(jié)果value,其容錯(cuò)性比IE6/7/8做的更好。2011-04-04
前端錯(cuò)誤日志上報(bào)的超詳細(xì)解決方案
這篇文章主要介紹了如何使用Node.js搭建一個(gè)簡(jiǎn)單的錯(cuò)誤監(jiān)控平臺(tái),用于收集和上報(bào)Vue.js項(xiàng)目的運(yùn)行錯(cuò)誤,文中通過(guò)代碼以及圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-11-11
js實(shí)現(xiàn)轉(zhuǎn)盤(pán)抽獎(jiǎng)功能
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)轉(zhuǎn)盤(pán)抽獎(jiǎng)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
在JavaScript中構(gòu)建ArrayList示例代碼
這篇文章主要介紹了在JavaScript中構(gòu)建ArrayList,很實(shí)用,需要的朋友可以參考下2014-09-09
uniapp手寫(xiě)滾動(dòng)選擇器的完整代碼(時(shí)間選擇器)
這篇文章主要介紹了uniapp手寫(xiě)滾動(dòng)選擇器的完整代碼(時(shí)間選擇器),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2024-07-07

