评论

教你如何做到uniapp引入SDK在vue实例化之前绑定(SDK是友盟+统计分析)

搞了几天才搞出的问题解决方案,通过这个例子希望大家可以举一反三,不受当前固定逻辑,遇到其它问题也可以按这思路走

问题描述


由于产品需要做一个小程序监控统计,于是选择了友盟+;在对接过程中,发现一个严重的问题,如果代码写固定一个配置参数appkey的话,怎么对接都可以,但是现在我做的是第三方平台做小程序模板的,一套代码分给各个小程序,那么就需要动态拿到当前是哪个小程序,哪个appkey,一个appkey对应一个友盟+应用,也是区分统计小程序的原因。
问题就来了,友盟SDK初始化必须要在vue实例之前配置好,这就需要等待获取appkey返回配置好初始化内容,在继续实例化vue。
这里声明一下,我用的是uniapp框架开发

问题解决思路


之前想了很多办法,然后刚开始探索比较成功的方法,现在小程序配置内容写上appkey不要在接口返回,因为接口返回太慢了(等待几十毫秒)异步时间太长;我把vue实例封装成一个函数,用小程序方法 wx.getExtConfig 获取当前小程序配置信息appkey,拿到后初始化友盟配置信息,在初始化vue实例,结果开发工具、安卓手机成功了,让我信心满满。

当测试总监拿去苹果手机测试时,打开小程序正常打开,但是页面点击无效了,在一看控制台,wocao,报错了,报的还是框架的错误,没办法定位错误。。。
然后思索良久,居然不能用异步,那我同步总可以吧(这里的同步指的是小程序api同步方法,如果自己写代码await可能不行)于是我找到了同步方法wx.getExtConfigSync,写好判断条件,运行开发工具没问题,安卓手机没问题,拿出最新一款iPhone13打开查看结果,幸运的跑起来了,没有任何报错了。心里的大石终于落地了,可以不害怕跌落了,但是小程序昨晚已经发布了,今天才搞好,还是有点尴尬哈

代码展示


首先可以去友盟+官方下载SDK或者用npm安装
使用npm安装指令:npm install umtrack-wx@latest --save

SDK文件下载:点我下载地址
下载后
将解压后的文件目录放在小程序目录下(比如:/src/utils目录)。
添加代码:具体可查看集成文档:目录地址

各框架写法引入方式:Umeng小程序demo

本人改造适配第三方平台小程序写法

// main.js文件, vue入口文件

import App from './App'

import {
	umaInit
} from './utils/uma.js'; // 友盟+

import Vue from 'vue'
import store from './store'

Vue.prototype.$store = store

let uma = '';
let extConfig = uni.getExtConfigSync? uni.getExtConfigSync(): null; // 必须要用微信的同步方法,否则苹果手机会报错
if(extConfig) {
	if (extConfig.uMengKey) umaInit(extConfig.uMengKey); // 友盟+ 数据统计
	initApp();
} else {
	initApp();
}

// 由于友盟+初始化要在创建vue实例之前完成,故才有此操作
function initApp() {
	// #ifndef VUE3
	// import Vue from 'vue'
	Vue.config.productionTip = false
	
	// Vue.prototype.$uma = uma;
	Vue.use(uma); // 友盟+
	
	App.mpType = 'app'
	const app = new Vue({
		store,
		...App
	})
	app.$mount()
	// #endif

	// #ifdef VUE3
	import {
		createSSRApp
	} from 'vue'
	export function createApp() {
		const app = createSSRApp(App)
		return {
			app
		}
	}
	// #endif
}

// uma.js文件,友盟初始配置

import Vue from 'vue';
let uma = '';
export function umaInit(appKey) {
	if (!appKey) return; // 如果没有key,不需要统计
	uma = require('../umtrack-wx/lib/index.js')
	uma.init({
		appKey: appKey,
		useOpenid: false,
		autoGetOpenid: false,
		debug: false,
		uploadUserInfo: true,
	});
	// 适配vue插件如此可通过Vue.use(uma)来安装
	uma.install = function(Vue) {
		Vue.prototype.$uma = uma;
	}
	Vue.use(uma); // 友盟+
};

最后一次编辑于  2022-07-20  
点赞 1
收藏
评论
登录 后发表内容