AirLeg is a portfolio-grade B2B-style iOS SDK for event collection, delivery reliability, deep link routing, deferred deep link simulation, and privacy-aware client behavior.
AirLeg currently focuses on the SDK product surface itself:
- typed standard and custom event tracking
- user identity state
- privacy and tracking control
- in-memory and persistent queueing
- batch flush with retry-aware delivery
- deep link route parsing
- deferred deep link resolution
- request signature generation
Development tooling such as the fake ingestion server, local dashboard, sample app, and validation scripts support SDK development and verification, but they are not part of the product feature surface.
AirLeg development explicitly follows two complementary engineering practices:
- Test-Driven Development (TDD) — new SDK behavior is introduced through failing tests first, then implemented with the smallest code change that makes the test pass.
- Tidy First — structural cleanup and behavioral changes are kept separate so refactoring stays reviewable and does not hide feature changes.
In practice, this means the repository favors small red/green/refactor steps, behavior-oriented test names, and commit history that makes cleanup work distinguishable from product behavior changes.
AirLeg helps app teams handle a common set of mobile infrastructure concerns through one reusable SDK:
- track typed user events
- attach user identity context
- queue events offline and restore them after restart
- batch and retry network delivery
- normalize custom scheme and universal link handling
- resolve deferred deep links from a server response
- change collection and delivery behavior based on privacy mode
- sign outbound requests for stronger integrity guarantees
let configuration = AirLeg.ConfigurationBuilder(apiKey: "demo-key")
.environment(.production(baseURL: URL(string: "https://api.example.com")!))
.privacyMode(.full)
.build()
AirLeg.start(with: configuration)
AirLeg.setUserID("user_123")
AirLeg.track(.purchase(orderID: "order_123", price: "29.99", currency: "USD"))
try await AirLeg.flush()Additional public APIs currently available:
AirLeg.setConsent(_:)AirLeg.startTracking()/AirLeg.stopTracking()AirLeg.setUserEmail(_:)AirLeg.setUserPhone(_:)AirLeg.setUserAttributes(_:)AirLeg.clearUser()AirLeg.handle(_:, onRoute:)AirLeg.route(for:)AirLeg.observeRoutes(_:)AirLeg.resolveDeferredDeepLink()AirLeg.debugSnapshot()AirLeg.trackingAuthorizationStatus()AirLeg.requestTrackingAuthorization()AirLeg.ConfigurationBuilder(...)
screenView(name:)signUp(method:)login(method:)addToCart(productID:price:currency:)purchase(orderID:price:currency:)
custom(name:attributes:)
AirLeg supports these modes:
fullrestrictedconsentRequired
Current behavior includes:
consentRequiredblocks queueing before consent is grantedrestrictedstarts with tracking pausedrestrictedfilters sensitive fields such as email and phone from user identity and queued payloads- explicit
startTracking()/stopTracking()control
- in-memory queue by default
- file-backed persistent queue when
queuePersistenceURLis configured - retry-aware batch flush for transient failures
- queue is drained only after successful delivery
- custom scheme parsing
- universal link parsing
- route callback and observer support
- last handled route exposed in debug snapshot
- deferred deep link resolution from server response
AirLeg currently supports Swift Package Manager, CocoaPods via the repo podspec, Tuist package integration, and manual XCFramework generation.
.package(url: "https://github.com/leejh08/AirLeg.git", exact: "0.1.0")pod 'AirLeg', :git => 'https://github.com/leejh08/AirLeg.git', :tag => '0.1.0'.remote(url: "https://github.com/leejh08/AirLeg.git", requirement: .exact("0.1.0"))Then depend on .package(product: "AirLeg") from the target.
./scripts/build-xcframework.shThis generates Build/AirLeg.xcframework for local drag-and-drop integration. Add it to the app target's Frameworks, Libraries, and Embedded Content section as Embed & Sign so the dynamic framework is available at runtime.
Apps/AirLegSampleApp— monorepo test application with shared verification utilitiesAirLegSwiftUISampleApp— SwiftUI integration and manual verification flowAirLegUIKitSampleApp— UIKit/AppDelegate integration and manual verification flow
Current verification coverage includes:
- unit tests for event serialization, privacy, tracking control, request signing, queue behavior, deep link parsing, and deferred deep link logic
- integration tests for fake ingestion server endpoints, dashboard, failure injection, and deferred deep link server flow
- sample app integration test through
AirLegSampleApp - install-path verification tracking in
Docs/INSTALL-VERIFICATION-MATRIX.md
- Deployed guide:
https://airleg-guide.dsmhs.kr - Local entry point:
site/index.html
Open the local file in a browser for a help-center-style overview of installation, SDK guides, and architecture.
Docs/HARNESS.md— harness design and verification tooling overviewDocs/INSTALLATION.md— installation paths for SPM, CocoaPods, Tuist, and manual XCFramework buildsDocs/INSTALL-VERIFICATION-MATRIX.md— install path support and verification status by distribution methodDocs/ARCHITECTURE.md— internal SDK architecture and subsystem boundariesDocs/DOCS-SITE-IA.md— information architecture for the developer docs siteDocs/INTEGRATION.md— UIKit / SwiftUI integration and verification flowDocs/CI-CD.md— GitHub Actions workflow structure and release verification policyDocs/PLAN.md— milestones, phases, and current SDK development checklistDocs/MANUAL-VERIFICATION.md— feature-by-feature manual verification flow for the sample appsbacklog.md— now / next / later prioritization for the active SDK roadmapCHANGELOG.md— release notes by version
- full mobile attribution platform behavior
- ad partner integrations
- MMP feature parity
- large production backend infrastructure
Active SDK product development with local verification infrastructure.