1. 所有小程序 SDK 常见问题

1.1. 为什么项目中看不到线上版小程序的数据?

  1. 检查代码逻辑是否有运行 init() 方法;
  2. 检查数据接收地址指向的项目与所看的项目是否一致;
  3. 检查数据接收地址是否在管理平台服务器域名中配置;
  4. 检查埋点管理中是否有报错数据;

1.2. 如何获取 Distinct ID?

可以通过调用小程序 SDK 提供的 sa.store.getDistinctId() 接口获取 Distinct ID;如果是在 login() 方法之后调用,获取到的就是登录 ID;

1.3. 如何修改匿名 ID?

可以通过调用小程序 SDK 提供的 sa.identify('anonymousID', true) 接口修改匿名 ID ;

相关 API 介绍:

1.4. 如何获取公共属性?

微信小程序 SDK 可以通过调用小程序 SDK 提供的 sa.getPresetProperties() 接口获取部分公共属性;注意,该方法并不能获取到所有的公共属性,只能获取到所有事件都有的预置属性;

1.5. 如何统计小程序某个页面的停留时长

客户有时需要统计用户在小程序中某个页面的停留时长,可以参考如下代码中的逻辑采集页面停留时长

index.js

var timer;
Page({
	onShow:function(){
		timer = new Date().getTime();
	},
	onHide:function(){
		let duration = new Date().getTime() - timer;
		// 引入 SDK 之后才可以这样使用
		getApp().sensors.track('countScanTime',{
			duration: duration
		})
	}
});
JS

2. 微信小程序 SDK 常见问题

2.1. 如何获取匿名 ID?

可以通过调用微信小程序 SDK 提供的 sa.quick('getAnonymousID') 接口获取匿名 ID 。如果是在 login() 方法之后调用,获取的仍然是匿名 ID;

2.2. 预置事件设置自定义属性

用户可以在相应生命周期函数执行之前,对预置事件 $MPLaunch、 $MPShow、 $MPHide、 $MPViewScreen、$MPShare 添加自定义属性,可以通过为暴露出来的 sa.para.autoTrack 对象的相关属性设置一个属性值为对象或者返回值是对象的函数值实现。

app.js

/**
若用户想在 $MPLaunch 事件中添加appId,query等来源相关的自定义属性,可以通过下面方法实现
注意:该代码建议嵌入到相应js文件的顶部。
*/
var sa = require('./utils/sensorsdata.min.js');
sa.setPara({
name: 'sensors',
	server_url: '数据接收地址',
	autoTrack: {
		appLaunch : true,
		appShow : true,
		appHide : true,
		pageShow : true,
		pageShare : true
	}
});
sa.init();
App({
	onLaunch: function( data ){
		//给 $MPLaunch 事件添加自定义属性
		sa.para.autoTrack.appLaunch = {
			appId:data.referrerInfo.appId,
			query:data.query
		};
	},
	onShow: function( data ){
		//给 $MPShow 事件添加自定义属性
		sa.para.autoTrack.appShow = {
			appName: '神策小程序'
		}
	},
	onHide: function(){
		//给 $MPHide 事件添加自定义属性
		sa.para.autoTrack.appHide = {
			endTime: new Date()
		}
	}
})
JS


index.js

var app = getApp();
Page({
	onShow: function(){
		//给 $MPViewScreen 事件添加自定义属性
		app.sensors.para.autoTrack.pageShow = {
			pageName : '首页'
		}
	},
	onShareAppMessage: function(){
		app.sensors.para.autoTrack.pageShare = {
			sharePageName : '首页'
		}
	}
});
JS

2.3. 如何设置批量发送?

  1. 可配置是否批量发送数据 batch_send:true ;默认情况下,会每隔 6s 或者每采集 6 条数据后合并发送一次;
  2. 可配置使用批量发送数据,且可配置批量发送数据的时间间隔或条数 batch_send : { send_timeout : 5000, max_length : 20 };
  3. 使用批量发送的话,需要升级到神策 1.11 以上(后端增加 _track_id 功能);
  4. 批量发送中有一个优化,如果是 $MPLaunch 事件会直接发送,不会等待,因为考虑到会有较多用户打开就关闭小程序,甚至永远不来,如果使用等待 6s 的批量发送策略,会导致数据丢失,跟其他统计工具对不上;
  5. 注意:1.13.15 版本之前的 SDK 批量发送功能在网络由无网恢复到有网状态后,数据无法再发送成功的问题;该问题在 1.13.15 版本修复。

2.4. 如何设置自定义渠道参数?

微信小程序 SDK 从 1.13.8 版本开始支持 SDK 自动解析自定义渠道参数的功能;用户可以在初始化时,通过设置 source_channel:['a', 'b'] 设置要解析的自定义参数 a, b;当通过带有设置的自定义参数路径访问小程序时,神策微信小程序 SDK 就可以通过生命周期函数参数对象将自定义参数 a, b解析出来,并设置到预置事件中。

2.5. init() 方法作用?是否可以多次调用?

init() 方法是用来通知微信小程序 SDK,初始化已经完成,可以通过网络请求发送数据了;init() 方法调用之前通过 track() 方法采集的数据会被保存到一个发送队列中,当调用 init() 之后,会先将队列中的数据发送出去,再正常发送数据,不做缓存。

可以多次调用 init() 方法。

2.6. 渠道相关属性介绍

如何使用神策微信小程序 SDK 进行渠道追踪请参考此文档:小程序渠道追踪

2.6.1. 渠道相关属性

在小程序 App 实例生命周期函数 onLaunch 和 onShow ,还有页面的生命周期函数 onShow 中,我们会自动解析启动参数对象与页面参数对象中的渠道相关参数(包含通过 source_channel 自定义的渠道参数以及预置的 utm 渠道参数)作为这三个预置事件的渠道属性,见截图

2.6.2. 最近一次渠道相关属性

在小程序 App 实例生命周期函数 onLaunch 和 onShow 中,我们会将从启动参数对象中解析出来的渠道参数保存在 $latest_utm 相关属性或 _latest 自定义渠道相关属性变量中;

默认情况下,即 is_persistent_save 设置为 false 的情况下

当下次启动,热启动时,如果启动参数中带有 utm 渠道参数,会将上次启动的$latest_utm 渠道相关属性重置,只保留本次热启动解析出来的 $latest_utm 渠道相关属性;如果启动参数中没有 utm 渠道参数,会保留上次内存中保存的 $latest_utm 相关属性;

冷启动时,$latest_utm 渠道相关属性会自动重置;

最近一次自定义渠道属性(通过 source_channel 设置采集的那些渠道属性)在小程序生命周期(从冷启动到退出)有效,下次冷启动时,会被重置;

is_persistent_save 设置为 true 的情况下
我们会将从启动参数对象中解析出来的渠道参数赋值给 $latest_utm 渠道相关属性或 _latest 自定义渠道相关属性,并将$latest_utm 渠道相关属性或 _latest 自定义渠道相关属性保存到 storage 中;

当下次启动(无论热启动或者冷启动)时,如果启动参数中带有 utm 渠道参数,会将上次启动的 $latest_utm 渠道相关属性重置,只保留本次启动解析出来的 $latest_utm 渠道相关属性;如果启动参数中没有 utm 渠道参数,会保留上次启动解析出来的 $latest_utm 相关属性;

最近一次自定义渠道属性(通过 source_channel 设置采集的那些渠道属性)会一直有效,直到小程序被删除;

2.6.3. 首次渠道的相关属性

在小程序 SDK 发现设备之前没有加载过 SDK ,且冷启动时在小程序 App 实例生命周期函数 onLaunch 中能解析到渠道相关参数(包含通过 souce_channel 自定义的渠道参数以及预置的 utm 渠道参数) 时,会通过 setOnceProfile() 接口来设置用户属性。

2.6.4. 特殊处理

  • 扫描普通链接二维码时,会去解析参数对象 query 中的 q 属性;
  • 扫描 getUnlimited() 接口生成的小程序码时,会去解析参数对象 query 中的 scene 属性;

2.7. 小程序分享的计算逻辑和规则

在 SDK1.9 版本加入了小程序的分享事件 $MPShare ,该事件在小程序中调用分享接口时触发。

$url_path 属性值会记录触发分享的页面地址。

$share_depth 属性值会记录分享的层级:A、B、C为三个不同的用户,若小程序一个页面依照 A -> B -> C 的顺序进行分享,则 A 的分享会被标记为1级分享,B 触发的分享会被标记为2级,C 则为3级分享。

其中,用户打开自己分享的页面是不会增加 $share_depth 的值。

若您希望在后续跟踪分享的效果,需要配置 allow_amend_share_path 为 true,这样神策会自动修改分享的path参数,path后面会新增参数包含distinct_id,分享次数,页面路径信息。在该分享页面被打开时,会自动解析到$MPLaunch 和 $MPShow 中。

2.8. 预置事件添加异步自定义属性值

  1. 如果是添加不需要延迟获取的属性,可以参考文档预置事件设置自定义属性中描述的方案添加。
  2. 如果是需要延迟才能获取的属性,首先需要关闭 autoTrack 对应的预置事件,然后手动去发送。
    • 方案一:如果不需要采集预置事件的预置属性,可以通过 track 方法发送个对应的预置事件,加延迟的属性就可以(建议使用此方案)
    • 方案二:如果需要采集预置事件的预置属性,需要在相应的生命周期函数中调用如下方法(预置事件 $MPViewScreen $MPShare 设置自定义属性不支持这种方案 )

app.js

//引入文件并完成初始化
var sa = require('./utils/sensorsdata.min.js');
sa.setPara({
	name: 'sensors',
	server_url: '数据接收地址',
	autoTrack: {
		appLaunch: false,
		appShow: false,
		appHide: false,
		pageShow: false,
		pageShare: false
	}
});
sa.init()
/**
	方案一
*/
App({
	onLaunch : function(options){
		// $MPLaunch 事件增加自定义属性
		wx.request({
			url: 'xxxx',
			success:function(res){
				//此处表示异步获取到要设置的属性的值
				sa.track('$MPLaunch',{
					goodsID: 'xxxx'
				});
			}
		});
	},
	onShow : function(options){
		// $MPShow 事件增加自定义属性
		wx.request({
			url: 'xxxx',
			success:function(res){
				//此处表示异步获取到要设置的属性的值
				sa.track('$MPShow',{
					goodsID: 'xxxx'
				});
			}
		});
	},
	onHide : function(){
		// $MPHide 事件增加自定义属性
		wx.request({
			url: 'xxxx',
			success:function(res){
				//此处表示异步获取到要设置的属性的值
				sa.track('$MPHide',{
					goodsID: 'xxxx'
				});
			}
		});
	}
});

// index.js
Page({
	onShow:function(){
		//给 $MPViewScreen 添加预置属性
		wx.request({
			url: 'xxxx',
			success:function(res){
				//此处表示异步获取到要设置的属性的值
				sa.track('$MPViewScreen',{
					goodsID: 'xxxx'
				});
			}
		});
	}
});

/**
	方案二
*/
App({
	onLaunch : function(options){
		// $MPLaunch 事件增加自定义属性
		wx.request({
			url: 'xxxx',
			success:function(res){
				//此处表示异步获取到要设置的属性的值
				sa.quick('appLaunch', options, {
					'goodsID' : 'xxxx'
				});
			}
		});
		
	},
	onShow : function(options){
		// $MPShow 事件增加自定义属性
		wx.request({
			url: 'xxxx',
			success:function(res){
				//此处表示异步获取到要设置的属性的值
				sa.quick('appShow', options, {
					'goodsID' : 'xxxx'
				});
			}
		});
	},
	onHide : function(){
		// $MPHide 事件增加自定义属性
		wx.request({
			url: 'xxxx',
			success:function(res){
				//此处表示异步获取到要设置的属性的值
				sa.quick('appHide', {
					'goodsID' : 'xxxx'
				});
			}
		});
	}
});
JS

3. 支付宝小程序 SDK 常见问题

3.1. 为什么预置事件 $MPClick 有的预置属性没有采集?

$MPClick 事件中 $element_id、$element_name 和 $element_content 这三个预置属性的采集依赖被点击元素是否设置 id、data_name、data_content。建议在被点击元素中定义 id、data-name、data-content 这三个属性之一来标识元素的采集,否则在神策分析后台无法分辨 $MPClick 事件由哪个元素触发。

<view onTap='testTap' id='testId' data-name='testName' data-content='testContent'>点击事件</view>
JS
  • $element_name 对应点击元素的 data-name 属性;
  • $element_id 对应点击元素的 id 属性;
  • $element_content 对应点击元素的 data-content 属性。