比如业务有账号体系,并希望SDK同步用户状态。就可以考虑在用户登录后立即对SDK设置user_unique_id,在用户登出后立即对SDK清除user_unique_id。
说明
提示:用户登录态概念是站在业务角度的一个说法,SDK本身是没有用户登录/登出概念的,SDK只关心user_unique_id是否有被主动设置。
import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... }); $$sdk.send(); // 用户登录后立即设置user_unique_id $$sdk.config({ user_unique_id: '{{uuid}}', // 值可以考虑为能关联到用户的一些属性 }); // 用户登出后立即清除user_unique_id $$sdk.config({ user_unique_id: '', });
另外SDK的2.6.0+
版本提供setUserUniqueID
方法来设置user_unique_id。
import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... }); $$sdk.send(); // 用户登录后立即设置user_unique_id $$sdk.setUserUniqueID('{{uuid}}'); // 值可以考虑为能关联到用户的一些属性 // 用户登出后立即清除user_unique_id $$sdk.setUserUniqueID('');
此场景下,您需要先获取openid/unionid(通常这些id需为业务的服务端携带code向小程序开放平台接口,比如code2Session,发起请求,换取openid、unionid、session_key等信息),然后使用config或setUserUniqueID方法设置给SDK。
下面以微信小程序平台举例:
import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... }); $$sdk.send(); App({ //... onLaunch() { // ... wx.login({ success(res) { if (res.code) { wx.request({ url: 'https://xxxxxx.com/', // 业务自身的服务端接口,去请求小程序开放平台接口换取openid/unionid的 data: { code: res.code, }, success(res) { // 希望使用openid设置user_unique_id if(res.openid) { $$sdk.config({ user_unique_id: res.openid, }); } // 或者希望使用unionid设置user_unique_id if(res.unionid) { $$sdk.config({ user_unique_id: res.unionid, }); } } }); } } }); } });
如果要设置用户口径,需要在设置user_unique_id的同时设置user_unique_id_type。
import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... }); $$sdk.send(); $$sdk.config({ user_unique_id: 'tangseng', user_unique_id_type: 'huoshan', // user_unique_id_type的值是预制好的 });
说明
提示:user_unique_id_type的值是提前预制好的,具体找您的项目经理或客户成功经理。
如果要进行多口径绑定,在设置user_unique_id的同时设置user_unique_id_type后,还需要调用bind方法处理。注意:SDK版本要求2.11.0+,并且仅在SAAS云原生、私有化支持。
说明
当前仅SaaS-云原生环境、私有化环境支持多用户口径能力,SaaS-非云原生环境不支持。使用前,您需联系火山引擎技术支持人员开启功能开关并完成多口径的录入配置,多用户口径的端到端操作指导请参见使用多ID类型。
import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... }); $$sdk.send(); // 示例中phone和email只是举例,具体传什么口径由业务决定 $$sdk.bind({ phone: '130xxxxxxxx', email: 'xxx@yyy.com' }).then((status) => { // status的值是true或者false, true表示成功、false表示失败 // 业务根据status进行后续处理,可选处理 });
SDK会为您自动生成web_id、ssid,如果您希望获取SDK默认生成的这些id,可参考以下方式。
获取web_id
import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... }); $$sdk.send(); $$sdk.on($$sdk.types.Ready, () => { const webid = $$sdk.getConfig('web_id'); console.log('web_id', webid); });
获取ssid
注意:获取ssid时,实际需要调用getToken获取到ssid,该方法会发起请求去DataFinder的数据流服务中获取ssid,ssid不在SDK侧进行管理。
import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... }); $$sdk.send(); $$sdk.getToken().then((ids) => { const ssid = ids.ssid; console.log('ssid', ssid); });
通常情况下您可以直接使用SDK自动生成的Web_id,部分特殊场景下,如果您希望使用自定义的web_id来覆盖SDK自动生成的web_id时,可参考以下方法。
如需希望覆盖SDK默认生成的web_id,首先需要在初始化时开启enable_custom_webid: true
,然后再设置web_id。
import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... enable_custom_webid: true, }); $$sdk.send();
开启后,需要业务主动config设置web_id。
说明
提示:当开启enable_custom_webid: true
后,SDK会等待业务主动设置web_id,如果web_id一直没有被设置,SDK不会上报事件。
web_id的值要求纯数字或全是数字的字符串类型,并且数值最大不能超过2的64次方。不同用户的web_id不应该相同。
import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... enable_custom_webid: true, }); $$sdk.send(); // 在适当时机主动设置web_id $$sdk.config({ web_id: '12345678910', });
另外也可以使用SDK提供的setWebIDviaUnionID
和setWebIDviaOpenID
两个方法来设置web_id。
setWebIDviaUnionID
:满足业务使用获取到用户的unionid来设置web_id。
import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... enable_custom_webid: true, }); $$sdk.send(); // 在获取到用户的unionid后设置web_id $$sdk.setWebIDviaUnionID('{{用户的unionid}}');
setWebIDviaOpenID
:满足业务使用获取到用户的openid来设置web_id。
import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... enable_custom_webid: true, }); $$sdk.send(); // 在获取到用户的openid后设置web_id $$sdk.setWebIDviaOpenID('{{用户的openid}}');
小程序自身在与其内部H5页面之间有诸多限制,小程序平台本身提供的能力也有限。目前SDK这边只提供将web_id传递给H5页面。
SDK提供了createWebViewUrl
和createWebViewUrlAsync
两个方法可以把web_id传递给H5页面。
createWebViewUrl
:在小程序内的webview组件的url上添加web_id传递给h5页面,需要注意的是该方法只能在SDK初始化完成后使用才可能保证有web_id。
<!-- webview.wxml --> <web-view src="{{ webUrl }}"></web-view>
// webview.js Page({ data: { webUrl: '' }, onLoad(options) { let url = 'https://example/demo.html'; this.setData({ webUrl: $$sdk.createWebViewUrl(url), }); } });
createWebViewUrlAsync
:这个是createWebViewUrl
的异步版本,返回promise,不受SDK初始化情况的影响,一定会获取到web_id。
<!-- webview.wxml --> <web-view src="{{ webUrl }}"></web-view>
// webview.js Page({ data: { webUrl: '' }, onLoad(options) { let url = 'https://example/demo.html'; $$sdk.createWebViewUrlAsync(url).then((webviewUrl) => { this.setData({ webUrl: webviewUrl, }); }); } });
说明
提示:createWebViewUrl
和createWebViewUrlAsync
两个方法本质上都是在webview组件的src上追加web_id参数,达到把web_id传递给H5页面的目的。
开启预置事件自动上报,需要在初始化时配置auto_report
参数为true。
说明
提示:小程序预置事件请参考小程序预置事件及属性,自定义事件的事件名请勿与预置事件重名。
参数 | 类型 | 说明 |
---|---|---|
auto_report |
| {
说明
|
示例:
{}
就可以import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... auto_report: true, }); $$sdk.send();
import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... auto_report: { click: true, }, }); $$sdk.send();
import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... auto_report: { click: true, appError: false, }, }); $$sdk.send();
当click设为true时,SDK将在那些绑定了一些事件函数的组件被点击时上报bav2b_click事件(目前只支持bindtap类型),该事件会采集组件上的dataset数据集中的内容作为参数上报。 假设如下组件,设置了id="diandian"以及data-hi="hello"
<view id="diandian" data-hi="hello" bindtap="tapMethod">点我</view>
当该组件被点击时,上报bav2b_click事件以及采集的属性大概如下
{ event: 'bav2b_click', params: { path: 'pages/index/index', query_id: 'diandian', query_hi: 'hello' } }
SDK版本2.12.0+开始支持属性过滤能力:初始化参数增加clickIgnoreProperty,类型数组,在click设置为true的情况下有效,作用是过滤被点击元素的dataset值中相应的属性,比如设置了['abc', 'xxx'],那么所有被点击元素的属性上有abc或xxx的都会被过滤掉,不会采集。
全局设置方式,示例:
import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... auto_report: { click: true, clickIgnoreProperty: ['imgSrc', '...'], }, }); $$sdk.send();
单个元素设置方式,示例
<view bindtap="ontest" data-xxx="xxx-value" data-yyy="yyy-value" data-zzz="zzz-value" data-click-ignore-property="xxx,yyy"></view>
针对app_launch
、app_terminate
事件:在SDK初始化后就可以进行监听“ExtendAppLaunch”、“ExtendAppTerminate”消息。
import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... }); // 扩展app_launch事件参数 $$sdk.on($$sdk.SdkHook.ExtendAppLaunch, (params) => { params['xxx'] = '我是额外的xxx参数'; // 可以扩展多个 }); // 扩展app_terminate事件参数 $$sdk.on($$sdk.SdkHook.ExtendAppTerminate, (params) => { params['zzz'] = '我是额外的zzz参数'; // 可以扩展多个 }); $$sdk.send();
针对predefine_pageview
、predefine_pageview_hide
事件:在每个页面(Page)的onLoad方法中监听“ExtendPageShow”、“ExtendPageHide”消息,为了避免页面的onLoad多次执行导致的多次监听,最好在onUnload中移除相应监听(off)。
// 某个页面 Page({ // 其他代码... pageShowHook(params) { // 首先判断是不是当前页面,假设当前页面为pages/index if (params.path.indexOf('pages/index') !== -1) { params['abc'] = '我是额外的abc参数'; // 可以扩展多个 } }, pageHideHook(params) => { // 首先判断是不是当前页面,假设当前页面为pages/index if (params.path.indexOf('pages/index') !== -1) { params['def'] = '我是额外的def参数'; // 可以扩展多个 } }, onLoad() { // 其他代码... // 扩展predefine_pageview事件参数 $$sdk.on($$sdk.SdkHook.ExtendPageShow, this.pageShowHook); // 扩展predefine_pageview_hide事件参数 $$sdk.on($$sdk.SdkHook.ExtendPageHide, this.pageHideHook); }, onUnload() { // 其他代码... // 移除针对predefine_pageview事件的监听 $$sdk.off($$sdk.SdkHook.ExtendPageShow, this.pageShowHook); // 移除针对predefine_pageview_hide事件的监听 $$sdk.off($$sdk.SdkHook.ExtendPageHide, this.pageHideHook); }, // 其他代码... });
使用config方法可以设置公共属性,这些公共属性会在后续所有事件上报都携带上。
import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... }); $$sdk.send(); // 设置事件公共属性,这些公共属性会在后续所有事件上报时都携带上 $$sdk.config({ city: '南京', nick_name: 'vikings', });
另外SDK的2.6.0+
版本提供setHeaderInfo
和removeHeaderInfo
两个方法来处理事件公共属性。
import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... }); $$sdk.send(); // 设置公共属性city,值为南京 $$sdk.setHeaderInfo('city', '南京'); // 移除公共属性city $$sdk.removeHeaderInfo('city');
SDK内部预设了一些公共属性字段,这些字段预定义好了字段名,如下表所列,其中部分字段,SDK在初始化完成后会自动尝试获取,而其他字段需要业务方设置,比如nick_name
、gender
、avatar_url
这些SDK无法自动获取到的,就需要您主动进行设置。
字段 | 类型 | 说明 | 是否自动设置 | 举例 |
---|---|---|---|---|
device_brand | string | 设备品牌 | 自动 | "iPhone" |
device_model | string | 设备型号 | 自动 | "iPhone 7" |
os_name | string | 客户端系统 | 自动 | "ios" |
os_version | string | 客户端/操作系统版本 | 自动 | "iOS 10.0.1" |
screen_width | number | 屏幕宽度 | 自动 | 375 |
screen_height | number | 屏幕高度 | 自动 | 812 |
resolution | string | 屏幕分辨率 | 自动 | "375x812" |
access | string | 网络类型 | 自动 | "wifi" |
language | string | 系统语言 | 自动 | "zh_CN" |
app_version | string | 业务小程序版本 | 自动 | "2.5.0" |
device_id | number | 设备id | 业务方设置 | 67834512 |
nick_name | string | 昵称 | 业务方设置 | "张三" |
gender | string | 性别 | 业务方设置 | "male" |
avatar_url | string | 头像 | 业务方设置 | "https://xxx" |
timezone | number | 时区 | 业务方设置 | 8 |
tz_offset | number | 时区偏移 | 业务方设置 | -28800 |
使用默认实例时是包含预置事件插件的,在存在该插件时,SDK监听了小程序的App/Page的相关生命周期钩子,SDK也会等待相关生命周期钩子触发,比如App的onLaunch。
而在分包中,等SDK初始化时,App的onLaunch已经触发结束,因此需要“告诉”SDK“跳过”等待触发,在初始化配置时开启enable_skip_launch: true
。
// 在分包中初始化SDK import $$sdk from '@datarangers/sdk-mp'; $$sdk.init({ // ... enable_skip_launch: true, }); $$sdk.send();
使用多实例,需要导入SDK类,即SDK构造器,位于SDK包中的esm目录下的sdk文件。
import SDK from '@datarangers/sdk-mp/esm/sdk';
提示,如下方式导入的是SDK的默认实例,非SDK构造器。注意观察导入的文件是不一样的。
import $$sdk from '@datarangers/sdk-mp';
示例:
import SDK from '@datarangers/sdk-mp/esm/sdk'; // 对构造器使用new操作产生实例1 $$sdk1 = new SDK(); $$sdk1.init({ app_id: 1, // ... }); $$sdk1.send(); // 对构造器使用new操作产生实例2 $$sdk2 = new SDK(); $$sdk2.init({ app_id: 2, // app_id不能与其他实例相同 // ... }); $$sdk2.send();
说明
提示:
SDK默认导出的实例包含了尽可能多的插件功能。使用自定义选择插件后,比起默认导出的实例在构建后的体积上会少一些。如果业务希望自定义选择使用哪些插件,可以考虑如下使用方式。
// 导入基础类 import BaseSDK from '@datarangers/sdk-mp/esm/base'; // 导入所需插件,比如AB实验插件 import Ab from '@datarangers/sdk-mp/esm/plugin/ab'; BaseSDK.usePlugin(Ab); // 实例化SDK const $$sdk = new BaseSDK(); $$sdk.init({ app_id: 1338, // 替换成申请的app_id enable_ab_test: true,//开启ab实验 }); $$sdk.send();
说明
提示:import $$sdk from '@datarangers/sdk-mp'
,$$sdk
是默认生成的一个实例。import SDK from '@datarangers/sdk-mp/esm/sdk'
,SDK
是类构造器,包含几乎全部功能,上面的$$sdk
本质上就是执行new SDK()
。import BaseSDK from '@datarangers/sdk-mp/esm/base'
,BaseSDK
也是类构造器,包含最基本功能,其他一些功能需要配合相应插件才可以,插件需要使用usePlugin
进行注册。上面SDK
相比BaseSDK
本质上就是默认注册了几乎大部分插件。
SDK默认导出的实例尽可能的兼容目前主流的小程序平台,比如微信、支付宝、抖音、百度、小红书、QQ、钉钉等。如果业务明确自己的小程序应用只会发布到某一平台,比如微信,可以考虑使用如下方式,明确选择哪个平台的入口文件。需要注意的是,单一的平台入口文件只包含基础的功能,使用更多能力需要主动导入相应插件并注册。
// 导入明确的某个小程序平台入口文件 import WXSDK from '@datarangers/sdk-mp/esm/wx'; // 导入所需插件,比如AB实验插件 import Ab from '@datarangers/sdk-mp/esm/plugin/ab'; WXSDK.usePlugin(Ab); // 实例化SDK const $$sdk = new WXSDK(); $$sdk.init({ app_id: 1338, // 替换成申请的app_id enable_ab_test: true,//开启ab实验 }); $$sdk.send();
说明
提示:
在SDK包内,esm这个目录下有wx.js、tt.js、dd.js等等这些文件,代表的就是某一平台入口,wx、tt、dd分别
目前仅支持国密加密方式。相关参数如下:
参数名 | 参数意义 | 类型 | 默认值 |
---|---|---|---|
enable_encrypt | 是否开启加密 | boolean | false |
encrypt_type | 加密类型 | string | 'normal' |
encrypt_public_key | 加密公钥 | string | '04BA9E229380DC0E41E10839B0C52A4763D3EDFE8903F3B8E81395523381E03AA995D295BD4A4088792E4785B224F7837EB4D2C7C05973C7AE8687A35ACAE470A0' |
encrypt_header | 加密国密头字段 | string | 'gm_sm2' |
示例:
import SDK from '@datarangers/sdk-mp/esm/sdk'; // 使用加密插件 import EncryptPlugin from '@datarangers/sdk-mp/esm/plugin/encrypt'; SDK.usePlugin(Ab); // 实例化SDK const $$sdk = new SDK(); $$sdk.init({ // ... //这些是国密加密参数 enable_encrypt: true, encrypt_type: 'sm', encrypt_public_key: '设置公钥', encrypt_header: '', // 国密目前默认为gm_sm2 }); $$sdk.send();
SDK默认会尝试从小程序启动参数上获取utm相关参数:utm_source
、utm_medium
、utm_campaign
、utm_term
、utm_content
。如果获取到了,就将这些参数放入事件公共属性中,后续所有事件上报时都会携带上。该能力自动开启,业务不需要做任何处理。
注意在飞书小组件场景下,不支持预置事件上报(即auto_report参数设置无效)。SDK版本要求:2.9.0+
// 导入飞书小组件的单独入口类 import BlockSDK from '@datarangers/sdk-mp/esm/block'; // 导入所需插件,比如AB实验插件 import Ab from '@datarangers/sdk-mp/esm/plugin/ab'; BlockSDK.usePlugin(Ab); // 实例化SDK const $$sdk = new BlockSDK(); $$sdk.init({ app_id: 1338, // 替换成申请的app_id enable_ab_test: true,//开启ab实验 }); $$sdk.send();
如果业务项目由于一些原因不支持使用npm包、或第三方依赖、甚至没有构建打包处理过程,可以考虑使用SDK提供的umd模块文件。
const $$sdk = require('{{相对路径}}/index.umd.js'); $$sdk.init({ app_id: 1338, // 替换成申请的app_id enable_ab_test: true,//开启ab实验 }); $$sdk.send();