跳转至

RUM 配置

RUM 初始化配置

FTSdk.initRUMWithConfig(
        new FTRUMConfig()
            .setRumAppId(RUM_APP_ID)
            .setEnableTraceUserView(true)
            .setDeviceMetricsMonitorType(DeviceMetricsMonitorType.ALL.getValue())
            .setEnableTraceUserAction(true)
            .setEnableTraceUserResource(true)
            .setEnableTrackAppUIBlock(true)
            .setEnableTrackAppCrash(true)
            .setEnableTrackAppANR(true)
            .setExtraMonitorTypeWithError(ErrorMonitorType.ALL.getValue())
);
FTSdk.initRUMWithConfig(
    FTRUMConfig()
        .setRumAppId(RUM_APP_ID)
        .setEnableTraceUserView(true)
        .setDeviceMetricsMonitorType(DeviceMetricsMonitorType.ALL.getValue())
        .setEnableTraceUserAction(true)
        .setEnableTraceUserResource(true)
        .setEnableTrackAppUIBlock(true)
        .setEnableTrackAppCrash(true)
        .setEnableTrackAppANR(true)
        .setExtraMonitorTypeWithError(ErrorMonitorType.ALL.getValue())
)
方法名 类型 必须 含义
setRumAppId String 设置 RUM AppId。对应设置 RUM appid,才会开启 RUM 的采集功能,获取 appid 方法
setSamplingRate Float 设置采集率,取值范围 [0,1],0 表示不采集,1 表示全采集,默认值为 1。作用域为同一 session_id 下所有 ViewActionLongTaskError 数据
setSessionErrorSampleRate Float 设置错误采集率。当会话未被 setSamplingRate 采样时,若会话期间发生错误,可以采集到错误前 1 分钟范围的数据。取值范围 [0,1],0 表示不采集,1 表示全采集,默认值为 0。作用域为同一 session_id 下所有 ViewActionLongTaskError 数据,ft-sdk 1.6.11 以上支持
setEnableTrackAppCrash Boolean 是否上报 App 崩溃日志,默认为 false,开启后会在错误分析中显示错误堆栈数据。关于崩溃日志中混淆内容转换的问题,可参考 符号文件上传ft-sdk 1.5.1 以上版本,可以通过 extraLogCatWithJavaCrashextraLogCatWithNativeCrash 设置在 Java Crash 和 Native Crash 是否显示 logcat
setIssueDataProvider FTIssueDataProvider 为自动采集的 Java/Native Crash 和 watchdog/native ANR Error 添加经过校验的自定义字段,包含历史恢复数据,默认为不设置,ft-sdk 1.7.5 以上支持,详见 Crash/ANR 自定义字段
setExtraMonitorTypeWithError Array 设置辅助监控信息,添加附加监控数据到 RUM 崩溃数据中。ErrorMonitorType.BATTERY 为电池余量,ErrorMonitorType.MEMORY 为内存用量,ErrorMonitorType.CPU 为 CPU 占有率,默认不设置
setDeviceMetricsMonitorType Array 设置 View 监控信息,在 View 周期中,添加监控数据。DeviceMetricsMonitorType.BATTERY 监控当前页的最高电流输出情况,DeviceMetricsMonitorType.MEMORY 监控当前应用使用内存情况,DeviceMetricsMonitorType.CPU 监控 CPU 跳动次数,DeviceMetricsMonitorType.FPS 监控屏幕帧率。监控周期可选 DetectFrequency.DEFAULT 500 毫秒、DetectFrequency.FREQUENT 100 毫秒、DetectFrequency.RARE 1 秒,默认不设置
setEnableTrackAppANR Boolean 是否开启 ANR 采集,默认为 falseft-sdk 1.7.5 起,Android 11(API 30)及以上在进程后续启动时通过 ApplicationExitInfo 恢复致命 ANR,不采集非致命实时 ANR;Android 10(API 29)及以下继续使用实时 watchdog/native ANR 采集。extraLogCatWithANR 仅用于 API 29 及以下的实时采集路径
setEnableTrackAppUIBlock Boolean, long 是否开启 UI 卡顿检测,默认为 falseft-sdk 1.6.4 以上版本可以通过 blockDurationMs 控制检测时间范围 [100,),单位毫秒,默认是 1 秒
setEnableTraceUserAction Boolean 是否自动追踪用户操作,目前只支持用户启动和点击操作。该配置依赖 ft-plugin,默认为 false
setEnableTraceUserView Boolean 是否自动追踪用户页面操作,该配置依赖 ft-plugin,默认为 false
setEnableTraceUserViewInFragment Boolean 是否自动追踪 Fragment 类型页面数据,该配置依赖 ft-plugin,默认为 falseft-sdk 1.6.11 以上支持
setEnableTraceUserResource Boolean 是否追踪用户网络请求,仅支持 OkHttp,默认为 false。普通 HTTP 请求的自动采集依赖 ft-pluginft-sdk >= 1.7.5 配合 ft-plugin >= 1.3.8 时,还会自动采集 newWebSocket() 的握手 Resource,也可通过 FTWebSocket 显式接入
setEnableResourceHostIP Boolean 是否采集请求目标域名地址的 IP。作用域:只影响 EnableTraceUserResource 为 true 的默认采集。自定义 Resource 采集,需要使用 FTResourceEventListener.FTFactory(true) 来开启这个功能。另外,单个 OkHttp 对相同域名存在 IP 缓存机制,相同 OkHttpClient,在连接服务端 IP 不发生变化的前提下,只会生成一次
setResourceUrlHandler Callback 设置需要过滤的 Resource 条件,默认不过滤
setOkHttpEventListenerHandler Callback ASM 设置全局 OkHttp EventListener,默认不设置
setOkHttpResourceContentHandler Callback ASM 设置全局 FTResourceInterceptor.ContentHandlerHelper,默认不设置,ft-sdk 1.6.7 以上支持,自定义 Resource
addGlobalContext Dictionary 添加自定义标签,用于用户监测数据源区分,如果需要使用追踪功能,则参数 keytrack_idvalue 为任意数值,添加规则注意事项请查阅此处
setRumCacheLimitCount int 本地缓存 RUM 限制数量 [10_000,),默认是 100_000,ft-sdk 1.6.6 以上支持
setEnableTraceWebView Boolean 是否开启通过 Android SDK 采集 WebView 数据,默认为 trueft-sdk 1.6.12 以上支持
setAllowWebViewHost Array 设置允许数据追踪的 WebView host 地址,null 为全采集,默认为 nullft-sdk 1.6.12 以上支持;该方法已废弃,ft-sdk 1.7.5 起请使用 FTSDKConfig.setAllowWebViewHost 统一配置 WebView RUM 与 Log
setViewActivityTrackingHandler FTViewActivityTrackingHandler 用于自定义 Activity 视图的跟踪方式。当 Activity 生命周期事件发生时,此处理器会被调用来决定如何跟踪该 Activity,默认不做处理,ft-sdk 1.6.13 以上支持
setViewFragmentTrackingHandler FTViewFragmentTrackingHandler 用于自定义 Fragment 视图的跟踪方式。当 Fragment 生命周期事件发生时,此处理器会被调用来决定如何跟踪该 Fragment。默认不做处理,ft-sdk 1.6.13 以上支持
setActionTrackingHandler FTActionTrackingHandler 用于自定义用户操作的跟踪方式。当用户执行操作时,此处理器会被调用来决定如何跟踪该操作,默认不做处理,ft-sdk 1.6.13 以上支持

WebSocket 握手 Resource

ft-sdk >= 1.7.5 配合 ft-plugin >= 1.3.8 时,开启 FTRUMConfig.setEnableTraceUserResource(true) 会自动为 OkHttp newWebSocket() 请求采集一次握手 Resource。

仅将 ft-sdk 升级到 1.7.5、继续使用 ft-plugin 1.3.7,构建和运行仍然兼容,但 1.3.7 不会自动拦截 WebSocket 握手。此时可使用 FTWebSocket.newWebSocket()FTWebSocket.wrap() 显式接入;无法修改调用点或注入 WebSocket.Factory 的第三方库仍需升级到 ft-plugin >= 1.3.8

该 Resource 在握手成功、被服务端拒绝或失败时结束,不统计 WebSocket 连接存续时间,也不采集消息内容。现有 Resource URL 过滤和 RUM 采样规则仍然生效。数据包含以下字段:

  • resource_type=websocket
  • resource_websocket_collection_level=handshake
  • resource_websocket_handshake_state:取值为 successrejectedfailed

Crash/ANR 自定义字段

ft-sdk >= 1.7.5 可通过 FTRUMConfig.setIssueDataProvider(FTIssueDataProvider) 为自动采集的 Crash 和 ANR RUM Error 添加自定义字段。

FTRUMConfig config = new FTRUMConfig()
    .setEnableTrackAppCrash(true)
    .setEnableTrackAppANR(true)
    .setIssueDataProvider(issue -> {
        Map<String, Object> fields = new HashMap<>();
        fields.put("business_scene", sceneStore.current());
        fields.put("historical_issue", issue.isHistorical());
        return fields;
    });
val config = FTRUMConfig()
    .setEnableTrackAppCrash(true)
    .setEnableTrackAppANR(true)
    .setIssueDataProvider { issue ->
        mapOf(
            "business_scene" to sceneStore.current(),
            "historical_issue" to issue.isHistorical
        )
    }

FTIssueDataProvider.provideAdditionalFields(FTIssueInfo) 在 Error 构建时同步调用,并可能并发执行。实现应保证线程安全、避免 I/O,并在 10 ms 内返回。设置 Provider 不会自动开启 Crash 或 ANR 采集,仍需启用对应采集项。

  • 仅自动采集的 Java/Native Crash,以及 watchdog、native、ApplicationExitInfo ANR 会触发 Provider;手动 Error、Network Error 和 WebView Error 不会触发。
  • 从 Native dump 或 ApplicationExitInfo 恢复的数据中,FTIssueInfo.isHistorical() 返回 true
  • 返回值支持字符串、布尔值和有限数值,最多检查 50 个条目;Key 最长 100 UTF-8 字节,字符串值最长 4096 UTF-8 字节,全部字段合计不超过 25 KiB。
  • 无效、超限、SDK 保留字段及以 error.error_ 开头的 Key 会被忽略。业务方需自行保证字段内容满足隐私与合规要求。

RUM 手动埋点

FTRUMConfig 配置 enableTraceUserActionenableTraceUserViewenableTraceUserResourcesetEnableTrackAppUIBlocksetEnableTrackAppCrashsetEnableTrackAppANR 来实现 ActionViewResourceLongTaskError 的自动采集。若需自定义采集,可通过 FTRUMGlobalManager 手动上报。

Action

使用方法

/**
 * 添加 Action
 *
 * @param actionName action 名称
 * @param actionType action 类型
 * @param property   附加属性参数(可选)
 */
public void startAction(String actionName, String actionType, HashMap<String, Object> property)

/**
 * 添加 Action, 此类数据无法关联 Error,Resource,LongTask 数据
 *
 * @param actionName action 名称
 * @param actionType action 类型
 * @param duration   纳秒,持续时间(可选)
 * @param property   扩展属性(可选)
 */
public void addAction(String actionName, String actionType, long duration, HashMap<String, Object> property)
/**
 * 添加 action
 *
 * @param actionName action 名称
 * @param actionType action 类型
 * @param property   附加属性参数(可选)
 */
fun startAction(actionName: String, actionType: String, property: HashMap<String, Any>)

/**
 * 添加 Action
 *
 * @param actionName action 名称
 * @param actionType action 类型
 * @param duration   纳秒,持续时间(可选)
 * @param property   扩展属性(可选)
 */
fun addAction(actionName: String, actionType: String, duration: Long, property: HashMap<String, Any>)

startAction 内部有计算耗时算法,计算期间会尽量与附近发生的 ResourceLongTaskError 数据做数据关联,设有 100 ms 频繁触发保护,建议用于用户操作类型的数据。如果有频繁调用的需求请使用 addAction,这个数据不会与 startAction 发生冲突,并且不与当下 ResourceLongTaskError 进行数据关联。

代码示例

// 场景1
FTRUMGlobalManager.get().startAction("login", "action_type");

// 场景2: 动态参数
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key", "ft_value");
FTRUMGlobalManager.get().startAction("login", "action_type", map);

// 场景1
FTRUMGlobalManager.get().addAction("login", "action_type");

// 场景2: 动态参数
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key", "ft_value");
FTRUMGlobalManager.get().addAction("login", "action_type", map);
// 场景1
FTRUMGlobalManager.get().startAction("login", "action_type")

// 场景2: 动态参数
val map = HashMap<String, Any>()
map["ft_key"] = "ft_value"
FTRUMGlobalManager.get().startAction("login", "action_type", map)

// 场景1
FTRUMGlobalManager.get().addAction("login", "action_type")

// 场景2: 动态参数
val map = HashMap<String, Any>()
map["ft_key"] = "ft_value"
FTRUMGlobalManager.get().addAction("login", "action_type", map)

View

使用方法

/**
 * view 起始
 *
 * @param viewName 当前页面名称
 * @param property 附加属性参数(可选)
 */
public void startView(String viewName, HashMap<String, Object> property)

/**
 * view 结束
 *
 * @param property 附加属性参数(可选)
 */
public void stopView(HashMap<String, Object> property)

/**
 * 更新当前 view loading_time 指标,单位纳秒
 *
 * @param duration duration
 */
public void updateLoadTime(long duration)
/**
 * view 起始
 *
 * @param viewName 当前页面名称
 * @param property 附加属性参数(可选)
 */
fun startView(viewName: String, property: HashMap<String, Any>)

/**
 * view 结束
 *
 * @param property 附加属性参数(可选)
 */
fun stopView(property: HashMap<String, Any>)

/**
 * 更新当前 view loading_time 指标,单位纳秒
 *
 * @param duration duration
 */
fun updateLoadTime(duration: Long)

代码示例

@Override
protected void onResume() {
    super.onResume();

    // 场景 1
    FTRUMGlobalManager.get().startView("Current Page Name");

    // 场景 2: 动态参数
    HashMap<String, Object> map = new HashMap<>();
    map.put("ft_key", "ft_value");
    map.put("ft_key_will_change", "ft_value");
    FTRUMGlobalManager.get().startView("Current Page Name", map)
}

@Override
protected void onPause() {
    super.onPause();

    // 场景 1
    FTRUMGlobalManager.get().stopView();

    // 场景 2 : 动态参数
    HashMap<String, Object> map = new HashMap<>();
    map.put("ft_key_will_change", "ft_value_change"); //ft_key_will_change 的值会在 stopView 时被更新为 ft_value_change
    FTRUMGlobalManager.get().stopView(map);

}
override fun onResume() {
    super.onResume()

    // 场景 1
    FTRUMGlobalManager.get().startView("Current Page Name")

    // 场景 2: 动态参数
    val map = HashMap<String, Any>()
    map["ft_key"] = "ft_value"
    map["ft_key_will_change"] = "ft_value"
    FTRUMGlobalManager.get().startView("Current Page Name", map)
}

override fun onPause() {
    super.onPause()

    // 场景 1
    FTRUMGlobalManager.get().stopView()

    // 场景 2 : 动态参数
    val map = HashMap<String, Any>()
    map["ft_key_will_change"] = "ft_value_change" // ft_key_will_change 这个数值,会在 stopView 时候被修改为 ft_value_change
    FTRUMGlobalManager.get().stopView(map)
}

Error

使用方法

/**
 * 添加错误信息
 *
 * @param log       日志
 * @param message   消息
 * @param errorType 错误类型, ErrorType
 * @param state     程序运行状态
 * @param dateline  发生时间,纳秒(可选)
 * @param property  附加属性(可选)
 */
public void addError(String log, String message, long dateline, ErrorType errorType,
                     AppState state, HashMap<String, Object> property)

/**
 * 添加错误信息
 *
 * @param log       日志
 * @param message   消息
 * @param errorType 错误类型, String
 * @param state     程序运行状态
 * @param dateline  发生时间,纳秒(可选)
 * @param property  附加属性(可选)
 */
public void addError(String log, String message, long dateline, String errorType,
                     AppState state, HashMap<String, Object> property)
/**
 * 添加错误信息
 *
 * @param log       日志
 * @param message   消息
 * @param errorType 错误类型, ErrorType
 * @param state     程序运行状态
 * @param dateline  发生时间,纳秒(可选)
 * @param property  附加属性(可选)
 */
fun addError(log: String, message: String, dateline: Long, errorType: ErrorType, state: AppState, property: HashMap<String, Any>)

/**
 * 添加错误信息
 *
 * @param log       日志
 * @param message   消息
 * @param errorType 错误类型, String
 * @param state     程序运行状态
 * @param dateline  发生时间,纳秒(可选)
 * @param property  附加属性(可选)
 */
fun addError(log: String, message: String, dateline: Long, errorType: String, state: AppState, property: HashMap<String, Any>)

代码示例

// 场景 1:
FTRUMGlobalManager.get().addError("error log", "error msg", ErrorType.JAVA, AppState.RUN);

// 场景 2: 延迟记录发生的错误,这里的时间一般为错误发生的时间
FTRUMGlobalManager.get().addError("error log", "error msg", 16789000000000000000L, ErrorType.JAVA, AppState.RUN);

// 场景 3:动态参数
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key", "ft_value");
FTRUMGlobalManager.get().addError("error log", "error msg", ErrorType.JAVA, AppState.RUN, map);
// 场景 1:
FTRUMGlobalManager.get().addError("error log", "error msg", ErrorType.JAVA, AppState.RUN)

// 场景 2: 延迟记录发生的错误,这里的时间一般为错误发生的时间
FTRUMGlobalManager.get().addError("error log", "error msg", 16789000000000000000, ErrorType.JAVA, AppState.RUN)

// 场景 3:动态参数
val map = HashMap<String, Any>()
map["ft_key"] = "ft_value"
FTRUMGlobalManager.get().addError("error log", "error msg", ErrorType.JAVA, AppState.RUN, map)

LongTask

使用方法

/**
 * 添加长任务
 *
 * @param log      日志内容
 * @param duration 持续时间,纳秒
 * @param property 附加属性参数(可选)
 */
public void addLongTask(String log, long duration, HashMap<String, Object> property)
/**
 * 添加长任务
 *
 * @param log      日志内容
 * @param duration 持续时间,纳秒
 * @param property 附加属性参数(可选)
 */
fun addLongTask(log: String, duration: Long, property: HashMap<String, Any>)

代码示例

// 场景 1
FTRUMGlobalManager.get().addLongTask("error log", 1000000L);

// 场景 2: 动态参数
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key", "ft_value");
FTRUMGlobalManager.get().addLongTask("", 1000000L, map);
// 场景 1
FTRUMGlobalManager.get().addLongTask("error log", 1000000L)

// 场景 2: 动态参数
val map = HashMap<String, Any>()
map["ft_key"] = "ft_value"
FTRUMGlobalManager.get().addLongTask("", 1000000L, map)

Resource

使用方法

/**
 * resource 起始
 *
 * @param resourceId 资源 Id
 * @param property   附加属性参数(可选)
 */
public void startResource(String resourceId, HashMap<String, Object> property)

/**
 * resource 终止
 *
 * @param resourceId 资源 Id
 * @param property   附加属性参数(可选)
 */
public void stopResource(final String resourceId, HashMap<String, Object> property)

/**
 * 设置网络传输内容
 *
 * @param resourceId resourceId
 * @param params params
 * @param netStatusBean netStatusBean
 */
public void addResource(String resourceId, ResourceParams params, NetStatusBean netStatusBean)
/**
 * resource 起始
 *
 * @param resourceId 资源 Id(可选)
 */
fun startResource(resourceId: String, property: HashMap<String, Any>)

/**
 * resource 终止
 *
 * @param resourceId 资源 Id
 * @param property   附加属性参数(可选)
 */
fun stopResource(resourceId: String, property: HashMap<String, Any>)

/**
 * 设置网络传输内容
 *
 * @param resourceId resourceId
 * @param params params
 * @param netStatusBean netStatusBean
 */
fun addResource(resourceId: String, params: ResourceParams, netStatusBean: NetStatusBean)

代码示例

// 场景 1
// 请求开始
FTRUMGlobalManager.get().startResource("resourceId");

// ...

// 请求结束
FTRUMGlobalManager.get().stopResource("resourceId");

// 最后,在请求结束之后,发送请求相关的数据指标
ResourceParams params = new ResourceParams();
params.setUrl("https://guance.com");
params.setResponseContentType(response.header("Content-Type"));
params.setResponseConnection(response.header("Connection"));
params.setResponseContentEncoding(response.header("Content-Encoding"));
params.setResponseHeader(response.headers().toString());
params.setRequestHeader(request.headers().toString());
params.setResourceStatus(response.code());
params.setResourceMethod(request.method());

NetStatusBean bean = new NetStatusBean();
bean.setTcpStartTime(60000000);
// ...

FTRUMGlobalManager.get().addResource("resourceId", params, bean);

// 场景 2 :动态参数使用
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key", "ft_value");
map.put("ft_key_will_change", "ft_value");

FTRUMGlobalManager.get().startResource("resourceId", map);

// ...
HashMap<String, Object> map = new HashMap<>();
map.put("ft_key_will_change", "ft_value_change"); // ft_key_will_change 这个数值,会在 stopResource 时候被修改为 ft_value_change
FTRUMGlobalManager.get().stopResource(uuid, map);
// 场景 1
// 请求开始
FTRUMGlobalManager.get().startResource("resourceId")

// 请求结束
FTRUMGlobalManager.get().stopResource("resourceId")

// 最后,在请求结束之后,发送请求相关的数据指标
val params = ResourceParams()
params.url = "https://guance.com"
params.responseContentType = response.header("Content-Type")
params.responseConnection = response.header("Connection")
params.responseContentEncoding = response.header("Content-Encoding")
params.responseHeader = response.headers.toString()
params.requestHeader = request.headers.toString()
params.resourceStatus = response.code
params.resourceMethod = request.method

val bean = NetStatusBean()
bean.tcpStartTime = 60000000
// ...
FTRUMGlobalManager.get().addResource("resourceId", params, bean)

// 场景 2 :动态参数使用
val map = hashMapOf<String, Any>(
    "ft_key" to "ft_value",
    "ft_key_will_change" to "ft_value"
)
FTRUMGlobalManager.get().startResource("resourceId", map)

// ...
val map = hashMapOf<String, Any>(
    "ft_key_will_change" to "ft_value_change"
)
// ft_key_will_change 这个数值,会在 stopResource 时候被修改为 ft_value_change

FTRUMGlobalManager.get().stopResource(uuid, map)
方法名 必须 含义 说明
NetStatusBean.fetchStartTime 请求开始时间
NetStatusBean.tcpStartTime TCP 连接时间
NetStatusBean.tcpEndTime TCP 结束时间
NetStatusBean.dnsStartTime DNS 开始时间
NetStatusBean.dnsEndTime DNS 结束时间
NetStatusBean.responseStartTime 响应开始时间
NetStatusBean.responseEndTime 响应结束时间
NetStatusBean.sslStartTime SSL 开始时间
NetStatusBean.sslEndTime SSL 结束时间
NetStatusBean.property 附加属性
ResourceParams.url URL 地址
ResourceParams.requestHeader 请求头参数
ResourceParams.responseHeader 响应头参数
ResourceParams.responseConnection 响应 connection
ResourceParams.responseContentType 响应 ContentType
ResourceParams.responseContentEncoding 响应 ContentEncoding
ResourceParams.resourceMethod 请求方法 GET, POST 等
ResourceParams.responseBody 返回 body 内容
ResourceParams.property 附加属性

用户信息绑定与解绑

使用 FTSdk 进行用户绑定和解绑。

使用方法

/**
 * 绑定用户信息
 *
 * @param id 用户 ID
 */
public static void bindRumUserData(@NonNull String id)

/**
 * 绑定用户信息
 */
public static void bindRumUserData(@NonNull UserData data)

/**
 * 解绑用户信息
 */
public static void unbindRumUserData()
/**
 * 绑定用户信息
 *
 * @param id 用户 ID
 */
fun bindRumUserData(id: String)

/**
 * 绑定用户信息
 *
 * @param data 用户信息
 */
fun bindRumUserData(data: UserData)

/**
 * 解绑用户信息
 */
fun unbindRumUserData()

UserData

方法名 含义 必须 注意
setId 设置用户 ID
setName 设置用户名
setEmail 设置邮箱
setExts 设置用户扩展 添加规则请查阅 应用接入

代码示例

// 可以在用户登录成功后调用此方法用来绑定用户信息
FTSdk.bindRumUserData("001");

UserData userData = new UserData();
userData.setName("test.user");
userData.setId("test.id");
userData.setEmail("test@mail.com");
Map<String, String> extMap = new HashMap<>();
extMap.put("ft_key", "ft_value");
userData.setExts(extMap);
FTSdk.bindRumUserData(userData);

// 可以在用户退出登录后调用此方法来解绑用户信息
FTSdk.unbindRumUserData();
// 可以在用户登录成功后调用此方法用来绑定用户信息
FTSdk.bindRumUserData("001")

// 绑定用户更多数据
val userData = UserData()
userData.name = "test.user"
userData.id = "test.id"
userData.email = "test@mail.com"
val extMap = HashMap<String, String>()
extMap["ft_key"] = "ft_value"
userData.setExts(extMap)
FTSdk.bindRumUserData(userData)

// 可以在用户退出登录后调用此方法来解绑用户信息
FTSdk.unbindRumUserData()

文档评价

文档内容是否对您有帮助?