一、Java侧接入说明
简介
https://manual.sensorsdata.cn/sa/latest/java-sdk-1573929.html
快速开始
使用 Maven 集成
<dependencies>
<!-- 引入神策分析 SDK -->
<dependency>
<groupId>com.sensorsdata.analytics.javasdk</groupId>
<artifactId>SensorsAnalyticsSDK</artifactId>
<version>3.4.5</version>
</dependency>
</dependencies>
引入maven仓库修改后的sdk
<dependency>
<groupId>com.navinfo.autoai</groupId>
<artifactId>autoai-tracking-sdk-java</artifactId>
<version>1.1.0-SNAPSHOT</version>
</dependency>
接口地址
http://172.19.230.102/upload?project="应用编码"
在 Spring 框架里面初始化 SDK
@Configuration
public class SensorsConfig {
//上报地址
private static String url = "http://172.19.230.102/upload";
@Resource
RedisService redisService;
@Bean(destroyMethod = "shutdown")
public ISensorsAnalytics init() {
//网络批量发送模式(此模式在容器关闭的时候,如果存在数据还没有发送完毕,就会丢失未发送的数据!!!)
ISensorsAnalytics sa = new SensorsAnalytics(
new FastBatchConsumer(url, false, 100, new Callback() {
@Override
public void onFailed(FailedData failedData) {
//改成写redis,配置定时任务每2小时清一次redis
redisService.lRightPush("FailedData-list", failedData);
}
})
);
//设置公共属性,以后上传的每一个事件都附带该属性服务器属性
SuperPropertiesRecord propertiesRecord = null;
try {
propertiesRecord = SuperPropertiesRecord.builder()
.addProperty("$os",System.getProperties().getProperty("os.name") )
.addProperty("$os_version", System.getProperties().getProperty("os.version"))
.addProperty("$app_code", "smartCarLife")
.build();
} catch (InvalidArgumentException | UnknownHostException e) {
return sa;
}
sa.registerSuperProperties(propertiesRecord);
return sa;
}
}
SensorsConfig.java
url:数据上报地址
onFailed:接口异常回调接口
SuperPropertiesRecord:公共属性,可以省略
普通事件上报(track)
(1)页面配置:
参考元数据管理原型
(2)代码接入
EventRecord firstRecord = EventRecord.builder()
.setDistinctId("cookieId").isLoginId(false)
.setEventName("test_event")
.addProperty("$time", Calendar.getInstance().getTime())
.addProperty("project", "smart车生活")
.addProperty("$token", "abcdefg")
.addProperty("Channel", "")
.addProperty("app_version", "1.0")
.addProperty("city", city)
.addProperty("province", province)
.addProperty("$track_no", IdGenerator.getSn("J"))
.build();
sa.track(firstRecord);
EventRecord firstRecord = EventRecord.builder()
.setDistinctId("registerId").isLoginId(true)
.setEventName("test_event")
.addProperty("$time", Calendar.getInstance().getTime())
.addProperty("project", "smart车生活")
.addProperty("token", "abcdefg")
.addProperty("$track_no", IdGenerator.getSn("J"))
.build();
sa.track(firstRecord);
必传字段:
DistinctId :已登录用户传系统用户id;未登录用户上传匿名id;
匿名由移动端或者web通过请求头传入,请求头名称自定义,例如"Original-Id"、
"cookieId"都行
isLoginId:Boolean类型
EventName: 事件名称对应元数据管理的事件编码,建议英文有意义字符串
track_no:临时必传,神策的track_id字段为Integer类型,长度不够,暂时增加这个字段
自定义字段字段:
根据事件属性上传对应字段,例如
.addProperty("$project", "smart车生活")
.addProperty("$token", "abcdefg")
注册登录——用户绑定(trackSignUp)
sa.trackSignUp(String.valueOf(registerId), request.getHeader(cookieId),
(Map<String, Object>) new HashMap<>().put("$track_no", IdGenerator.getSn("J")));
目的 :registerId和cookieId绑定
触发时机:用户登录时候
用户维护(profileSet)
UserRecord userRecord = UserRecord.builder().setDistinctId(String.valueOf(registerId)).isLoginId(Boolean.TRUE)
.addProperty("name", userPO.getUserName())
.addProperty("phone", userPO.getPhone())
.addProperty("$track_no", IdGenerator.getSn("J"))
.addProperty("$signup_time", userPO.getCreateTime() == null ?
LocalDateTime.now().toString() : userPO.getCreateTime().toString())
.build();
sa.profileSet(userRecord);
目的 :更新用户资料,覆盖更新
触发时机:用户注册和用户资料更新的时候触发
首次用户更新(profileSetOnce)
应该暂时用不到,先不写
问题解答
1.属性名称是否必须加$?
属性名称带$代表是预制属性,不需要在元数据管理页面去配置就能使用的;
当然目前没配置的属性也能使用,还没加检查。
2、目前java服务侧需要接什么业务?
用户注册事件
用户登录事件
其他待定
3、java服务侧需要记录设备id、设备来源、设备版本号、app版本本号怎么办?
服务侧的通用属性只能记录服务端通用的信息;
移动端的信息尽量通过请求头传递过来。
4、元数据怎么配置?
参考文档:先参考原型(待补充)
5 、整体流程如何?
培训下
更新记录:
20220923 移除手动填写track_no字段的要求,系统会根据时间和track_id自动生成
二、WEB侧接入说明
简介
https://manual.sensorsdata.cn/sa/latest/web-js-sdk-7548149.html
三、安卓侧接入说明
参考资料:https://manual.sensorsdata.cn/sa/latest/android-sdk-1573907.html
更新记录:
20220923 移除手动填写track_no字段的要求,系统会根据时间和track_id自动生成
1. 集成神策分析 SDK
1.1. 引入插件
在 project 级别的 build.gradle 文件中添加 android-gradle-plugin2 依赖:
buildscript {
repositories {
mavenCentral()
jcenter()
}
dependencies {
// 添加 gradle 3.2.0+ 依赖
classpath 'com.android.tools.build:gradle:3.5.3'
// 添加神策分析 android-gradle-plugin2 依赖
classpath 'com.sensorsdata.analytics.android:android-gradle-plugin2:3.4.9'
}
}
Android Plugin 需要 Android Gradle Plugin 3.2.0+,否则会导致元素点击事件和 Fragment 的页面浏览事件无法触发,App 和 H5 打通功能受影响。
插件与 SDK 版本依赖关系:
插件版本 | 可用 SDK 版本范围 |
v3.4.0 <= 插件版本 | v5.4.3 <= SDK 版本 |
v3.3.9 == 插件版本 | v5.4.2 == SDK 版本 |
v3.3.4 <= 插件版本 <= v3.3.8 | v5.1.0 <= SDK 版本 <= v5.4.1 |
v3.2.12 <= 插件版本 <= v3.3.3 | v4.3.2 <= SDK 版本 <= v5.4.1 |
v3.2.4 <= 插件版本 <= v3.2.11 | v4.0.7 <= SDK 版本 <= v5.4.1 |
v3.0.0 <= 插件版本 <= v3.2.1 | v3.0.4 <= SDK 版本 <= v5.4.1 |
1.2. 引入 SDK
在主 module 的 build.gradle 文件中应用 com.sensorsdata.analytics.android 插件、添加 SDK 依赖:
apply plugin: 'com.android.application'
// 应用 com.sensorsdata.analytics.android 插件
apply plugin: 'com.sensorsdata.analytics.android'
dependencies {
// 添加 Sensors Analytics SDK 依赖
implementation 'com.sensorsdata.analytics.android:SensorsAnalyticsSDK:6.4.4'
}
-
Android SDK 要求最低系统版本为 API 14(Android 4.0)
-
目前,Android SDK ( aar 格式) 大小约为 800 KB
-
Android SDK 在 AndroidManifest.xml 中注册了可能使用到的权限,具体的权限和用途可参考权限配置说明
2.初始化神策分析 SDK
2.1. 获取项目数据接收地址
数据接收地址:http://172.19.230.102/upload
2.2. 初始化 SDK
String SA_SERVER_URL = "数据接收地址";
// 初始化配置
SAConfigOptions saConfigOptions = new SAConfigOptions(SA_SERVER_URL);
// 开启全埋点
saConfigOptions.setAutoTrackEventType(SensorsAnalyticsAutoTrackEventType.APP_CLICK |
SensorsAnalyticsAutoTrackEventType.APP_START |
SensorsAnalyticsAutoTrackEventType.APP_END |
SensorsAnalyticsAutoTrackEventType.APP_VIEW_SCREEN)
//开启 Log
.enableLog(true);
/**
* 其他配置,如开启可视化全埋点
*/
// 需要在主线程初始化神策 SDK
SensorsDataAPI.startWithConfigOptions(this, saConfigOptions);
延迟初始化 SDK 会导致全埋点采集不准确和可视化全埋点、点击分析功能异常,若 App 有合规需求,可参考 Android 合规步骤。
3. SDK 基本配置
3.1. 开启全埋点
初始化 SDK 时,setAutoTrackEventType() 方法可以配置需要开启的全埋点类型。全埋点其他配置,可参考全埋点 (Android)。
3.2. 设置事件公共属性
对于所有事件都需要添加的属性,初始化 SDK 后,可以通过 registerSuperProperties() 将属性注册为公共属性。设置方法如下:
// 将应用名称作为事件公共属性,后续所有 track() 追踪的事件都会自动带上 "AppName" 属性
try {
JSONObject properties = new JSONObject();
properties.put("AppName", getAppName(this));
SensorsDataAPI.sharedInstance().registerSuperProperties(properties);
} catch (JSONException e) {
e.printStackTrace();
}
公共属性会保存在 App 本地缓存中。可以通过 unregisterSuperProperty() 删除一个公共属性,或使用 clearSuperProperties() 删除所有已设置的事件公共属性。
3.3. 用户登录
当用户注册成功或登录成功时,需要调用 SDK 的 login() 方法:
SensorsDataAPI.sharedInstance().login("登录 ID");
为了准确记录登录用户的行为信息,建议在以下时机各调用一次用户登录方法:
· 用户在注册成功时
· 用户登录成功时
· 已登录用户每次启动 App 时
3.4. 记录激活事件
可以调用 trackAppInstall() 方法记录激活事件,多次调用此方法只会在第一次调用时触发激活事件:
if(Build.VERSION.SDK_INT >=Build.VERSION_CODES.M){
if (ActivityCompat.checkSelfPermission(this, "android.permission.READ_PHONE_STATE") != PackageManager.PERMISSION_GRANTED) {
// 6.0 以上,无权限时,先申请 READ_PHONE_STATE 权限。
ActivityCompat.requestPermissions(this, new String[]{"android.permission.READ_PHONE_STATE"}, 100);
} else {
// 6.0 以上,有权限时,直接触发激活事件。
trackAppInstall();
}
} else {
// 6.0 以下,无须申请权限,直接触发激活事件。
trackAppInstall();
}
在权限回调的 onRequestPermissionsResult() 方法中,申请权限结果回调无论申请权限成功失败,都要调用 trackAppInstall():
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 100) {
// 申请权限结果回调时(无论申请权限成功失败),都需要触发激活事件。
trackAppInstall();
}
}
/**
* 记录激活事件
*/
private void trackAppInstall() {
try {
JSONObject properties = new JSONObject();
//这里的 DownloadChannel 负责记录下载商店的渠道,值应传入具体应用商店包的标记。如果没有为不同商店打多渠道包,则可以忽略该属性的代码示例。
properties.put("DownloadChannel", "XXX");
// 触发激活事件
// 如果您之前使用 trackInstallation() 触发的激活事件,需要继续保持原来的调用,无需改为 trackAppInstall(),否则会导致激活事件数据分离。
SensorsDataAPI.sharedInstance().trackAppInstall(properties);
} catch (Exception e) {
e.printStackTrace();
}
}
3.5. 代码埋点追踪事件
SDK 初始化后,可以通过 track() 方法追踪用户行为事件,并为事件添加自定义属性:
try {
JSONObject properties = new JSONObject();
properties.put("ProductID", 123456); // 设置商品 ID
properties.put("ProductCatalog", "Laptop Computer"); // 设置商品类别
SensorsDataAPI.sharedInstance().track("BuyProduct", properties);
} catch (JSONException e) {
e.printStackTrace();
}
事件名和事件属性的格式规范,请参考数据格式。
4. SDK 可选配置
4.1. 打通 App 与 H5
版本要求
初始化 SDK 时,进行如下配置,即可开启 App 打通 H5 功能
// 开启 App 打通 H5
saConfigOptions.enableJavaScriptBridge(boolean isSupportJellyBean);
isSupportJellyBean:是否支持 API level 16 及以下的版本。打通功能通过 WebView 的 addJavascriptInterface() 方法实现,但在 API level 16 及以下的版本,addJavascriptInterface() 方法有安全漏洞,因此请谨慎使用。
打通功能需要 App 和 H5 同时开启才可以生效,H5 开启方法请参考 App 打通 H5。
X5 内核打通,在初始化后添加 SensorsDataAPI.sharedInstance().showUpX5WebView(WebView,true);
UC 内核的 WebView 除了上述代码,还需要在插件配置中添加:addUCJavaScriptInterface = true 这个选项,在主 module 级别的 build.gradle 文件中添加我们的扩展如下;
sensorsAnalytics{
addUCJavaScriptInterface=true
}