Skip to main content

Request flow

Installation

Add the package via Swift Package Manager:
https://github.com/reelevant-tech/reelevant-sdk-ios.git
In Xcode: File → Add Package Dependencies → paste the URL above.

Initialization

import ReelevantAnalytics

let config = ReelevantAnalytics.Configuration(
    companyId: "your-company-id",
    datasourceId: "your-datasource-id"
)
// Optional personalization config
config.runnerUrl = "https://reelevant.run"   // default
config.personalizationTimeout = 5.0           // seconds, default
config.fallback = .empty                      // default

let sdk = ReelevantAnalytics.SDK(configuration: config)

// Set user identity (shared between analytics and personalization)
sdk.setUser(userId: "user@example.com")

Analytics (event tracking)

// Page view
sdk.send(event: ReelevantAnalytics.EventBuilder.page_view(labels: ["lang": "en"]))

// Product page
sdk.send(event: ReelevantAnalytics.EventBuilder.product_page(
    productId: "product-123",
    labels: ["category": "shoes"]
))

// Purchase
sdk.send(event: ReelevantAnalytics.EventBuilder.purchase(
    ids: ["p1", "p2"],
    totalAmount: 99.99,
    labels: [:],
    transId: "order-456"
))

Personalization

Single workflow run

let result = try await sdk.run(RunOptions(
    workflowId: "wf-hero",
    entrypoint: "43a490a0"
))

switch result.body {
case .json(let data):  renderCard(data)
case .html(let html):  renderWebView(html)
case .image(let data): renderImage(data)
case .empty:           showDefault()
}

Multiple workflows in parallel

let results = try await sdk.runAll([
    RunOptions(workflowId: "wf-hero", entrypoint: "entry1"),
    RunOptions(workflowId: "wf-reco", entrypoint: "entry2")
])
// results[0] corresponds to wf-hero, results[1] to wf-reco

Click tracking

// Fire-and-forget — registers the click without following redirects
sdk.trackClick(result: result)
// or
result._trackClick()

RunOptions

ParameterTypeRequiredDescription
workflowIdStringYesWorkflow ID from the platform
entrypointStringYesEntrypoint ID within the workflow
userIdString?NoOverride identity (default: auto-resolved from setUser() / device ID)
params[String: String]?NoAdditional URL parameters forwarded to the runner
localeString?NoLocale for content resolution
timeoutTimeInterval?NoPer-call timeout override in seconds

RunResult

FieldTypeDescription
statusIntHTTP status code (0 for fallback)
sourceRunSource.runner or .fallback
bodyRunContentDiscriminated content: .json, .html, .image, or .empty
metadata[String: Any]Metadata from x-rlvt-output-node-metadata header
properties[String: Any]Properties from x-rlvt-output-properties header
runIdString?Workflow run ID for tracking correlation
executionPath[String]Branch IDs taken during execution
redirectionUrlStringPre-built click-through URL

Fallback strategies

// Return empty result on error (default)
config.fallback = .empty

// Re-throw the error
config.fallback = .error

// Custom handler
config.fallback = .custom { options, error in
    return RunResult(/* your fallback result */)
}
Personalization requires iOS 13+ / macOS 10.15+ for async/await support. Analytics works on iOS 10+.