Contents

canopy-labs/featureflip-swift

Swift SDK for Featureflip — feature flags for teams that ship fast (read-only mirror)

Installation

Swift Package Manager

Add to your Package.swift:

dependencies: [
    .package(url: "https://github.com/canopy-labs/featureflip-swift", from: "2.0.0")
]

Or in Xcode: File > Add Package Dependencies, then enter the repository URL.

Quick Start

import Featureflip

let config = FeatureflipConfig(clientKey: "your-client-sdk-key")
let client = FeatureflipClient(config: config)

await client.initialize()

let enabled = client.boolVariation("my-feature", default: false)

if enabled {
    print("Feature is enabled!")
}

await client.close()

Configuration

let config = FeatureflipConfig(
    clientKey: "your-client-sdk-key",
    baseUrl: "https://eval.featureflip.io",      // Evaluation API URL (default)
    context: ["user_id": "123"],                   // Initial evaluation context
    streaming: true,                               // SSE for real-time updates (default)
    pollInterval: 30,                              // Polling interval in seconds
    flushInterval: 30,                             // Event flush interval in seconds
    flushBatchSize: 100,                           // Events per batch
    initTimeout: 10                                // Max seconds to wait for initialization
)

Evaluation

// Boolean flag
let enabled = client.boolVariation("feature-key", default: false)

// String flag
let tier = client.stringVariation("pricing-tier", default: "free")

// Number flag
let limit = client.numberVariation("rate-limit", default: 100.0)

// JSON flag
let config = client.jsonVariation("ui-config", default: .object(["theme": .string("light")]))

Identify

Re-evaluate all flags with a new context (e.g., after login):

try await client.identify(context: ["user_id": "123", "plan": "pro"])

Event Tracking

// Track custom events
await client.track("checkout-completed", metadata: ["total": .number(99.99)])

// Force flush pending events
await client.flush()

SwiftUI Integration

import Featureflip

struct ContentView: View {
    @EnvironmentObject var flagProvider: FeatureFlagProvider

    var body: some View {
        if flagProvider.boolVariation("show-banner", default: false) {
            BannerView()
        }
    }
}

Testing

Use forTesting() to create a client with predetermined flag values -- no network calls.

let client = FeatureflipClient.forTesting([
    "my-feature": true,
    "pricing-tier": "pro",
])

client.boolVariation("my-feature", default: false)     // true
client.stringVariation("pricing-tier", default: "free") // "pro"
client.boolVariation("unknown", default: false)         // false (default)

Features

  • Client-side evaluation - Flags evaluated server-side, only values returned
  • Real-time updates - SSE streaming with automatic polling fallback
  • Event tracking - Automatic batching and background flushing
  • Test support - forTesting() factory for deterministic unit tests
  • SwiftUI support - FeatureFlagProvider for reactive flag values
  • Singleton-by-construction - Same clientKey shares one refcounted core

Platforms

  • iOS 15+
  • macOS 13+
  • tvOS 15+
  • watchOS 8+

Requirements

  • Swift 5.9+

License

MIT

Package Metadata

Repository: canopy-labs/featureflip-swift

Homepage: https://featureflip.io/docs/sdks/swift/

Stars: 0

Forks: 0

Open issues: 0

Default branch: master

Primary language: swift

License: Apache-2.0

README: README.md