提交 04c80c95 编写于 作者: M mehaotian

fix(uni-stat): 修复应用进入后台找不到 $page 的 bug

上级 d29aafef
......@@ -736,13 +736,16 @@ class Report {
* @param {Object} self
* @param {Object} type
*/
applicationHide(self, type) {
applicationHide(self, type) {
if(!self){
// 表示应用切换到后台 ,此时需要从页面栈获取页面实例
self = get_page_vm();
}
// 进入应用后台保存状态,方便进入前台后判断是否上报应用数据
this.__licationHide = true;
get_last_time();
const time = get_residence_time();
const route = get_page_route(self);
// this._lastPageRoute = route
uni.setStorageSync('_STAT_LAST_PAGE_ROUTE', route);
this.sendHideRequest({
urlref: route,
......@@ -1116,14 +1119,14 @@ class Stat extends Report {
// #ifdef VUE3
if (get_platform_name() !== 'h5' && get_platform_name() !== 'n') {
if (get_page_types(self) === 'app') {
this.appShow(self);
this.appShow();
}
}
// #endif
// #ifndef VUE3
if (get_page_types(self) === 'app') {
this.appShow(self);
this.appShow();
}
// #endif
......@@ -1138,14 +1141,14 @@ class Stat extends Report {
// #ifdef VUE3
if (get_platform_name() !== 'h5' && get_platform_name() !== 'n') {
if (get_page_types(self) === 'app') {
this.appHide(self);
this.appHide();
}
}
// #endif
// #ifndef VUE3
if (get_page_types(self) === 'app') {
this.appHide(self);
this.appHide();
}
// #endif
......@@ -1227,10 +1230,12 @@ const lifecycle = {
function main() {
// console.log('--- 统计开启')
if (process.env.NODE_ENV === 'development') {
uni.report = function(type, options) {};
} else {
{
console.log('uni统计开启,version:2');
}
// if (process.env.NODE_ENV === 'development') {
// uni.report = function(type, options) {}
// } else {
// #ifdef VUE3
uni.onCreateVueApp((app) => {
app.mixin(lifecycle);
......@@ -1238,7 +1243,7 @@ function main() {
stat.sendEvent(type, options);
};
});
if (get_platform_name() !== 'h5' && get_platform_name() !== 'n') {
uni.onAppHide(() => {
stat.appHide(get_page_vm());
......@@ -1248,15 +1253,15 @@ function main() {
});
}
// #endif
// #ifndef VUE3
const Vue = require('vue');
(Vue.default || Vue).mixin(lifecycle);
uni.report = function(type, options) {
stat.sendEvent(type, options);
stat.sendEvent(type, options);
};
// #endif
}
// }
}
main();
......@@ -734,13 +734,16 @@ class Report {
* @param {Object} self
* @param {Object} type
*/
applicationHide(self, type) {
applicationHide(self, type) {
if(!self){
// 表示应用切换到后台 ,此时需要从页面栈获取页面实例
self = get_page_vm();
}
// 进入应用后台保存状态,方便进入前台后判断是否上报应用数据
this.__licationHide = true;
get_last_time();
const time = get_residence_time();
const route = get_page_route(self);
// this._lastPageRoute = route
uni.setStorageSync('_STAT_LAST_PAGE_ROUTE', route);
this.sendHideRequest({
urlref: route,
......@@ -1114,14 +1117,14 @@ class Stat extends Report {
// #ifdef VUE3
if (get_platform_name() !== 'h5' && get_platform_name() !== 'n') {
if (get_page_types(self) === 'app') {
this.appShow(self);
this.appShow();
}
}
// #endif
// #ifndef VUE3
if (get_page_types(self) === 'app') {
this.appShow(self);
this.appShow();
}
// #endif
......@@ -1136,14 +1139,14 @@ class Stat extends Report {
// #ifdef VUE3
if (get_platform_name() !== 'h5' && get_platform_name() !== 'n') {
if (get_page_types(self) === 'app') {
this.appHide(self);
this.appHide();
}
}
// #endif
// #ifndef VUE3
if (get_page_types(self) === 'app') {
this.appHide(self);
this.appHide();
}
// #endif
......@@ -1225,10 +1228,12 @@ const lifecycle = {
function main() {
// console.log('--- 统计开启')
if (process.env.NODE_ENV === 'development') {
uni.report = function(type, options) {};
} else {
{
console.log('uni统计开启,version:2');
}
// if (process.env.NODE_ENV === 'development') {
// uni.report = function(type, options) {}
// } else {
// #ifdef VUE3
uni.onCreateVueApp((app) => {
app.mixin(lifecycle);
......@@ -1236,7 +1241,7 @@ function main() {
stat.sendEvent(type, options);
};
});
if (get_platform_name() !== 'h5' && get_platform_name() !== 'n') {
uni.onAppHide(() => {
stat.appHide(get_page_vm());
......@@ -1246,15 +1251,15 @@ function main() {
});
}
// #endif
// #ifndef VUE3
const Vue = require('vue');
(Vue.default || Vue).mixin(lifecycle);
uni.report = function(type, options) {
stat.sendEvent(type, options);
stat.sendEvent(type, options);
};
// #endif
}
// }
}
main();
......@@ -736,13 +736,16 @@ class Report {
* @param {Object} self
* @param {Object} type
*/
applicationHide(self, type) {
applicationHide(self, type) {
if(!self){
// 表示应用切换到后台 ,此时需要从页面栈获取页面实例
self = get_page_vm();
}
// 进入应用后台保存状态,方便进入前台后判断是否上报应用数据
this.__licationHide = true;
get_last_time();
const time = get_residence_time();
const route = get_page_route(self);
// this._lastPageRoute = route
uni.setStorageSync('_STAT_LAST_PAGE_ROUTE', route);
this.sendHideRequest({
urlref: route,
......@@ -1131,14 +1134,14 @@ class Stat extends Report {
// #ifdef VUE3
if (get_platform_name() !== 'h5' && get_platform_name() !== 'n') {
if (get_page_types(self) === 'app') {
this.appShow(self);
this.appShow();
}
}
// #endif
// #ifndef VUE3
if (get_page_types(self) === 'app') {
this.appShow(self);
this.appShow();
}
// #endif
......@@ -1153,14 +1156,14 @@ class Stat extends Report {
// #ifdef VUE3
if (get_platform_name() !== 'h5' && get_platform_name() !== 'n') {
if (get_page_types(self) === 'app') {
this.appHide(self);
this.appHide();
}
}
// #endif
// #ifndef VUE3
if (get_page_types(self) === 'app') {
this.appHide(self);
this.appHide();
}
// #endif
......@@ -1242,10 +1245,12 @@ const lifecycle = {
function main() {
// console.log('--- 统计开启')
if (process.env.NODE_ENV === 'development') {
uni.report = function(type, options) {};
} else {
{
console.log('uni统计开启,version:1');
}
// if (process.env.NODE_ENV === 'development') {
// uni.report = function(type, options) {}
// } else {
// #ifdef VUE3
uni.onCreateVueApp((app) => {
app.mixin(lifecycle);
......@@ -1253,7 +1258,7 @@ function main() {
stat.sendEvent(type, options);
};
});
if (get_platform_name() !== 'h5' && get_platform_name() !== 'n') {
uni.onAppHide(() => {
stat.appHide(get_page_vm());
......@@ -1263,15 +1268,15 @@ function main() {
});
}
// #endif
// #ifndef VUE3
const Vue = require('vue');
(Vue.default || Vue).mixin(lifecycle);
uni.report = function(type, options) {
stat.sendEvent(type, options);
stat.sendEvent(type, options);
};
// #endif
}
// }
}
main();
......@@ -734,13 +734,16 @@ class Report {
* @param {Object} self
* @param {Object} type
*/
applicationHide(self, type) {
applicationHide(self, type) {
if(!self){
// 表示应用切换到后台 ,此时需要从页面栈获取页面实例
self = get_page_vm();
}
// 进入应用后台保存状态,方便进入前台后判断是否上报应用数据
this.__licationHide = true;
get_last_time();
const time = get_residence_time();
const route = get_page_route(self);
// this._lastPageRoute = route
uni.setStorageSync('_STAT_LAST_PAGE_ROUTE', route);
this.sendHideRequest({
urlref: route,
......@@ -1129,14 +1132,14 @@ class Stat extends Report {
// #ifdef VUE3
if (get_platform_name() !== 'h5' && get_platform_name() !== 'n') {
if (get_page_types(self) === 'app') {
this.appShow(self);
this.appShow();
}
}
// #endif
// #ifndef VUE3
if (get_page_types(self) === 'app') {
this.appShow(self);
this.appShow();
}
// #endif
......@@ -1151,14 +1154,14 @@ class Stat extends Report {
// #ifdef VUE3
if (get_platform_name() !== 'h5' && get_platform_name() !== 'n') {
if (get_page_types(self) === 'app') {
this.appHide(self);
this.appHide();
}
}
// #endif
// #ifndef VUE3
if (get_page_types(self) === 'app') {
this.appHide(self);
this.appHide();
}
// #endif
......@@ -1240,10 +1243,12 @@ const lifecycle = {
function main() {
// console.log('--- 统计开启')
if (process.env.NODE_ENV === 'development') {
uni.report = function(type, options) {};
} else {
{
console.log('uni统计开启,version:1');
}
// if (process.env.NODE_ENV === 'development') {
// uni.report = function(type, options) {}
// } else {
// #ifdef VUE3
uni.onCreateVueApp((app) => {
app.mixin(lifecycle);
......@@ -1251,7 +1256,7 @@ function main() {
stat.sendEvent(type, options);
};
});
if (get_platform_name() !== 'h5' && get_platform_name() !== 'n') {
uni.onAppHide(() => {
stat.appHide(get_page_vm());
......@@ -1261,15 +1266,15 @@ function main() {
});
}
// #endif
// #ifndef VUE3
const Vue = require('vue');
(Vue.default || Vue).mixin(lifecycle);
uni.report = function(type, options) {
stat.sendEvent(type, options);
stat.sendEvent(type, options);
};
// #endif
}
// }
}
main();
......@@ -26,7 +26,8 @@ import {
get_page_name,
is_report_data,
get_sgin,
get_encodeURIComponent_options
get_encodeURIComponent_options,
get_page_vm
} from '../utils/pageInfo.js'
import {
......@@ -199,13 +200,16 @@ export default class Report {
* @param {Object} self
* @param {Object} type
*/
applicationHide(self, type) {
applicationHide(self, type) {
if(!self){
// 表示应用切换到后台 ,此时需要从页面栈获取页面实例
self = get_page_vm()
}
// 进入应用后台保存状态,方便进入前台后判断是否上报应用数据
this.__licationHide = true
get_last_time()
const time = get_residence_time()
const route = get_page_route(self)
// this._lastPageRoute = route
uni.setStorageSync('_STAT_LAST_PAGE_ROUTE', route)
this.sendHideRequest({
urlref: route,
......
......@@ -52,14 +52,14 @@ class Stat extends Report {
// #ifdef VUE3
if (get_platform_name() !== 'h5' && get_platform_name() !== 'n') {
if (get_page_types(self) === 'app') {
this.appShow(self)
this.appShow()
}
}
// #endif
// #ifndef VUE3
if (get_page_types(self) === 'app') {
this.appShow(self)
this.appShow()
}
// #endif
......@@ -74,14 +74,14 @@ class Stat extends Report {
// #ifdef VUE3
if (get_platform_name() !== 'h5' && get_platform_name() !== 'n') {
if (get_page_types(self) === 'app') {
this.appHide(self)
this.appHide()
}
}
// #endif
// #ifndef VUE3
if (get_page_types(self) === 'app') {
this.appHide(self)
this.appHide()
}
// #endif
......
......@@ -46,7 +46,12 @@ const lifecycle = {
function main() {
// console.log('--- 统计开启')
if (__STAT_VERSION__ === '1') {
console.log('uni统计开启,version:1')
}
if (__STAT_VERSION__ === '2') {
console.log('uni统计开启,version:2')
}
if (process.env.NODE_ENV === 'development') {
uni.report = function(type, options) {}
} else {
......@@ -57,7 +62,7 @@ function main() {
stat.sendEvent(type, options)
}
})
if (get_platform_name() !== 'h5' && get_platform_name() !== 'n') {
uni.onAppHide(() => {
stat.appHide(get_page_vm());
......@@ -67,15 +72,15 @@ function main() {
})
}
// #endif
// #ifndef VUE3
const Vue = require('vue');
(Vue.default || Vue).mixin(lifecycle);
uni.report = function(type, options) {
stat.sendEvent(type, options);
stat.sendEvent(type, options);
};
// #endif
}
}
main()
main()
import {
PAGE_PVER_TIME,
APP_PVER_TIME,
STAT_URL,
STAT_VERSION,
DIFF_TIME,
} from './config.ts'
const statConfig = {
appid: process.env.UNI_APP_ID,
}
const UUID_KEY = '__DC_STAT_UUID'
const UUID_VALUE = '__DC_UUID_VALUE'
export function getUuid() {
let uuid = ''
if (getPlatformName() === 'n') {
try {
uuid = plus.runtime.getDCloudId()
} catch (e) {
uuid = ''
}
return uuid
}
try {
uuid = uni.getStorageSync(UUID_KEY)
} catch (e) {
uuid = UUID_VALUE
}
if (!uuid) {
uuid = Date.now() + '' + Math.floor(Math.random() * 1e7)
try {
uni.setStorageSync(UUID_KEY, uuid)
} catch (e) {
uni.setStorageSync(UUID_KEY, UUID_VALUE)
}
}
return uuid
}
export const getSgin = (statData) => {
let arr = Object.keys(statData)
let sortArr = arr.sort()
let sgin = {}
let sginStr = ''
for (var i in sortArr) {
sgin[sortArr[i]] = statData[sortArr[i]]
sginStr += sortArr[i] + '=' + statData[sortArr[i]] + '&'
}
// const options = sginStr.substr(0, sginStr.length - 1)
// sginStr = sginStr.substr(0, sginStr.length - 1) + '&key=' + STAT_KEY;
// const si = crypto.createHash('md5').update(sginStr).digest('hex');
return {
sign: '',
options: sginStr.substr(0, sginStr.length - 1),
}
}
export const getSplicing = (data) => {
let str = ''
for (var i in data) {
str += i + '=' + data[i] + '&'
}
return str.substr(0, str.length - 1)
}
export const getTime = () => {
return parseInt(new Date().getTime() / 1000)
}
export const getPlatformName = () => {
const aliArr = ['y', 'a', 'p', 'mp-ali']
const platformList = {
'app-plus': 'n',
h5: 'h5',
'mp-weixin': 'wx',
[aliArr.reverse().join('')]: 'ali',
'mp-baidu': 'bd',
'mp-toutiao': 'tt',
'mp-qq': 'qq',
'quickapp-native': 'qn',
'mp-kuaishou': 'ks',
}
return platformList[process.env.VUE_APP_PLATFORM]
}
export const getPackName = () => {
let packName = ''
if (getPlatformName() === 'wx' || getPlatformName() === 'qq') {
// 兼容微信小程序低版本基础库
if (uni.canIUse('getAccountInfoSync')) {
packName = uni.getAccountInfoSync().miniProgram.appId || ''
}
}
return packName
}
export const getVersion = () => {
return getPlatformName() === 'n' ? plus.runtime.version : ''
}
export const getChannel = () => {
const platformName = getPlatformName()
let channel = ''
if (platformName === 'n') {
channel = plus.runtime.channel
}
if (platformName === 'wx') {
// TODO;
}
return channel
}
export const getScene = (options) => {
const platformName = getPlatformName()
let scene = ''
if (options) {
return options
}
if (platformName === 'wx') {
scene = uni.getLaunchOptionsSync().scene
}
return scene
}
const First__Visit__Time__KEY = 'First__Visit__Time'
const Last__Visit__Time__KEY = 'Last__Visit__Time'
export const getFirstVisitTime = () => {
const timeStorge = uni.getStorageSync(First__Visit__Time__KEY)
let time = 0
if (timeStorge) {
time = timeStorge
} else {
time = getTime()
uni.setStorageSync(First__Visit__Time__KEY, time)
uni.removeStorageSync(Last__Visit__Time__KEY)
}
return time
}
export const getLastVisitTime = () => {
const timeStorge = uni.getStorageSync(Last__Visit__Time__KEY)
let time = 0
if (timeStorge) {
time = timeStorge
} else {
time = ''
}
uni.setStorageSync(Last__Visit__Time__KEY, getTime())
return time
}
const PAGE_RESIDENCE_TIME = '__page__residence__time'
let First_Page_residence_time = 0
let Last_Page_residence_time = 0
export const setPageResidenceTime = () => {
First_Page_residence_time = getTime()
if (getPlatformName() === 'n') {
uni.setStorageSync(PAGE_RESIDENCE_TIME, getTime())
}
return First_Page_residence_time
}
export const getPageResidenceTime = () => {
Last_Page_residence_time = getTime()
if (getPlatformName() === 'n') {
First_Page_residence_time = uni.getStorageSync(PAGE_RESIDENCE_TIME)
}
return Last_Page_residence_time - First_Page_residence_time
}
const TOTAL__VISIT__COUNT = 'Total__Visit__Count'
export const getTotalVisitCount = () => {
const timeStorge = uni.getStorageSync(TOTAL__VISIT__COUNT)
let count = 1
if (timeStorge) {
count = timeStorge
count++
}
uni.setStorageSync(TOTAL__VISIT__COUNT, count)
return count
}
export const GetEncodeURIComponentOptions = (statData) => {
let data = {}
for (let prop in statData) {
data[prop] = encodeURIComponent(statData[prop])
}
return data
}
let Set__First__Time = 0
let Set__Last__Time = 0
export const getFirstTime = () => {
let time = new Date().getTime()
Set__First__Time = time
Set__Last__Time = 0
return time
}
export const getLastTime = () => {
let time = new Date().getTime()
Set__Last__Time = time
return time
}
export const getResidenceTime = (type) => {
let residenceTime = 0
if (Set__First__Time !== 0) {
residenceTime = Set__Last__Time - Set__First__Time
}
residenceTime = parseInt(residenceTime / 1000)
residenceTime = residenceTime < 1 ? 1 : residenceTime
if (type === 'app') {
let overtime = residenceTime > APP_PVER_TIME ? true : false
return {
residenceTime,
overtime,
}
}
if (type === 'page') {
let overtime = residenceTime > PAGE_PVER_TIME ? true : false
return {
residenceTime,
overtime,
}
}
return {
residenceTime,
}
}
export const getRoute = () => {
var pages = getCurrentPages()
var page = pages[pages.length - 1]
if (!page) return ''
// TODO 需要确认如果不用 $vm ,其他平台会不会出错
let _self = page.$vm
if (getPlatformName() === 'bd') {
return _self.$mp && _self.$mp.page.is
} else {
return _self.route || (_self.$scope && _self.$scope.route)
}
}
export const getPageRoute = (_this) => {
let pageVm = _this.self
let page = pageVm.$page || pageVm.$scope.$page
return page.fullPath === '/' ? page.route : page.fullPath
}
export const getPageTypes = (self) => {
if (
self.$mpType === 'page' ||
(self.$mp && self.$mp.mpType === 'page') ||
self.$options.mpType === 'page'
) {
return true
}
return false
}
export const calibration = (eventName, options) => {
// login 、 share 、pay_success 、pay_fail 、register 、title
if (!eventName) {
console.error(`uni.report 缺少 [eventName] 参数`)
return true
}
if (typeof eventName !== 'string') {
console.error(`uni.report [eventName] 参数类型错误,只能为 String 类型`)
return true
}
if (eventName.length > 255) {
console.error(`uni.report [eventName] 参数长度不能大于 255`)
return true
}
if (typeof options !== 'string' && typeof options !== 'object') {
console.error(
`uni.report [options] 参数类型错误,只能为 String 或 Object 类型`
)
return true
}
if (typeof options === 'string' && options.length > 255) {
console.error(`uni.report [options] 参数长度不能大于 255`)
return true
}
if (eventName === 'title' && typeof options !== 'string') {
console.error(
'uni.report [eventName] 参数为 title 时,[options] 参数只能为 String 类型'
)
return true
}
}
const Report_Data_Time = 'Report_Data_Time'
const Report_Status = 'Report_Status'
export const isReportData = () => {
return new Promise((resolve, reject) => {
let start_time = ''
let end_time = new Date().getTime()
let diff_time = DIFF_TIME
let report_status = 1
try {
start_time = uni.getStorageSync(Report_Data_Time)
report_status = uni.getStorageSync(Report_Status)
} catch (e) {
start_time = ''
report_status = 1
}
if (report_status === '') {
requestData(({ enable }) => {
uni.setStorageSync(Report_Data_Time, end_time)
uni.setStorageSync(Report_Status, enable)
if (enable === 1) {
resolve()
}
})
return
}
if (report_status === 1) {
resolve()
}
if (!start_time) {
uni.setStorageSync(Report_Data_Time, end_time)
start_time = end_time
}
if (end_time - start_time > diff_time) {
requestData(({ enable }) => {
uni.setStorageSync(Report_Data_Time, end_time)
uni.setStorageSync(Report_Status, enable)
})
}
})
}
const requestData = (done) => {
let formData = {
usv: STAT_VERSION,
conf: JSON.stringify({
ak: statConfig.appid,
}),
}
uni.request({
url: STAT_URL,
method: 'GET',
data: formData,
success: (res) => {
const { data } = res
if (data.ret === 0) {
typeof done === 'function' &&
done({
enable: data.enable,
})
}
},
fail: (e) => {
let report_status_code = 1
try {
report_status_code = uni.getStorageSync(Report_Status)
} catch (e) {
report_status_code = 1
}
if (report_status_code === '') {
report_status_code = 1
}
typeof done === 'function' &&
done({
enable: report_status_code,
})
},
})
}
import {
getUuid,
getSgin,
getSplicing,
getPackName,
getPlatformName,
getVersion,
getChannel,
getScene,
getTime,
getFirstVisitTime,
getLastVisitTime,
setPageResidenceTime,
getPageResidenceTime,
getTotalVisitCount,
GetEncodeURIComponentOptions,
getFirstTime,
getLastTime,
getResidenceTime,
getPageRoute,
getRoute,
getPageTypes,
calibration,
isReportData,
} from './parameter'
import {
STAT_URL,
STAT_VERSION,
STAT_H5_URL,
OPERATING_TIME,
} from './config.ts'
const titleJsons = process.env.UNI_STAT_TITLE_JSON
const statConfig = {
appid: process.env.UNI_APP_ID,
}
const resultOptions = uni.getSystemInfoSync()
class Util {
constructor() {
this.self = ''
this._retry = 0
this._platform = ''
this._query = {}
this._navigationBarTitle = {
config: '',
page: '',
report: '',
lt: '',
}
this._operatingTime = 0
this._reportingRequestData = {
1: [],
11: [],
}
this.__prevent_triggering = false
this.__licationHide = false
this.__licationShow = false
this._lastPageRoute = ''
this.statData = {
uuid: getUuid(),
ut: getPlatformName(),
mpn: getPackName(),
ak: statConfig.appid,
usv: STAT_VERSION,
v: getVersion(),
ch: getChannel(),
cn: '',
pn: '',
ct: '',
t: getTime(),
tt: '',
p: resultOptions.platform === 'android' ? 'a' : 'i',
brand: resultOptions.brand || '',
md: resultOptions.model,
sv: resultOptions.system.replace(/(Android|iOS)\s/, ''),
mpsdk: resultOptions.SDKVersion || '',
mpv: resultOptions.version || '',
lang: resultOptions.language,
pr: resultOptions.pixelRatio,
ww: resultOptions.windowWidth,
wh: resultOptions.windowHeight,
sw: resultOptions.screenWidth,
sh: resultOptions.screenHeight,
}
// 注册拦截器
let registerInterceptor =
typeof uni.addInterceptor === 'function' &&
process.env.NODE_ENV !== 'development'
if (registerInterceptor) {
this.addInterceptorInit()
this.interceptLogin()
this.interceptShare(true)
this.interceptRequestPayment()
}
}
addInterceptorInit() {
let self = this
uni.addInterceptor('setNavigationBarTitle', {
invoke(args) {
self._navigationBarTitle.page = args.title
},
})
}
interceptLogin() {
let self = this
uni.addInterceptor('login', {
complete() {
self._login()
},
})
}
interceptShare(type) {
let self = this
if (!type) {
self._share()
return
}
uni.addInterceptor('share', {
success() {
self._share()
},
fail() {
self._share()
},
})
}
interceptRequestPayment() {
let self = this
uni.addInterceptor('requestPayment', {
success() {
self._payment('pay_success')
},
fail() {
self._payment('pay_fail')
},
})
}
getIsReportData() {
return isReportData()
}
_applicationShow() {
if (this.__licationHide) {
getLastTime()
const time = getResidenceTime('app')
if (time.overtime) {
let options = {
path: this._lastPageRoute,
scene: this.statData.sc,
}
this._sendReportRequest(options)
}
this.__licationHide = false
}
}
_applicationHide(self, type) {
this.__licationHide = true
getLastTime()
const time = getResidenceTime()
getFirstTime()
const route = getPageRoute(this)
this._sendHideRequest(
{
urlref: route,
urlref_ts: time.residenceTime,
},
type
)
}
_pageShow() {
const route = getPageRoute(this)
const routepath = getRoute(this)
this._navigationBarTitle.config =
(titleJsons && titleJsons[routepath]) || ''
if (this.__licationShow) {
getFirstTime()
this.__licationShow = false
this._lastPageRoute = route
return
}
getLastTime()
const time = getResidenceTime('page')
// 停留时间
if (time.overtime) {
let options = {
path: route,
scene: this.statData.sc,
}
this._sendReportRequest(options)
}
getFirstTime()
}
_pageHide() {
if (!this.__licationHide) {
getLastTime()
const time = getResidenceTime('page')
let route = getPageRoute(this)
if (!this._lastPageRoute) {
this._lastPageRoute = route
}
this._sendPageRequest({
url: route,
urlref: this._lastPageRoute,
urlref_ts: time.residenceTime,
})
this._lastPageRoute = route
this._navigationBarTitle = {
config: '',
page: '',
report: '',
lt: '',
}
return
}
}
_login() {
this._sendEventRequest(
{
key: 'login',
},
0
)
}
_share() {
this._sendEventRequest(
{
key: 'share',
},
0
)
}
_payment(key) {
this._sendEventRequest(
{
key,
},
0
)
}
_sendReportRequest(options) {
this._navigationBarTitle.lt = '1'
this._navigationBarTitle.config =
(titleJsons && titleJsons[options.path]) || ''
let query =
options.query && JSON.stringify(options.query) !== '{}'
? '?' + JSON.stringify(options.query)
: ''
this.statData.lt = '1'
this.statData.url = options.path + query || ''
this.statData.t = getTime()
this.statData.sc = getScene(options.scene)
this.statData.fvts = getFirstVisitTime()
this.statData.lvts = getLastVisitTime()
this.statData.tvc = getTotalVisitCount()
if (getPlatformName() === 'n') {
this.getProperty()
} else {
this.getNetworkInfo()
}
}
_sendPageRequest(opt) {
let { url, urlref, urlref_ts } = opt
this._navigationBarTitle.lt = '11'
let options = {
ak: this.statData.ak,
uuid: this.statData.uuid,
lt: '11',
ut: this.statData.ut,
url,
tt: this.statData.tt,
urlref,
urlref_ts,
ch: this.statData.ch,
usv: this.statData.usv,
t: getTime(),
p: this.statData.p,
}
this.request(options)
}
_sendHideRequest(opt, type) {
let { urlref, urlref_ts } = opt
let options = {
ak: this.statData.ak,
uuid: this.statData.uuid,
lt: '3',
ut: this.statData.ut,
urlref,
urlref_ts,
ch: this.statData.ch,
usv: this.statData.usv,
t: getTime(),
p: this.statData.p,
}
this.request(options, type)
}
_sendEventRequest({ key = '', value = '' } = {}) {
const route = this._lastPageRoute
let options = {
ak: this.statData.ak,
uuid: this.statData.uuid,
lt: '21',
ut: this.statData.ut,
url: route,
ch: this.statData.ch,
e_n: key,
e_v: typeof value === 'object' ? JSON.stringify(value) : value.toString(),
usv: this.statData.usv,
t: getTime(),
p: this.statData.p,
}
this.request(options)
}
getNetworkInfo() {
uni.getNetworkType({
success: (result) => {
this.statData.net = result.networkType
this.getLocation()
},
})
}
getProperty() {
plus.runtime.getProperty(plus.runtime.appid, (wgtinfo) => {
this.statData.v = wgtinfo.version || ''
this.getNetworkInfo()
})
}
getLocation() {
if (statConfig.getLocation) {
uni.getLocation({
type: 'wgs84',
geocode: true,
success: (result) => {
if (result.address) {
this.statData.cn = result.address.country
this.statData.pn = result.address.province
this.statData.ct = result.address.city
}
this.statData.lat = result.latitude
this.statData.lng = result.longitude
this.request(this.statData)
},
})
} else {
this.statData.lat = 0
this.statData.lng = 0
this.request(this.statData)
}
}
request(data, type) {
let time = getTime()
const title = this._navigationBarTitle
data.ttn = title.page
data.ttpj = title.config
data.ttc = title.report
let requestData = this._reportingRequestData
if (getPlatformName() === 'n') {
requestData = uni.getStorageSync('__UNI__STAT__DATA') || {}
}
if (!requestData[data.lt]) {
requestData[data.lt] = []
}
requestData[data.lt].push(data)
if (getPlatformName() === 'n') {
uni.setStorageSync('__UNI__STAT__DATA', requestData)
}
if (getPageResidenceTime() < OPERATING_TIME && !type) {
return
}
let uniStatData = this._reportingRequestData
if (getPlatformName() === 'n') {
uniStatData = uni.getStorageSync('__UNI__STAT__DATA')
}
// 时间超过,重新获取时间戳
setPageResidenceTime()
let firstArr = []
let contentArr = []
let lastArr = []
for (let i in uniStatData) {
const rd = uniStatData[i]
rd.forEach((elm) => {
const newData = getSplicing(elm)
if (i === 0) {
firstArr.push(newData)
} else if (i === 3) {
lastArr.push(newData)
} else {
contentArr.push(newData)
}
})
}
firstArr.push(...contentArr, ...lastArr)
let optionsData = {
usv: STAT_VERSION, //统计 SDK 版本号
t: time, //发送请求时的时间戮
requests: JSON.stringify(firstArr),
}
this._reportingRequestData = {}
if (getPlatformName() === 'n') {
uni.removeStorageSync('__UNI__STAT__DATA')
}
if (data.ut === 'h5') {
this.imageRequest(optionsData)
return
}
if (getPlatformName() === 'n' && this.statData.p === 'a') {
setTimeout(() => {
this._sendRequest(optionsData)
}, 200)
return
}
this._sendRequest(optionsData)
}
_sendRequest(optionsData) {
this.getIsReportData().then(() => {
uni.request({
url: STAT_URL,
method: 'POST',
data: optionsData,
success: () => {},
fail: (e) => {
if (++this._retry < 3) {
setTimeout(() => {
this._sendRequest(optionsData)
}, 1000)
}
},
})
})
}
/**
* h5 请求
*/
imageRequest(data) {
this.getIsReportData().then(() => {
let image = new Image()
let options = getSgin(GetEncodeURIComponentOptions(data)).options
image.src = STAT_H5_URL + '?' + options
})
}
sendEvent(key, value) {
// 校验 type 参数
if (calibration(key, value)) return
if (key === 'title') {
this._navigationBarTitle.report = value
return
}
this._sendEventRequest(
{
key,
value: typeof value === 'object' ? JSON.stringify(value) : value,
},
1
)
}
}
class Stat extends Util {
static getInstance() {
if (!this.instance) {
this.instance = new Stat()
}
return this.instance
}
constructor() {
super()
this.instance = null
}
report(options, self) {
// TODO 需要确认如果不用 $vm ,其他平台会不会出错
setPageResidenceTime()
this.__licationShow = true
this._sendReportRequest(options, true)
}
load(options, self) {
this.self = self
this._query = options
}
show(self) {
this.self = self
if (getPageTypes(self)) {
this._pageShow(self)
} else {
this._applicationShow(self)
}
}
ready(self) {}
hide(self) {
this.self = self
if (getPageTypes(self)) {
this._pageHide(self)
} else {
this._applicationHide(self, true)
}
}
error(em) {
if (this._platform === 'devtools') {
if (process.env.NODE_ENV === 'development') {
console.info('当前运行环境为开发者工具,不上报数据。')
}
}
let emVal = ''
if (!em.message) {
emVal = JSON.stringify(em)
} else {
emVal = em.stack
}
let options = {
ak: this.statData.ak,
uuid: this.statData.uuid,
lt: '31',
ut: this.statData.ut,
ch: this.statData.ch,
mpsdk: this.statData.mpsdk,
mpv: this.statData.mpv,
v: this.statData.v,
em: emVal,
usv: this.statData.usv,
t: getTime(),
p: this.statData.p,
}
this.request(options)
}
}
export default Stat
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册