::: {.row .clearfix}::: {.col-xs-9}配置用户配置文件服务

云眼About 3 min

::: {.row .clearfix} ::: {.col-xs-9} 配置用户配置文件服务

::: {.excerpt} ::: {.markdown-body data-testid="RDMD"} 本主题介绍如何设置自定义用户配置文件服务或如何使用云眼灰度试验 Android SDK 的默认值。 ::: ::: ::: 配置用户配置文件服务

本主题介绍如何设置自定义用户配置文件服务或如何使用云眼灰度试验 Android SDK 的默认值。

建议修改

使用用户配置文件服务保留有关用户的信息,并确保变体分配具有粘性。例如,如果正在处理后端网站,则可以创建一个从 Redis 或 Memcached 存储读取和保存用户配置文件的实现。

Android SDK 默认为用户配置文件服务,该服务将此状态直接存储在设备上。请参阅 Android SDK 用户配置文件服务open in new window

用于读取客户的用户配置文件。manager.userProfileService.lookup

如果用户配置文件服务未按预期对用户进行分桶,请检查其他灰度标帜是否覆盖了分桶。有关更多信息,请参阅 分桶的工作原理

实现服务

如果要实现自定义用户配置文件服务,而不是使用 Android SDK 提供的默认服务,请参阅下面的代码示例。您自己的用户配置文件服务应公开两个具有以下签名的函数:

  • lookup :获取用户 ID 字符串并返回与以下架构匹配的用户配置文件。
  • save :获取用户配置文件并保留它。

如果要将用户配置文件服务纯粹用于跟踪目的而不是粘性分桶,则只能实现该方法(始终从 返回)。save``nil``lookup

下面的代码示例显示了用户配置文件对象的 JSON 架构。

用于覆盖默认分桶行为,并为给定用户定义备用试验变体。对于要覆盖的每个试验,向地图添加一个对象。使用试验 ID 作为键,并包含一个指定所需变体的属性。如果没有试验条目,则默认分桶行为仍然存在。experiment_bucket_map``variation_id

在下面的示例中,是试验 ID。^[a-zA-Z0-9]+$

JSON

{ "title": "UserProfile", "type": "object", "properties": { "user_id": {"type": "string"}, "experiment_bucket_map": {"type": "object", "patternProperties": { "^[a-zA-Z0-9]+$": {"type": "object", "properties": {"variation_id": {"type":"string"}}, "required": ["variation_id"]} } } }, "required": ["user_id", "experiment_bucket_map"] }

SDK 使用您提供的用户配置文件服务在保存试验分配时覆盖默认分桶行为。

对于 Swift 和 Android 应用,用户配置文件服务将在应用更新中保留变体分配。但是,用户配置文件服务不会在重新安装应用后保留变体分配。

实现您自己的用户配置文件服务时,我们建议在初始化时将用户配置文件加载到用户配置文件服务中,并避免对查找函数执行昂贵的阻塞查找,以最大程度地减少合并服务的性能影响。

安卓无操作

在 Android 中,默认的用户配置文件服务也是粘性的。这可以通过在Android应用程序中禁用来否决。为此,请定义一个继承我们的 ,但覆盖 以始终返回 null。请参阅以下示例:UserProfileService``CustomUserProfileService``DefaultUserProfileService class``lookupmethod

科特林Java

class CustomUserProfileService : UserProfileService { @Throws(Exception::class) override fun lookup(userId: String): Map<String, Any>? { return null } @Throws(Exception::class) override fun save(userProfile: Map<String, Any>) { } }

public class CustomUserProfileService implements UserProfileService { public Map<String, Object> lookup(String userId) throws Exception { return null; } public void save(Map<String, Object> userProfile) throws Exception { } }

将此传递给云眼管理器:

科特林Java

val customUserProfileService = CustomUserProfileService() val eyeofcloudManager = EyeofcloudManager.builder() .withSDKKey("<Your_SDK_Key>") .withUserProfileService(customUserProfileService) .build(context)

CustomUserProfileService customUserProfileService = new CustomUserProfileService(); EyeofcloudManager eyeofcloudManager = EyeofcloudManager.builder() .withSDKKey("<Your_SDK_Key>") .withUserProfileService(customUserProfileService) .build(context);

使用此自定义实现,当流量分配更改时,分桶将不再粘滞。

Last update:
Contributors: “zhangweixue”