이 페이지에서

For AI agents: a documentation index is available at /docs/llms.txt. Append .md to any page URL for markdown, or send Accept: text/markdown.

Experiment iOS SDK

Amplitude Experiment의 클라이언트 측 iOS SDK 구현에 대한 공식 문서입니다.

통합 SDK

Swift용 통합 SDK를 설치하여 실험 SDK와 다른 Amplitude 제품(분석, 세션 리플레이)에 액세스하세요. 통합 SDK는 모든 Amplitude 기능을 위한 단일 진입점을 제공하며, 모든 구성 요소의 초기화 및 구성을 처리함으로써 통합 프로세스를 단순화합니다.

설치

Import 문 코코아팟과 스위프트 패키지 관리자/카르타지는 다른 import 문을 가지고 있습니다.

  • 코코아팟: import AmplitudeExperiment
  • SPM/카르타지: import Experiment
ruby
pod 'AmplitudeExperiment', '~> <VERSION>'

빠른 시작

: 실험 SDK를 초기화하는 올바른 방법은 분석을 위해 Amplitude SDK를 사용하는지 아니면 제3자(예: 세그먼트)를 사용하는지에 따라 다릅니다.

  1. 실험 클라이언트 초기화
  2. 변형 가져오기
  3. 플래그 변형에 액세스
swift
// (1) Initialize the experiment client with Amplitude Analytics
let experiment = Experiment.initializeWithAmplitudeAnalytics(
    apiKey: "DEPLOYMENT_KEY",
    config: ExperimentConfigBuilder().build()
)
// (2) Fetch variants
experiment.fetch(user: nil) { _, error in
    // (3) Lookup a flag's variant
    let variant = experiment.variant("FLAG_KEY")
    if variant.value == "on" {
        // Flag is on
    } else {
        // Flag is off
    }
}

초기화

시작 시 애플리케이션에서 SDK 클라이언트를 초기화합니다.apiKey 매개변수에 전달하는 배포 키 인수는 분석 이벤트를 전송하는 동일한 프로젝트 내에 있어야 합니다.

func initializeWithAmplitudeAnalytics(
    apiKey: String,
    config: ExperimentConfig
) -> ExperimentClient
  • apiKey
    • 요구 사항: 필수
    • 설명: 페치 요청을 승인하고 사용자에 대해 평가할 플래그를 결정하는 배포 키입니다.
  • config
    • 요구 사항: 선택 사항
    • 설명: SDK 클라이언트 동작을 사용자 정의하는 데 사용되는 클라이언트 구성입니다.

초기화기는 단일 인스턴스를 반환하므로 동일한 인스턴스 이름에 대한 후속 초기화는 항상 초기 인스턴스를 반환합니다. 여러 인스턴스를 생성하려면 instanceName 구성을 사용하십시오.

let experiment = Experiment.initializeWithAmplitudeAnalytics(
    apiKey: "DEPLOYMENT_KEY",
    config: ExperimentConfigBuilder()
    .instanceName("myCustomInstance")  // case-sensitive name matching your Analytics instance
    .build()
)

구성

초기화 시 SDK 클라이언트를 구성합니다.

EU 데이터 센터

Amplitude의 EU 데이터 센터를 사용하고 있는 경우, 초기화 시 .EU옵션을 serverZone로 구성하십시오.

통합

Amplitude 또는 Segment Analytics SDK를 사용하여 이벤트를 Amplitude로 추적하는 경우, 초기화 시 연동을 설정해야 할 것입니다. 연동은 공급자 인터페이스를 자동으로 구현하여 사용자 ID 관리와 노출 이벤트 추적을 보다 쉽게 함으로써 보다 간소화된 개발자 환경을 제공합니다.

가져오기

사용자의 변형을 가져오고 빠른 액세스를 위해 결과를 클라이언트에 저장합니다. 원격으로 평가 함수는 SDK 클라이언트를 초기화하는 데 사용된 배포와 관련된 플래그에 대해 사용자를 평가합니다.

swift
func fetch(user: ExperimentUser?, options: FetchOptions?, completion: ((ExperimentClient, Error?) -> Void)?)

Amplitude 실험은 사용자가 애플리케이션 세션에 대한 최신 변형을 얻을 수 있도록 애플리케이션 시작 중에 호출할 것을 fetch()권장합니다. 또한 사용자 환경을 렌더링하기 전에 가져오기 요청이 결과를 반환할 때까지 기다려야 인터페이스의 "깜박임"을 방지할 수 있습니다.

swift
let user = ExperimentUserBuilder()
    .userId("user@company.com")
    .userProperty("premium", value: true)
    .build()
experiment.fetch(user: user) { experiment, error in
    // Do something...
}

연동 또는 사용자 지정 사용자 제공자를 사용하는 경우 사용자를 입력하지 않고도 가져올 수 있습니다.

swift
experiment.fetch(user: nil, completion: nil)

사용자 ID가 변경될 때 가져오기

사용자에 대한 최신 변형을 원한다면 사용자 상태가 fetch()의미 있는 방식으로 변경될 때마다 호출하는 것이 좋습니다. 예를 들어 사용자가 로그인하여 사용자 ID를 받거나, 플래그 또는 실험 타겟팅 규칙에 영향을 줄 수 있는 사용자 속성이 설정되어 있는 경우가 있습니다.

사용자 속성의 경우, Amplitude는 원격 평가 전에 사용자 보강에 의존하는 대신 새로운 사용자 속성을 명시적으로 fetch()에 전달할 것을 권장합니다. 별도의 시스템을 통한 원격 사용자 속성 동기화는 fetch()에 대한 타이밍을 보장하지 않으며, 이는 경합 조건을 야기할 수 있습니다.

fetch()시간이 초과되거나 어떤 이유로든 실패하면 SDK 클라이언트가 반환되며 백오프를 사용하여 백그라운드에서 재시도합니다. SDK 클라이언트 초기화 다음 기간동안 구성 옵션에서 시간 초과를 구성하거나 재시도를 비활성화할 수 있습니다.

시작

Fetch 대 start

클라이언트 측 로컬 평가를 사용하는 경우 start를 사용하십시오. 원격 평가만 사용하는 경우에는 start 대신 fetch 를 호출하십시오.

서버에서 플래그 구성을 가져오고 사용자를 위한 원격 평가 변형을 가져와서 SDK를 시작합니다. 완료 콜백이 실행될 때 SDK가 준비된 상태입니다.

swift
func start(_ user: ExperimentUser? = nil, completion: ((Error?) -> Void)? = nil)

애플리케이션이 초기화될 때 변형을 평가하거나 가져오는 데 필요한 사용자 정보가 준비된 후에 start()를 호출하세요. 완료 블록은 SDK가 로컬 평가 플래그 구성을 로드하고 원격 평가 변형을 가져온 후에 실행됩니다.

초기화 시 SDK 구성에서 start()설정을 통해 fetchOnStart의 동작을 구성하여 애플리케이션의 요구에 따라 성능을 향상시킵니다.

  • 응용 프로그램이 원격 평가에 의존하지 않는 경우 원격 평가로 인한 스타트업 지연 시간 증가를 방지하려면 false로 설정하십시오fetchOnStart.
  • 애플리케이션이 원격 평가에 의존하지만 시작 시점에 fetchOnStart그렇지 않다면 false를 fetch()로 설정하고 별도로 호출할 수 있습니다.
experiment.start() { error in
    // SDK Started
}

변형

SDK 클라이언트의 로컬 스토어에서 플래그 또는 실험에 대한 변형에 액세스하십시오.

자동 노출 추적

연동을 사용하거나 사용자 지정 노출 추적 공급자를 설정할 경우, variant()는 추적 공급자를 통해 노출 이벤트를 자동으로 추적합니다. 이 기능을 비활성화하려면 구성에서 automaticExposureTracking를 false로 설정하고, exposure()를 사용하여 노출을 수동으로 추적하십시오.

swift
func variant(_ key: String, fallback: Variant? = nil) -> Variant

사용자가 어떤 변형으로 분류되었는지 확인할 때 변형 value을 잘 알려진 문자열과 비교해야 할 것입니다.

swift
let variant = experiment.variant("<FLAG_KEY>")
if variant.value == "on" {
    // Flag is on
} else {
    // Flag is off
}

변형의 페이로드에 액세스하십시오.

변형은 임의 데이터의 동적 페이로드로 구성될 수도 있습니다. 변형의 value을 확인한 후 변형 객체에서 payload 필드에 액세스합니다.

iOS의 Any?는 유형이므로 값을 검색하려면 payload페이로드를 예상된 유형으로 형변환하십시오. 예를 들어 페이로드가 다음과 같은 경우{"key":"value"}:

swift
let variant = client.variant("<FLAG_KEY>")
if variant.value == "on" {
    if let payload = variant.payload as? [String:String] {
        let value = payload["key"]
    }
}

null 변형 value은 사용자가 변형으로 분류되지 않았음을 의미합니다. 저장소에 지정된 플래그 키에 대한 변형이 없는 경우 내장된 폴백 매개변수를 사용하여 반환할 변형을 제공할 수 있습니다.

swift
let variant = experiment.variant("<FLAG_KEY>", fallback: Variant("control"))
if variant.value == "control" {
    // Control
} else if variant.value == "treatment" {
    // Treatment
}

모두

SDK 클라이언트에 저장된 모든 변형에 액세스합니다.

swift
func all() -> [String:Variant]

지우기

캐시와 스토리지의 모든 변형을 지웁니다.

swift
func clear()

사용자가 로그아웃한 후 clear 를 호출하여 캐시와 저장소의 변형을 지울 수 있습니다.

swift
experiment.clear()

현재 사용자

클라이언트가 나중에 fetch() 및 start() 호출에 사용할 사용자를 설정하거나 클라이언트의 현재 사용자를 읽습니다.

swift
experiment.setUser(ExperimentUserBuilder()
    .userId("user@company.com")
    .deviceId("abcdefg")
    .build()
)
let currentUser = experiment.getUser()

비어 있지 않은 사용자를 fetch()에 직접 전달하면 클라이언트도 해당 사용자가 설정됩니다.

중지

start에 의해 시작된 로컬 평가 플래그 폴링을 중지합니다. 이 방법은 클라이언트에 이미 저장된 변형을 지우지 않습니다.

swift
experiment.stop()

노출:

구성된 연동 또는 사용자 지정 노출 추적 공급자를 통해 지정된 플래그 키의 현재 변형에 대한 노출 이벤트를 수동으로 추적합니다. 일반적으로 automaticExposureTracking의 구성 옵션을 false로 설정하는 것과 함께 사용됩니다.

swift
func exposure(key: String)
swift
let variant = experiment.variant("<FLAG_KEY>")
// Do other things...
experiment.exposure(key: "<FLAG_KEY>")
if variant.value == "control" {
    // Control
} else if variant.value == "treatment" {
    // Treatment
}

할당 추적

후속 원격 평가 요청을 할당 추적용으로 표시할지 여부를 제어합니다. 이 설정은 구성된 실험 인스턴스에 대해 저장됩니다.

swift
experiment.setTracksAssignment(false) // Send no-track on later fetch requests.

공급자

연동 실험 클라이언트 SDK와 함께 Amplitude 또는 세그먼트 분석 SDK를 사용하는 경우, Amplitude는 사용자 지정 공급자를 구현하는 대신 연동을 사용하는 것을 권장합니다.

공급자 구현은 사용자 ID를 관리하고 노출 이벤트를 추적하기가 더 쉬워짐으로써 개발자 환경을 더욱 간소화할 수 있게 해줍니다.

사용자 제공자

SDK 클라이언트는 사용자 제공자를 사용하여 필요한 경우에만 최신 사용자 정보에 액세스합니다(예: fetch() 가 호출될 때). 사용자 공급자는 선택 사항이지만 응용 프로그램에 사용자 정보 저장소가 이미 설정되어 있는 경우 유용합니다. 사용자 공급자를 사용하면 두 개의 개별 사용자 정보 저장소를 동시에 관리할 필요가 없습니다. 애플리케이션 사용자 저장소가 업데이트되었지만 실험이 업데이트되지 않은 경우(또는 그 반대의 경우)에 별도의 저장소가 서로 일치하지 않는 사용자 상태를 생성할 수 있습니다.

swift
protocol ExperimentUserProvider {
    func getUser() -> ExperimentUser
}

사용자 지정 사용자 공급자를 사용하려면 SDK 초기화 시 사용자 지정 구현의 인스턴스로 userProvider의구성 옵션을 설정하십시오.

swift
let config = ExperimentConfigBuilder()
    .userProvider(CustomUserProvider())
    .build()
let experiment = Experiment.initialize(apiKey: "<DEPLOYMENT_KEY>", config: config)

노출 추적 공급자

Amplitude는 노출 추적 공급자를 구현할 것을 강력히 권장합니다. 노출 추적은 실험 결과의 정확성과 신뢰성을 높이고 사용자가 어떤 플래그와 실험에 노출되었는지에 대한 가시성을 개선합니다.

swift
protocol ExposureTrackingProvider {
    func track(exposure: Exposure)
}

track()의 구현은 flag_key및variant 이라는 두 개의 이벤트 속성을 사용하여 $exposure유형(이름이라고도 함)의 이벤트를 추적해야 하며, 이는 Exposure객체 인수의 두 필드에 해당합니다. 마지막으로, 추적된 이벤트는 SDK 클라이언트를 초기화하는 데 사용된 [배포]가 첫 사용 후 동일한 프로젝트에 대해 결국 Amplitude 애널리틱스에 기록되어야 하며, 변형을 가져온 것과 동일한 사용자에 대해 발생해야 합니다.

사용자 지정 사용자 공급자를 사용하려면 SDK 초기화 시 사용자 지정 구현의 인스턴스로 exposureTrackingProvider의구성 옵션을 설정하십시오.

swift
ExperimentConfig config = ExperimentConfigBuilder()
    .exposureTrackingProvider(CustomExposureTrackingProvider(analytics))
    .build()
let experiment = Experiment.initialize(apiKey: "<DEPLOYMENT_KEY>", config: config)

부트스트랩

변형이 외부 소스(예: SDK 클라이언트에서 fetch()을(를) 호출하여 가져온 것이 아닌 경우)에서 온 경우 초기 플래그 또는 변형 세트를 사용하여 실험 클라이언트를 부트스트랩할 수 있습니다. 활용 사례에는 특정 변형에 대한 로컬 평가 또는 연동 테스트가 포함됩니다.

부트스트랩 변형

미리 정의된 변형 집합으로 클라이언트를 부트스트랩하려면 initialVariants의 구성 객체에서 플래그와 변형을 설정한 다음 source를 Source.InitialVariants로 설정하십시오. 그러면 SDK 클라이언트가 동일한 플래그에 대해 이전에 인출되고 저장된 변형보다 부트스트랩된 변형을 선호합니다.

swift
let config = ExperimentConfigBuilder()
    .initialVariants(["<FLAG_KEY>": Variant("<VARIANT>")])
    .source(Source.InitialVariants)
    .build()
let experiment = Experiment.initialize(apiKey: "<DEPLOYMENT_KEY>", config: config)

부트스트랩 플래그 구성

구성을 통해 초기 로컬 평가 플래그 구성 세트로 SDK를 부트스트랩하도록 선택할 수 있습니다initialFlags. 업데이트된 플래그 구성 또는 변형이 start 또는 fetch로 로드되지 않은 경우 SDK는 변형이 호출될 때 이러한 플래그 구성을 평가합니다.

초기 플래그를 다운로드하려면 평가 플래그 API를 사용하십시오.

swift
let config = ExperimentConfigBuilder()
    .initialFlags("<FLAGS_JSON>")
    .build()
let experiment = Experiment.initialize(apiKey: "<DEPLOYMENT_KEY>", config: config)

사용자 지정 로깅

구성을 통해 로그 세부 정보를 제어하거나, CoreLogger프로토콜을 구현하여 자체 logLevel로깅 솔루션을 통합하십시오.

로그 수준

  • .off - 로깅 없음
  • .error - 오류만
  • .warn - 오류 및 경고(기본값)
  • .log - 오류, 경고 및 로그
  • .debug - 디버그를 포함한 모든 메시지
swift
// Only log errors
let config = ExperimentConfigBuilder()
    .logLevel(.error)
    .build()
let experiment = Experiment.initialize(apiKey: "<DEPLOYMENT_KEY>", config: config)

사용자 지정 로거

자체 로깅 솔루션을 사용하기 위해 CoreLogger프로토콜을 구현하십시오.

swift
// Implement the CoreLogger protocol
class CustomLogger: CoreLogger {
    func error(message: String) {
        // Send error logs to your logging service
        myLoggingService.error(message)
    }
    func warn(message: String) {
        myLoggingService.warn(message)
    }
    func log(message: String) {
        myLoggingService.log(message)
    }
    func debug(message: String) {
        myLoggingService.debug(message)
    }
}
// Initialize with custom logger
let config = ExperimentConfigBuilder()
    .loggerProvider(CustomLogger())
    .logLevel(.warn)
    .build()
let experiment = Experiment.initialize(apiKey: "<DEPLOYMENT_KEY>", config: config)

이 내용이 도움이 되었나요?