文件
OmniCard/mpuniapp/uni_modules/uni-stat/utssdk/common/utils/pageInfo.uts

557 行
13 KiB
Plaintext

此文件含有模棱两可的 Unicode 字符

此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。

import { OnLaunchOptionsWithCst, RouteParams, StatDefault, ReportErrorCode } from '../../interface.uts'
import { STAT_VERSION, sys, device, sysAppBase, Config } from '../config.uts'
// import Config from '../config.uts'
import { get_time } from './pageTime.uts'
import { dbGet, dbSet } from './db.uts'
import { Serialize, IsNumber } from './index.uts'
const APPID = sys.appId
const RUNTIME_VERSION = sys.appVersion
/**
* 获取uuid
*/
export const get_uuid = () : string => {
// 有可能不存在 deviceId(一般不存在就是出bug了),就自己生成一个
// 目前 deviceId 肯定存在所以不用生成
// const uuid : string = sys.deviceId ?? getUuid()
return sys.deviceId
}
/**
* 获取老版的 deviceid ,兼容以前的错误 deviceid
*/
export const get_odid = () : string => {
// let odid : string
// if (get_platform_name() === 'n') {
// try {
// odid = plus.device.uuid
// } catch (e) {
// odid = ''
// }
// return odid
// }
// odid = sys.deviceId ?? getUuid()
// TODO 需要获取老版本的uuid ,目前无法获取,只返回 deviceId
return sys.deviceId
}
/**
* 获取当前平台
* 移动端 : 'n',
* h5 : 'h5',
* 微信 : 'wx',
* 阿里 : 'ali',
* 百度 : 'bd',
* 头条 : 'tt',
* qq : 'qq',
* 快应用 : 'qn',
* 快手 : 'ks',
* 飞书 : 'lark',
* 快应用 : 'qw',
* 钉钉 : 'dt'
*/
export const get_platform_name = () : string => {
let platformList = {
'app': 'n',
'app-plus': 'n',
'h5': 'h5',
'web': 'web',
'mp-weixin': 'wx',
'mp-baidu': 'bd',
'mp-toutiao': 'tt',
'mp-qq': 'qq',
'quickapp-native': 'qn',
'mp-kuaishou': 'ks',
'mp-lark': 'lark',
'quickapp-webview': 'qw',
}
// 苹果审核代码中禁止出现 alipay 字样 ,需要特殊处理一下
const aliArr = ['y', 'a', 'p', 'mp-ali']
const aliKey = aliArr.reverse().join('')
platformList[aliKey] = 'ali'
const platform = sys.uniPlatform
// TODO 兼容子平台
// if (platformList[process.env.VUE_APP_PLATFORM] === 'ali') {
// if (my && my.env) {
// const clientName = my.env.clientName
// if (clientName === 'ap') return 'ali'
// if (clientName === 'dingtalk') return 'dt'
// // TODO 缺少 ali 下的其他平台
// }
// }
return platformList[platform] as string
}
/**
* 获取原生包名,或小程序 appid
*/
export const get_pack_name = () : string => {
let packName = ''
if (get_platform_name() === 'n') {
if (sys.osName == 'android') {
packName = sysAppBase.packageName ?? ''
}
if (sys.osName == 'ios') {
packName = sysAppBase.bundleId ?? ''
}
}
return packName
}
/**
* 应用版本
*/
export const get_version = () : string => {
return RUNTIME_VERSION
}
/**
* 获取渠道
*/
export const get_channel = () : string => {
const platformName = get_platform_name()
let channel : string = ''
if (platformName === 'n') {
channel = sysAppBase.channel ?? ''
}
// if (platformName === 'wx') {
// // TODO 需要调研小程序二维码渠道如何获取;
// }
return channel
}
/**
* 获取小程序场景值
*/
export const get_scene = (options : OnLaunchOptionsWithCst) : number => {
// const platformName = get_platform_name()
let scene = 1001
if (options.scene != null) {
return options.scene ?? 1001
}
// if (platformName == 'wx') {
// // @ts-ignore
// scene = uni.getLaunchOptionsSync()?.scene ?? 1001
// }
return scene
}
/**
* 是否获取 page 页面
* @param {VueComponent} appInstance 页面实例
*/
// @ts-ignore
export const is_page = (appInstance : ComponentPublicInstance) : Boolean => {
// #ifdef WEB || APP-IOS || MP-WEIXIN
const type = appInstance?.$mpType ?? 'page'
return type == 'page' ? true : false
// #endif
// #ifndef WEB || APP-IOS || MP-WEIXIN
// 其他平台没有 $mpType ,只有页面触发
return true
// #endif
}
/**
* 获取页面标题
* @param {String} routepath 页面路由
*/
export const get_page_name = (routepath : string) : string => {
let page = get_page_vm()
if (page == null) return ''
let route : string
// #ifdef MP-WEIXIN
route = (page.$scope && page.$scope.route) ?? ""
// #endif
// #ifndef MP-WEIXIN
route = page.route
// #endif
if (route != routepath) {
const pages = getCurrentPages()
// 如果传入路由与当前页面不同,则从页面栈找一个,如果找不到返回空
let page_now = pages.find((p) : boolean => p.route == routepath)
if (page_now == null) {
return ''
}
// @ts-ignore
page = page_now.vm!
}
let titleText : string
// #ifdef MP-WEIXIN
// @ts-ignore
const title_json = process.env.UNI_STAT_TITLE_JSON
titleText = title_json[route] ?? ''
// #endif
// #ifndef MP-WEIXIN
// @ts-ignore
const pageStyle = (page.$page as UniPage).getPageStyle()
titleText = (pageStyle['navigationBarTitleText'] as string)
// #endif
return titleText as string
}
/**
* 获取页面实例
*/
export const get_page_vm = () : Page | null => {
let pages = getCurrentPages()
if (pages.length == 0) {
return null
}
let page = pages[pages.length - 1]
// TODO 正常来说,调用当前方法的地方只在 生命周期内,数组内最少会有一个页面,所以理论上是不存在获取不到的情况的
// @ts-ignore
return page.vm
}
/**
* 获取页面url,不包含参数
* @param {ComponentPublicInstance} page 页面实例
*/
export function get_route(page : Page | null = null) : RouteParams {
let _self = page ?? get_page_vm()
if (_self == null) {
const data : RouteParams = {
path: '',
fullpath: ''
}
return data
}
let url_params : string
let options : any
// #ifdef MP-WEIXIN
options = _self.$scope.options
// #endif
// #ifndef MP-WEIXIN
options = _self.options
// #endif
// TODO 条件编译处理参数问题,安卓上 options返回的是map,需要处理成 utsobject
// #ifdef APP-ANDROID && !VUE3-VAPOR
const opts = new UTSJSONObject(options)
// TODO 上报页面参数需要处理
url_params = Serialize(opts)
// #endif
// #ifndef APP-ANDROID && !VUE3-VAPOR
// @ts-ignore
url_params = Serialize(options)
// #endif
let params = ''
// 如果参数只有 ?则说明没有参数
if (url_params != '?') {
params = url_params
}
// 兼容不同小程序下的不同取值
let route : string
// #ifdef MP-WEIXIN
route = (_self.$scope && _self.$scope.route) ?? ""
// #endif
// #ifndef MP-WEIXIN
route = _self.route
// #endif
const data : RouteParams = {
path: route,
fullpath: route + params
}
return data
}
/**
* 获取页面url, 包含参数 ,暂时不用,合并到 get_route
* @param {ComponentPublicInstance} page 页面实例
*/
export function get_page_route(page : Page | null = null) : string {
let _self = page ?? get_page_vm()
let lastPageRoute = uni.getStorageSync('_STAT_LAST_PAGE_ROUTE')
if (_self == null) {
return lastPageRoute ?? ''
}
// 如果找不到 fullPath 就取 route 的值
// TODO 取完整路径,目前最新为 optiosn 为携带参数,需要手动序列化
// return page.fullPath === '/' ? page.route : page.fullPath || page.route
return _self.route
}
/**
* 是否上报页面数据
* @returns
*/
export const is_page_report = () : boolean => {
const uniStatConfig = Config.getOptions();
const collectItems = uniStatConfig.collectItems;
if (collectItems != null) {
const statPageLog = collectItems.uniStatPageLog
if (statPageLog == null) return true
return typeof statPageLog == 'boolean' ? statPageLog : true
}
return true
}
/**
* 是否已处理设备 DeviceId
* 如果值为 1 则表示已处理
*/
const IS_HANDLE_DEVECE_ID = 'is_handle_device_id'
export const is_handle_device = () : boolean => {
let isHandleDevice = dbGet(IS_HANDLE_DEVECE_ID) ?? ''
dbSet(IS_HANDLE_DEVECE_ID, '1')
return isHandleDevice === '1'
}
/**
* 获取网络状态
*/
export const get_net = () : Promise<string> => {
return new Promise((resolve, reject) => {
uni.getNetworkType({
success(e : GetNetworkTypeSuccess) {
const net = e.networkType
resolve(net)
}, fail() {
reject('')
}
})
})
}
/**
* 获取上报数据默认值
*/
export const get_default_data = () : StatDefault => {
let isRoot : number
if (device.isRoot == true) {
isRoot = 1
} else {
isRoot = 0
}
let statData : StatDefault = {
uuid: get_uuid(),
ak: APPID,
p: sys.osName == 'android' ? 'a' : 'i',
ut: get_platform_name(),
mpn: get_pack_name(),
usv: STAT_VERSION,
v: RUNTIME_VERSION,
ch: get_channel(),
cn: '',
pn: get_pack_name(),
ct: '',
t: get_time(),
tt: '',
brand: sys.deviceBrand,
md: sys.deviceModel,
sv: sys.osVersion.replace(/(Android|iOS)\s/, ''),
mpsdk: sys.SDKVersion,
mpv: sys.uniCompilerVersionCode.toString(),
// mpv: '',
lang: sys.osLanguage,
pr: sys.devicePixelRatio,
ww: sys.windowWidth,
wh: sys.windowHeight,
sw: sys.screenWidth,
sh: sys.screenHeight,
lat: '',
lng: '',
net: '',
odid: '',
pv: sysAppBase.appVersion,
root: isRoot
}
return statData
}
/**
* 获取上报时间间隔
* @param {*} defaultTime 默认上报间隔时间 单位s
*/
export const get_report_Interval = (defaultTime : number) : number => {
const uniStatConfig = Config.getOptions()
let time = uniStatConfig.reportInterval
// let reg = /(^[1-9]\d*$)/
// 如果不是整数,则默认为上报间隔时间
// if (!reg.test(time)) return defaultTime
if (!IsNumber(time)) return defaultTime
// 如果上报时间配置为0 相当于立即上报
if (time == 0) return 0
// time = time ?? defaultTime
return time as number
}
/**
* 获取uniCloud服务空间配置
* @returns {Object}
*/
export const uni_cloud_config = () : UniCloudInitOptions | null => {
// TODO 当前版本暂时不使用
// return process.env.UNI_STAT_UNI_CLOUD || {}
return null
}
/**
* 获取服务空间
* @param {*} config
* @returns
*/
export const get_space = (config : UniCloudInitOptions) : UniCloudInitOptions | null => {
const uniCloudConfig = uni_cloud_config()
if (uniCloudConfig == null) {
// #ifdef APP-ANDROID && !VUE3-VAPOR
if (config.spaceId != '') {
return config
}
// #endif
// #ifndef APP-ANDROID && !VUE3-VAPOR
if (config?.spaceId != '') {
return config
}
// #endif
return null
}
let spaceId = uniCloudConfig.spaceId
let provider = uniCloudConfig.provider
let clientSecret = uniCloudConfig.clientSecret
let secretKey = uniCloudConfig.secretKey
let accessKey = uniCloudConfig.accessKey
const space_type = ['tcb', 'tencent', 'aliyun', 'alipay']
// @ts-ignore
const is_space_id = spaceId != ''
const is_provider = space_type.indexOf(provider) != -1
const is_aliyun = provider == 'aliyun' && is_space_id && clientSecret != null
const is_tcb = (provider == 'tcb' || provider === 'tencent') && is_space_id
const is_alipay = provider == 'alipay' && is_space_id && secretKey != null && accessKey != null
if (is_provider && (is_aliyun || is_tcb || is_alipay)) {
return uniCloudConfig
}
return null
}
/**
* 获取隐私协议配置
*/
export const is_push_clientid = () : boolean => {
const uniStatConfig = Config.getOptions()
const collectItems = uniStatConfig.collectItems
if (collectItems != null) {
const ClientID = collectItems.uniPushClientID ?? false
return typeof ClientID == 'boolean' ? ClientID : false
}
return false
}
/**
* 获取崩溃日志文件地址
*/
export const get_crash_logs = (fn : (value : string[]) => void) => {
// #ifndef APP-IOS
const crash_data = uni.__getAppCrashInfo()
if (crash_data != null && crash_data.length > 0) {
const sysManager = uni.getFileSystemManager();
const reportLogs : Promise<string>[] = []
for (let i = 0; i < crash_data.length; i++) {
const item = crash_data[i];
let file_text : string;
// #ifdef APP-ANDROID && !VUE3-VAPOR
file_text = item.get('file') as string
// #endif
// #ifdef APP-IOS
file_text = item.file as string
// #endif
const logPromise = new Promise<string>((resolve, reject) => {
sysManager.readFile({
filePath: file_text,
encoding: 'utf-8',
success: (res) => {
const crash_text = res.data as string
resolve(crash_text); // 成功上报后 resolve
},
fail: (err : any) => {
reject(err); // 读取文件失败时 reject
}
});
});
reportLogs.push(logPromise);
}
Promise.all(reportLogs)
.then((res) => {
fn(res)
})
.catch((err) => {
console.log('Errorlogs:', err);
});
}
// #endif
}
/**
* 自定义事件参数校验
*/
export const calibration = (eventName : string, options : any | null) : ReportErrorCode | null => {
// login 、 share 、pay_success 、pay_fail 、register 、title
if (eventName == '') {
// console.error(`uni.report Missing [eventName] parameter`)
return 61003
}
if (typeof eventName != 'string') {
// console.error(
// `uni.report [eventName] Parameter type error, it can only be of type String`
// )
return 61004
}
if (eventName.length > 255) {
// console.error(
// `uni.report [eventName] Parameter length cannot be greater than 255`
// )
return 61005
}
if (typeof options != 'string' && typeof options != 'object') {
// console.error(
// 'uni.report [options] Parameter type error, Only supports String or Object type'
// )
return 61006
}
if (typeof options == 'string' && (options as string).length > 255) {
// console.error(
// `uni.report [options] Parameter length cannot be greater than 255`
// )
return 61007
}
if (eventName == 'title' && typeof options != 'string') {
// console.error(
// `uni.report [eventName] When the parameter is title, the [options] parameter can only be of type String`
// )
return 61008
}
return null
}