SigmaSDK 1.4.0

SigmaSDK 1.4.0

Expf Dev 维护。



SigmaSDK 1.4.0

  • Expf Dev

SigmaSDK - iOS

Sigma 是一个用于实验的平台,它使您能够快速评估新功能的影响,并提供您的客户喜欢的产品。

要求

  • iOS 11+

SDK 安装

Cocoapods

如果您的项目使用 Cocoapods,请在 Podfile 中添加 SigmaSDK 依赖

use_frameworks!
target 'MyApp' do
    pod 'SigmaSDK', '~> X.Y.Z'
    # ...
end

Swift Package Manager

如果您的项目使用Swift包管理器,请通过Xcode添加SigmaSDK

文件 > 添加包 > 搜索或输入包URL > https://github.com/expfdev/sigma_ios

或者手动在Package.swift文件中添加

dependencies: [
    .package(url: "https://github.com/expfdev/sigma_ios"),
],
targets: [
    .target(name: "MyApp", dependencies: ["SigmaSDK"])
],

使用SDK

初始化SDK

要使用SDK,需要创建一个类型为SigmaUser的对象。它存储有关用户的信息,例如其唯一标识符。

创建SigmaUser对象的示例

import SigmaSDK

let user = SigmaUser.Builder()
    .setUserId("123")
    .setCustomProperty(true, key: "isAuthorized")
    .setEmail("[email protected]")
    .build()

SigmaUser.Builder具有以下方法

  • func setUserId(_ id: String) -> SigmaUser.Builder - 分配匿名用户的ID。用于分发实验和功能标志。(如果没有分配,则不会按userId进行拆分实验)。
  • func setProfileId(_ id: String) -> SigmaUser.Builder - 分配已认证用户的ID(例如,在个人中心)。(如果没有分配,则不会按profileId进行拆分实验)。
  • func setDeviceId(_ id: String) -> SigmaUser.Builder - 重写SDK定义的Device ID。
  • func setEmail(_ email: String) -> SigmaUser.Builder - 分配名为email的用户参数。
  • func setAppVersion(_ version: String) -> SigmaUser.Builder - 重写SDK定义的应用程序版本。
  • func setOsName(_ name: String) -> SigmaUser.Builder - 重写SDK定义的操作系统的名称。
  • func setOsVersion(_ version: String) -> SigmaUser.Builder - 重写SDK定义的操作系统的版本。
  • func setGeoCode(_ code: String) -> SigmaUser.Builder - 重写SDK定义的地理编码。
  • func setGeoCountry(_ country: String) -> SigmaUser.Builder - 重写SDK定义的国家。
  • func setGeoState(_ state: String) -> SigmaUser.Builder - 重写SDK定义的地区。
  • func setGeoCity(_ code: String) -> SigmaUser.Builder - 重写SDK定义的城市。
  • func setCustomProperty<Value: CustomStringConvertible>(_ value: Value, key: String) -> SigmaUser.Builder - 分配用户的自定义参数(所有此类参数的名称都带有custom.前缀)。

创建对象SigmaUser后,需要调用初始化SDK的方法

import SigmaSDK

do {
    let client = try Sigma.initializeClient(projectToken: token, initialUser: user)
} catch let error {
    // Handle error
}

方法initializeClient具有以下参数

  • projectToken: String - 项目令牌(在控制面板中指定)。
  • initialUser: SigmaUser? - SigmaUser对象。可选参数。如果没有提供,SDK将自动创建一个SigmaUser对象,并为其生成一个随机标识符。
  • cacheTTL: UInt - 从网络请求配置的频率(以秒为单位)。可选参数。默认值为10秒。
  • retryCount: UInt - 请求配置失败时的重试次数。可选参数。默认值为3。
  • 标签: 字符串 - Sigma客户端的标签。非必需参数。默认值为"default"。创建多个SigmaClient实例时必需。

使用 Sigma.getClient(tag: String) 方法获取 SigmaClient 客户端。使用 Sigma.removeClient(tag: String) 方法结束客户端的工作。

在初始化已初始化的客户(已存在标签的客户)时,将抛出 SigmaError.initializationOfExistingClient 错误。

获取特征标志值

获取特征标志值使用以下 SigmaClient 方法

func checkFlag<T: SigmaPropertyType>(flagName: String, onSuccess: SigmaSuccessCallback<T?>?, onError: SigmaErrorCallback?)
func checkFlag<T: SigmaPropertyType>(flagName: String) async throws -> T?

FeatureFlag的值可能为 BoolIntDoubleString[String: Any] 类型。

获取特征标志值的示例

import SigmaSDK

guard let client = Sigma.getClient() else { return }

// Callback версия
client.checkFlag(
    flagName: "my_first_flag",
    onSuccess: { (value: Bool?) in
        // Обработка значения Feature Flag
    },
    onError: { error in
        // Обработка ошибки
    }
)

// Async-await версия
do {
    let firstFlag: Bool? = try await client.checkFlag(flagName: "my_first_flag")
    // Обработка значения Feature Flag
} catch let error {
    // Обработка ошибки
}

尽管获取Feature Flag的方法在无错误时也可能抛出错误,但即便如此,返回值可能为。这种情况可能发生在,例如,当特征标志被绑定到用户未参与的实验时。这种情况不是错误:预期对于这种情况,用户的特征标志值是不可用的,因此SDK返回

获取实验

使用以下 SigmaClient 方法获取用户参与的所有实验。

func getAllUserExperiments(onSuccess: SigmaSuccessCallback<[SigmaExperiment]>?, onError: SigmaErrorCallback?)
func getAllUserExperiments() async throws -> [SigmaExperiment]

使用以下 SigmaClient 方法按名称获取实验。

func getExperiment(name: String, onSuccess: SigmaSuccessCallback<SigmaExperiment?>?, onError: SigmaErrorCallback?)
func getExperiment(name: String) async throws -> SigmaExperiment?

上述所有方法仅返回用户参与过的实验。

获取实验的示例

import SigmaSDK

guard let client = Sigma.getClient() else { return }
let flagName = "my_first_flag"

// Callback версии
client.getAllUserExperiments(
    onSuccess: { experiments in
        // Обработка всех экспериментов, в которые попал пользователь
    },
    onError: { error in
        // Обработка ошибки
    }
)

client.getExperiment(
    name: "my_first_experiment",
    onSuccess: { experiment in
        // Обработка эксперимента
    },
    onError: { error in
        // Обработка ошибки
    }
)

// Async-await версии
do {
    let allExperiments = try await client.getAllUserExperiments()
    // Обработка всех экспериментов, в которые попал пользователь
} catch let error {
    // Обработка ошибки
}

do {
    let userExperiment = try await client.getExperiment(name: "my_first_experiment")
    // Обработка эксперимента
} catch let error {
    // Обработка ошибки
}

从实验中获取信息

获取实验后,实验信息从 SigmaExperiment 对象的方法中可用。

func getParamValue<T: SigmaPropertyType>(name: String) -> T?
func getFeatureFlagValue<T: SigmaPropertyType>(flagName: String) throws -> T?

FeatureFlag或实验参数的值可能为 BoolIntDoubleString[String: Any] 类型。

SDK端自动确定参数列表

  • appVersion - 用户应用程序的版本。
  • deviceId - 设备的唯一标识符。
  • os.version - 用户设备上的iOS版本号。
  • os.name - 用户操作系统的名称(iOS/macOS/watchOS/tvOS)。
  • time - 用户当前时间。
  • date - 用户当前日期。
  • geo.country - 用户所在国家。
  • geo.state - 用户所在地区。
  • geo.city - 用户所在城市。
  • geo.ip - 用户IP地址。

变更日志

1.2.3

  • 支持将[type: Any]类型的String作为功能标志或实验参数的值。

1.2.2

  • 支持新的操作符“ starts with”,“ not starts with”,“ ends with”,“ not ends with”,“ contains”,“ not contains”。

1.2.1

  • 支持按平台过滤实验和Feature Flag。
  • 改进了配置文件的解码,损坏的对象不会破坏整个配置文件。

1.2.0

  • SigmaExperiment.getFeatureFlagValue 方法重命名为 SigmaExperiment.getFeatureValue
  • SigmaExperiment.nameSigmaExperiment.userGroupName 属性标记为过时,并在以后的版本中删除。
  • 添加了 SigmaExperiment.groupIndex 属性,返回用户所属实验组的索引。

1.1.0

  • 删除了 getExperimentNameByFeatureFlag 方法。
  • getUserExperiments 方法重命名为 getAllUserExperiments
  • getUserExperiment 方法重命名为 getExperiment
  • 修复了当Feature Flag在实验中但用户未进入实验时,计算结果的逻辑,原本应回退到实验外部的Feature Flag,但返回了nil。
  • 添加了 SigmaUser.Builder 方法:setAppVersionsetOsNamesetOsVersionsetGeoCodesetGeoCountrysetGeoStatesetGeoCity
  • 修复了一个错误,当客户端设置了地理定位参数为 codecountrystatecity 而不是 geo.codegeo.countrygeo.stategeo.city 时。

1.0.1

  • 支持iOS 11及以上版本。
  • 修复了一个错误,当一个空的规则集使用OR操作符时,其被视为总是成功的。

1.0.0

  • SDK的初始版本。