添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
聪明的作业本  ·  Vibration Test ...·  2 周前    · 
温暖的鸵鸟  ·  Error thrown - ...·  1 周前    · 
爱跑步的钥匙  ·  MybatisPlus学习笔记 | ...·  4 天前    · 
大鼻子的手术刀  ·  ERROR! SSH Error: ...·  2 天前    · 
活泼的茶壶  ·  RROR Main: Cannot ...·  7 月前    · 
冷静的萝卜  ·  ios - Missing ...·  1 年前    · 
深沉的伤疤  ·  @重庆企业 ...·  1 年前    · 

dependencies:
  # 数数 Flutter 插件
  thinking_analytics: ^1.2.1

import 'package:thinking_analytics/thinking_analytics.dart';

获得 ThinkingAnalyticsAPI 实例:

final ThinkingAnalyticsAPI ta = await ThinkingAnalyticsAPI.getInstance('APP_ID', 'https://SERVER_URL');

参数说明:

  • APP_ID: 您的项目的 APP_ID,在您申请项目时会给出,可以在 TA 后台项目管理页查看,请在此处填入。
  • SERVER URL: 数据接收端的 URL:
    • 如果您使用的是云服务,请输入以下 URL:
      • https://receiver.ta.thinkingdata.cn
      • 如果您使用的是私有化部署的版本,请输入以下 URL:
        • https://YOU_SERVER_URL
        • 您可以在初始化的时候传入更多的命名参数,以对 SDK 进行配置。

          ta.dentify('your_distinct_id');
          

          如果需要获得当前访客 ID,可以调用 getDistinctId 获取:

          String distinctId = await ta.getDistinctId();
          

          // 设置账号 ID
          ta.login('your_account_id');
          // 清除账号 ID
          ta.logout();
          

          注意:该方法不会上传用户登录、用户登出等事件。

          ta.track('TEST_EVENT', properties: <String, dynamic>{
            'PROP_INT': 5678,
            'PROP_DOUBLE': 12.3,
            'PROP_DATE': DateTime.now().toUtc(),
            'PROP_LIST': ['apple', 'ball', 1234],
            'PROP_BOOL': false,
            'PROP_STRING': 'flutter test',
          
        • 事件属性是 Map<String, dynamic> 类型,其中每个元素代表一个属性;
        • 事件属性 Key 为属性名称,为 String 类型,规定只能以字母开头,包含数字,字母和下划线 "_",长度最大为 50 个字符,对字母大小写不敏感;
        • 属性值支持五种类型:String、数值类、boolDateTimeList 类型。
        • 当您调用 track() 时,SDK 会取系统当前时间作为事件发生的时刻,如果您需要指定事件时间,可以传入 DateTime 类型的参数 dateTime 来设置事件触发时间,传入 timeZone 表示事件的时区信息. SDK 会根据 dateTime 的时间戳和 timeZone 来将时间类型转化为字符串,表示事件时间。

          DateTime dateTime = DateTime.parse('2020-01-01');
          ta.track('test', dateTime: dateTime, timeZone: 'UTC');
          原始数据示例:
            "#type": "track",
            "#time": "2019-12-31 16:00:00.000",
            "#event_name": "test",
            "#distinct_id": "1ed3465e-17f6-4205-8f86-2e7a2b18027b",
            "properties": {
                "#network_type": "WIFI",
                "#app_version": "1.0",
                "#zone_offset": 0
            "#uuid": "3d74c56f-8b2c-44c4-8683-2dcb3010c231"
          

          注意:尽管事件可以设置触发时间,但是接收端会做如下的限制:只接收相对服务器时间在前 10 天至后 3 天的数据,超过时限的数据将会被视为异常数据,整条数据无法入库。

          Map<String, dynamic> superProperties = {
            'SUPER_STRING': 'super string value',
            'SUPER_INT': 1234,
            'SUPER_DOUBLE': 66.88,
            'SUPER_DATE': DateTime.now(),
            'SUPER_BOOL': true,
            'SUPER_LIST': [1234, 'hello', DateTime.now().toUtc()]
          ta.setSuperProperties(superProperties);
          

          公共事件属性将会被保存到缓存中,无需每次启动 APP 时调用。如果调用 setSuperProperties 上传了先前已设置过的公共事件属性,则会覆盖之前的属性。如果公共事件属性和 track 上传的某个属性的 Key 重复,则该事件的属性会覆盖公共事件属性。

          如果您需要删除某个公共事件属性,您可以调用 unsetSuperProperty 清除其中一个公共事件属性;如果您想要清空所有公共事件属性,则可以调用 clearSuperProperties.

          // 清除属性名为 SUPER_LIST 的公共属性
          ta.unsetSuperProperty('SUPER_LIST');
          // 清空所有公共属性
          ta.clearSuperProperties();
          

          // 设置动态公共属性, 动态公共属性不支持自动采集事件
          ta.setDynamicSuperProperties((){
            return <String, dynamic> {
              'DYNAMIC_DATE': DateTime.now().toUtc(),
              'PROP_INT': 8888
          

          注意:如果事件属性出现重名,动态公共属性的优先级大于公共事件属性,小于 track 中设置的事件属性。

          // 调用 timeEvent 开启对 TIME_EVENT 事件的计时
          ta.timeEvent('TIME_EVENT');
          // do some thing...
          // 通过 track 上传 TIME_EVENT 事件时,会在属性中添加 #duration 属性
          ta.track("TIME_EVENT");
          

          ta.userSet(<String, dynamic>{
            'USER_INT': 1,
            'USER_DOUBLE': 50.12,
            'USER_LIST': ['apple', 'ball', 'cat', 1, DateTime.now().toUtc()],
            'USER_BOOL': true,
            'USER_STRING': 'a user value',
            'USER_DATE': DateTime.now(),
          

          与事件属性类似:

        • 用户属性是 Map<String, dynamic> 类型,其中每个元素代表一个属性;
        • 用户属性 Key 为属性名称,为 String 类型,规定只能以字母开头,包含数字,字母和下划线“_”,长度最大为 50 个字符,对字母大小写不敏感;
        • 用户属性值支持四种类型:String、数值类、boolDateTimeList.
        • ta.userSetOnce(<String, dynamic>{
            'USER_INT': 2,
            'USER_DOUBLE': 10.12,
          

          注意:userSetOnce设置的用户属性类型及限制条件与 userSet 一致。

          ta.userAdd(<String, num>{
            'USER_INT': 2,
            'USER_DOUBLE': 10.1,
          

          注意: userAdd 中的属性类型以及 Key 值的限制与 userSet 一致,但 Value 只允许上报数值类型属性。

          ta.userUnset('USER_INT');
          

          ta.userDelete();
          

          ta.userAppend(<String, List>{
            'USER_LIST': [DateTime.now()],
          

          ta.enableAutoTrack([
            ThinkingAnalyticsAutoTrackType.APP_START,
            ThinkingAnalyticsAutoTrackType.APP_END,
            ThinkingAnalyticsAutoTrackType.APP_INSTALL,
            ThinkingAnalyticsAutoTrackType.APP_CRASH,
          

          String deviceId = await ta.getDeviceId();
          // 以设备 ID 作为访客 ID
          // ta.identify(deviceId);
          

          // 暂停实例的上报,已缓存数据和已经设置的信息不被清除
          ta.enableTracking(false);
          // 恢复实例的上报
          ta.enableTracking(true);
          
        • 停止 SDK 上报(optOutTracking)
        • 在一些特殊场景下,您可能需要完全停止 SDK 的功能,比如在适用 GDPR 的地区,用户选择不提供数据采集权限,则您可以调用如下接口完全关闭 SDK 的功能。

          optOutTracking 只能通过主要实例调用,与 enableTracking 的最大区别在于,其将会清空该实例的本地缓存,包括本实例的访客 ID,账号 ID,公共属性,以及未上报的数据队列。之后再关闭该实例的采集和上报功能。

          // 停止实例的上报, 并清空本地缓存
          ta.optOutTracking();
          

          如果您希望关闭 SDK 功能的同时,删除该用户在 TA 集群中的用户数据,可以传入 deleteUser 参数,这将会在停止 SDK 实例的功能前,上报一条 userDelete数据,以删除该用户的用户数据。

          // 停止实例的上报,并发送 user_del
          ta.optOutTracking(deleteUser: true);
          

          实例的停止状态也将保存在本地缓存,直到调用 optInTracking,后续可以继续上报,但此时相当于一个全新的实例

          // 重新开启上报
          ta.optInTracking();
          

          // 创建轻实例
          ThinkingAnalyticsAPI light = await ta.createLightInstance();
          // 为轻实例设置访客 ID
          light.identify('light_d_id');
          // 通过轻实例上报事件
          light.track('TEST_EVENT_FROM_LIGHT');
          

          注意:子轻量实例与父实例的 APP ID、上报地址以及部分设置一致,但其他信息不共享

          // 1585633785954 为当前 unix 时间戳,单位为毫秒,对应北京时间 2020-03-31 13:49:45
          ThinkingAnalyticsAPI.calibrateTime(1585633785954);
          

          我们也提供了从 NTP 获取时间对 SDK 校准的功能。您需要传入您的用户可以访问的 NTP 服务器地址。之后 SDK 会尝试从传入的 NTP 服务地址中获取当前时间,并对 SDK 时间进行校准。如果在默认的超时时间(3 秒)之内,未获取正确的返回结果,后续将使用本地时间上报数据。

          // 使用苹果公司 NTP 服务对时间进行校准
          ThinkingAnalyticsAPI.calibrateTimeWithNtp("time.apple.com");
          
        • 您需要谨慎地选择您的 NTP 服务器地址,以保证网络状况良好的情况下,用户设备可以很快的获取到服务器时间。
        • 使用 NTP 服务进行时间校准存在一定的不确定性,建议您优先考虑用时间戳校准的方式。
        • // 示例:上报设备首次事件, 假设事件名为 DEVICE_FIRST
          var properties = {
            'PROP_INT': 5678,
            'PROP_DOUBLE': 12.3,
            'PROP_DATE': DateTime.now().toUtc(),
            'PROP_LIST': ['apple', 'ball', 1234],
            'PROP_BOOL': false,
            'PROP_STRING': 'flutter test',
          var firstModel = TrackFirstEventModel('DEVICE_FIRST', '', properties);
          _ta.trackEventModel(firstModel);
          

          如果您希望以设备以外的其他维度来判断是否首次,则可以为首次事件设置 FIRST_CHECK_ID. 例如您需要记录某个账号的首次事件,可以将账号 ID 设置为首次事件的 FIRST_CHECK_ID:

          // 示例:上报用户账号的首次事件, 假设事件名为 USER_FIRST
          var properties = {
            'PROP_INT': 5678,
            'PROP_DOUBLE': 12.3,
            'PROP_DATE': DateTime.now().toUtc(),
            'PROP_LIST': ['apple', 'ball', 1234],
            'PROP_BOOL': false,
            'PROP_STRING': 'flutter test',
          var firstModel = TrackFirstEventModel('USER_FIRST', 'YOU_ACCOUNT_ID', properties);
          _ta.trackEventModel(firstModel);
          

          注意:由于在服务端完成对是否首次的校验,首次事件默认会延时 1 小时入库。

  •