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
| Method | Signature | Description |
|---|
getVariant | getVariant(_ experimentId: String) -> String? | Get the assigned variant |
getExposures | getExposures() -> [(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
| Status | getVariant() returns |
|---|
| Draft | nil — not visible to SDKs |
| Running | Assigned variant string |
| Completed | Winning variant for all users |
| Archived | nil — 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.