Skip to main content
The experiments module assigns users to variants using a deterministic hash. No server call is needed — assignment is instant, works offline, and the same user always gets the same variant.

Get Variant

let variant = AppDNA.experiments.getVariant("paywall-test")

switch variant {
case "control":
    showStandardPaywall()
case "variant_a":
    showNewPaywall()
default:
    showStandardPaywall() // Always handle the default case
}
Returns the variant string ("control", "variant_a", etc.) or nil if the experiment is not found, not running, or the user is not in the target audience.
Always handle the nil / default case. Experiments can be archived or stopped at any time from the Console.

Module Access

let experiments = AppDNA.experiments

Module Methods

MethodSignatureDescription
getVariantgetVariant(_ experimentId: String) -> String?Get the assigned variant
getExposuresgetExposures() -> [(experimentId: String, variant: String)]Get all experiment exposures for the current session

Exposure Tracking

The SDK tracks an experiment_exposure event once per session the first time getVariant() is called for a given experiment. Calling it multiple times in the same session does not create duplicate events. To inspect which experiments the user has been exposed to in the current session:
// Get all experiment exposures for the current session
let exposures = AppDNA.experiments.getExposures()
// Returns [(experimentId: String, variant: String)]

Experiment Lifecycle

StatusgetVariant() returns
Draftnil — not visible to SDKs
RunningAssigned variant string
CompletedWinning variant for all users
Archivednil — removed from config

Full Example

import AppDNASDK

class PaywallExperiment {
    private weak var presenter: UIViewController?

    init(presenter: UIViewController) {
        self.presenter = presenter
    }

    func showPaywall() {
        guard let vc = presenter else { return }

        let variant = AppDNA.experiments.getVariant("paywall_redesign")

        let paywallId: String
        switch variant {
        case "new_design":
            paywallId = "paywall_v2"
        default:
            paywallId = "paywall_v1"
        }

        AppDNA.paywall.present(
            paywallId,
            from: vc,
            context: PaywallContext(
                placement: "settings",
                experiment: "paywall_redesign",
                variant: variant ?? "control"
            )
        )
    }
}
Experiments are created and managed in the Console under Experiments. The SDK uses MurmurHash3 for deterministic assignment — the same user always gets the same variant across sessions, platforms, and even offline.