H5 SDK集成
支持类型:Web、H5、App内嵌H5、小程序内嵌H5、微信端网页

产品官网地址:https://www.umeng.com/miniprogram
H5功能介绍文档:https://developer.umeng.com/docs/147615/detail/290934
适用范围
本文档适用于 U-Mini H5 SDK 1.7.4及以上的版本。
当前集成文档常用API:
(单页面应用)关闭自动PV& 手动PV事件
页面点击事件
预置元素曝光事件
当前集成文档需关注的重点、错点如下:
集成SDK,注意SDK的集成位置,为保证SDK的统计的准确性,请根据SDK集成代码注释说明,给SDK放在最高优先级的文件和位置,结合自身项目是否为单页面项目对SDK集成代码进行删减。
如果是单页面应用,为了保证页面路径统计的准确性,需要关闭自动PV,然后在路由跳转前或路由跳转后发送一条sendPV事件,以确保跳转后的url可以被SDK成功记录并上报!
若集成后发现数据量比预想中的要多,请检查第二条发送sendPV事件的时候是否关闭了自动PV,这两个API是相辅相成的,有sendPV的时候必须要关闭自动PV!
若集成后发现没有报错,没有数据,network下没有web_logs发送,请检查是否开启了关闭自动PV,没有手动发送sendPV!
sendPV事件仅有发送PV的功能,无法上报自定义属性,arguments的内容在后台没有展示,请准确区分PV事件与自定义事件(页面点击事件)的区别。
页面点击事件的eventType请务必填写 'CLK' 此处为固定值,eventParams里的eventValue严格区分数值型和字符型,第一次上报的eventValue类型将决定eventName的类型,且后续无法更改!
以下保留字均不可作为属性名称使用:uid、aplus、spm-url、spm-pre、spm-cnt、pvid、dev_id、anony_id、user_id、user_nick、_session_id、id、ts、du、token、device_name、device_model 、device_brand、country、city、channel、province、appkey、app_version、access、launch、pre_app_version、terminate、no_first_pay、is_newpayer、first_pay_at、first_pay_level、first_pay_source、first_pay_user_level、first_pay_version、page、path、openid、unionid、scene
有日志上报,但是后台没有数据,请检索集成代码是否错误的配置了idtype!
一、快速集成
1.1 登录

应用注册成功后,跳转到第二步SDK的安装及集成,此时会得到集成sdk所需要的appkey

1.2 集成SDK
在页面head标签内加入集成代码,确保aplus_queue不被污染。
若当前集成SDK项目使用的是单页面应用例如:React、Vue、Angular等,请将下方的SDK代码放在项目的index.html,在单页面项目中index.html的优先级是最高的,所有文件都会通过index.html呈现。
<head>
<script>
(function(w, d, s, q, i) {
w[q] = w[q] || [];
var f = d.getElementsByTagName(s)[0],j = d.createElement(s);
j.async = true;
j.id = 'beacon-aplus';
j.src = 'https://d.alicdn.com/alilog/mlog/aplus/' + i + '.js';
f.parentNode.insertBefore(j, f);
})(window, document, 'script', 'aplus_queue', '203467608');
//集成应用的appKey
aplus_queue.push({
action: 'aplus.setMetaInfo',
arguments: ['appKey', 'xxxxxxx']
});
/* 如果使用的是单页面应用,例如:React、Vue、Angular等,则需要添加下面的代码 */
/* 关闭自动PV发送,如果不是单页面应用,请删掉下方代码 */
aplus_queue.push({
action: 'aplus.setMetaInfo',
arguments: ['aplus-waiting', 'MAN']
});
//是否开启调试模式
aplus_queue.push({
action: 'aplus.setMetaInfo',
arguments: ['DEBUG', true]
});
</script>
</head>在完成当前步骤之后,您就可以开始在应用工程开始埋点了。
二、事件埋点
重要提示:每次调用aplus_queue需先声明 const {aplus_queue} = window;
2.1 SDK设置
2.1.1 setMetaInfo
用于变更SDK的默认设置
const {aplus_queue} = window;
aplus_queue.push({
action: 'aplus.setMetaInfo',
arguments: [metaName, metaValue, mode]
});其中:
metaName 为可配置的元数据项,可配置的 meta项见下文附表1:metaName 及 metaValue 对应表
metaValue 为对应的元配置项取值
mode 为模式,其取值为枚举值:
"OVERWRITE": 覆盖模式,原 meta 值将直接被覆盖,注意对于取值为单值的 meta 只有覆盖模式
默认值
"APPEND": 追加模式,仅适用于 meta 取值为数组对象的 meta,追加模式下原取值保留
2.1.2 getMetaInfo
用于动态获取 SDK 的当前配置
aplus.getMetaInfo(metaName);目前支持的 metaName 及 metaValue见,附表1
2.2 异步上报
有些信息如用户id、用户昵称等是异步获取的,这种情况下如果您需要等待异步信息获取成功后再上报日志,sdk这边提供了设置元配置信息_hold = BLOCK 来阻塞上报,再时机成熟时通过更新元配置信息_hold=START来开启上报
const {aplus_queue} = window;
//如采集用户信息是异步行为,需要先阻止SDK上报,设置BLOCK埋点
aplus_queue.push({
action: 'aplus.setMetaInfo',
arguments: ['_hold', 'BLOCK']
});
//异步耗时流程 (如获取user_id)
aplus_queue.push({
action: 'aplus.setMetaInfo',
arguments: ['_user_id', 'test_user_id']
});
// 因为采集用户信息是异步行为,故需要先设置BLOCK,再设置START
// 设置_hold=START后,事先被block住的日志会携带上用户信息逐条发出
aplus_queue.push({
action: 'aplus.setMetaInfo',
arguments: ['_hold', 'START']
});2.3 页面曝光事件
sendPV
若当前项目为单页面应用时,需要在路由跳转的时候手动发送一次PV,使用下方的PV发送事件发送,此API并非是自定义事件,arguments的属性不在后台中展示,自定义事件请参考下方页面点击事件
const {aplus_queue} = window;
aplus_queue.push({
action: 'aplus.sendPV',
arguments: [{is_auto: false}] // 此处上报的数据暂时在后台没有展示
});效果如:

:sdk 默认提供自动pv的能力;但若metaInfo配置信息中aplus-waiting等于MAN时,此时pv的发送时机改为由开发者自己控制,特别是当您的H5应用是一个单页应用时,您必须通过调用sendPV来发送页面曝光事件;pv事件一定要发送,否则影响新增、活跃、分享回流等指标的计算!!
2.4 页面点击事件
record
record 用于发送一条事件日志,其 API 定义如下:
const {aplus_queue} = window;
aplus_queue.push({
action: 'aplus.record',
arguments: [eventCode, eventType, eventParams]
});其中,
eventCode:事件ID 或 事件编码,字符串类型
eventType:'CLK' , 固定值
eventParams 为本次事件中上报的事件参数。其取值为一个JSON对象(平铺的简单对象,不能多层嵌套)
调用 record api 上报参数时,该次赋值仅对该条事件有效
SDK保留属性:uid, aplus, spm-url, spm-pre, spm-cnt, pvid,dev_id,anony_id,user_id,user_nick, _session_id
const {aplus_queue} = window;
//一个简单的demo
aplus_queue.push({
action: 'aplus.record',
arguments: ['yourTrackerEventCode', 'CLK', {
param1: '111',
param2: '222',
param3: 333
}]
});效果如下:

2.5 预制元素事件
2.5.1 手动曝光
借用record API的能力,当事件id为$$_exposure时,事件被统计为预制元素曝光事件,支持聚合上报和单独上报待曝光元素的id
待曝光元素key为字符串类型, 取值value为字符串或Number类型,长度均限制为128位字符以内;如果聚合上报,最多支持100个key
API调用方式如下:
const {aplus_queue} = window;
//一个简单的demo
aplus_queue.push({
action: 'aplus.record',
arguments: ['$$_exposure', 'EXP', {
//key为字符串类型, value为字符串或Number类型,长度均限制在128位字符以内
id1: "testItemId1",
id2: "testItemId2",
id3: "testItemId3"
}]
});效果图如下:

2.5.2 自动曝光
通过手动曝光的方式,开发者需要自己考虑元素曝光的时机,为了方便开发者使用曝光功能,sdk增加了元素自动曝光的能力,开发者需修改DOM元素配置如下:
配置待曝光元素的class
配置待曝光元素需携带的自定义参数,需使用数据属性data-xxx模式
<body>
...
<div class="parent">
<div class="auto-exp-component" data-itemid="test_exp_id">
自动曝光元素,无需点击
</div>
</div>
...
</body>同时为了识别需要曝光的元素,sdk 需要增加如下配置:
const { aplus_queue } = window;
aplus_queue.push({
action: 'aplus.setMetaInfo',
arguments: ['aplus-auto-exp', [
{
// 需要曝光的元素class
cssSelector: '.auto-exp-component',
//如果页面模块是元素内滚动(某个区块内有滚动条)则需要增加positionSelector辅助定位曝光元素
positionSelector: '.parent',
logkey: 'test_event_id', //事件管理中的事件id
props: ['data-itemid'], // 你要曝光的元素身上自定义属性
},
...
],
],
});注意:1. 自动曝光默认规则是符合埋点选择器的模块的30%面积出现在视口内达到500ms,如果存在浮层层叠也依然会上报;2.如果页面模块是元素内滚动(某个区块内有滚动条)则需要增加positionSelector辅助定位曝光元素
效果如下:

三、h5分享统计
为了满足移动端H5统计分析、分享回流等业务场景,sdk同时提供了如下API以满足业务需求:
3.1 getTrackCode
用于获取记录下个分享人的trackCode,调用时机由开发者自定义
请求示例:
//query信息来源于浏览器url后面查询信息,例如:http://www.test.com?a=1&b=2&c=3
//这里query就是{a:1, b:2, c:3}这样的字典,由开发者自行解析
let data = {
appkey: query.fromappkey,
openid: oid || query.id,
unionId: query.uid || 'aTestUnionid',
trackCode: query.tc || '',
rootTrackCode: '',
url: location.href || 'testurl'
};
aplus.getNextTrackCode(data, function(data){
console.log('NextTrackCode:', data.trackCode);
});请求参数
属性名 | 类型 | 必填 | 描述 | 默认值 | 示例 |
appkey | string | 是 | 应用appkey | undefined | xxxxxxxxx |
openid | string | 是 | 业务域用户唯一标识 | 由服务端下发的cookieId | xxxxxxxx |
unionid | string | 是 | 微信场景下用户唯一标识,微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的 | undefined | xxxxxxxx |
trackcode | string | 否 | 上一个分享人的trackCode | undefined | baa8bdc7a40cacf120eca878701ed9ab |
rootTrackCode | string | 否 | 初始trackCode | undefined | baa8bdc7a40cacf120eca878701ed9ab |
url | string | 否 | 分享url | location.href | https://www.umeng.com |
callback | function | 是 | 请求回调函数 | undefined | () => {} 或者 function(){} |
返回响应:
//success
{
trackCode,
_um_ssrc
}
//fail
{} //空对象3.2 trackShare
预制分享事件,底层依赖业务日志API record,独立封装方便开发者调用,调用时机由开发者自定义
请求示例:
aplus.trackShare({a: 1, b: 2}, function(){
console.log('分享回调');
});请求参数:
属性名 | 类型 | 必填 | 描述 | 默认值 | 示例 |
data | object | 否 | 用户自定义参数 | undefined | {a: 1, b: 2} |
callback | function | 否 | 请求回调函数 | undefined |
请求响应:参照业务日志API record 调用结果
3.3 uploadUserProfile
用户信息上报接口,调用时机由开发者自定义
请求示例
var ui = {
ak: 'testappkey',
sdt: 'h5mp',
aid: '',
uin: 'testusernick',
uia: 'testuseravatar',
uig: 'female',
uit: 'China',
uip: 'Beijing',
uic: 'Beijing',
uil: 'Chinese',
id: 'atestUserid',
it: 'cnaid' //请与aplus-idtype值保持一致
};
aplus.uploadUserProfile(JSON.stringify(ui), function(res) {
console.log('uploadUserProfile: ', res);
});请求参数:
参数 | 类型 | 必填 | 描述 | 默认值 | 示例 |
ui | string | 是 | 用户信息Object的json string | "" | |
callback | funtion | 否 | 请求回调 | undefined | () => {} |
属性说明 | 类型 | 是否必填 | 说明 |
ak | string | 是 | appkey |
sdt | string | 是 | sdktype |
aid | string | 否 | appid |
uin | string | 否 | 用户昵称 |
uia | string | 否 | 头像url |
uig | string | 否 | 性别 |
uit | string | 否 | 国家 |
uip | string | 否 | 省 |
uic | string | 否 | 城市 |
uil | string | 否 | 语言 |
id | string | 是 | 用户id |
it | string | 是 | id_type |
请求响应:
// success
{
"msg": "成功",
"code": 200,
"data": "ok"
}
//fail
{} //空对象四、 H5自定义ID代码示例
一般情况下H5 SDK对于用户的统计会使用SDK自动生成的cnaid,少数情况下可能我们会有自定义id的需求,友盟SDK提供了自定义id的API,示例如下:
// 此处文档以uuid作为示例
const {aplus_queue} = window;
aplus_queue.push({ // 设置idtype
action: 'aplus.setMetaInfo',
arguments: ['aplus-idtype', 'uuid'] //取值参考见附表1
});
aplus_queue.push({ //设置userid
action: 'aplus.setMetaInfo',
// uuid一般是一个32位的随机字符串,当前value仅作为示例参考
arguments: ['uuid', 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx']
});附表1:metaName 及 metaValue 对应表
MetaName | 元配置说明 | metaValue赋值说明 | 是否已支持 |
globalproperty | 全局属性,设置全局属性后,此后自定义事件、PV均会携带上报 | 一级的key-value对象结构举例:aplus_queue.push({action: 'aplus.setMetaInfo',arguments: ['globalproperty', {a: 1, b: 2}]}); | Y |
aplus-rhost-v | 采集上报域名 | 默认值 umini.shujupie.com | Y |
_user_id | 设置userid | 业务自定义的登录账号ID | Y |
_user_nick | 上报用户信息需要 | 业务自定义的登录账号昵称 | Y |
_hold | 发送Hold信号. 在 SDK整个生命周期内, _hold只能被设置一次 | 枚举类型, 可用值及说明如下:"START": 开启日志发送"BLOCK": 阻止日志发送,可以在 BLOCK状态之前,完善发送日志前的准备工作 | Y |
aplus-waiting | 日志发送时机设置 | 枚举类型,可用值及说明如下:"1": 等待6秒后尝试发送"N": N取值为300-3000之间的整数值 , 所有日志指令在SDK初始化完成后的N毫秒内将被hold在指令队列, 直至N毫秒等待结束."MAN": 取消自动化PV日志采集. 设置为MAN之后, 所有PV日志均需手动触发, 但其他类型的事件日志不受影响 | Y |
openid | 微信体系下用户标识 | 无默认值 | Y |
unionid | 微信体系下公众号、小程序等用户唯一标识 | 无默认值 | Y |
anouymousopenid | 字节小程序用户唯一标识 | 无默认值 | Y |
alipayid | 支付宝小程序用户唯一标识 | 无默认值 | Y |
swanid | 百度小程序用户唯一标识 | 无默认值 | Y |
uuid | 业务方自定义的随机id | 无默认值 | Y |
aplus-idtype | 指定用于生成umid的id类型 | openid,unionid,alipay_id,uuid,anonymousid,cnaid 注:如果设置了idtype,必须同步设置对应平台的唯一id,如:idtype=openid, 则需要同步上报openid | Y |