iOS SDK
Kixo iOS SDK understøtter Swift 5.9+ og iOS 16+ til analytics, attribution, push, livscyklussporing og session replay. Replay følger projektets optagelsesindstillinger og bruger forsigtige standardvalg til de tungere pipelines; der er ingen særskilt minimumsgrænse for OS eller enhedsmodel ud over pakkens deployment target på iOS 16. SDK'et distribueres via Swift Package Manager og sporer automatisk skærme, tryk, sessioner, nedbrud, pushnotifikationer og livscyklushændelser med ét kald til Kixo.configure. Sporing af netværksforespørgsler er opt-in.
Installation
Swift Package Manager
Gå i Xcode til File → Add Package Dependencies, og indtast:
https://github.com/kixoio/kixo-ios-sdkHvis du håndterer afhængigheder i Package.swift, skal du bruge den binære release-pakke og dette product:
dependencies: [
.package(
url: "https://github.com/kixoio/kixo-ios-sdk",
from: "1.0.21"
),
],
targets: [
.target(
name: "YourApp",
dependencies: [
.product(name: "Kixo", package: "kixo-ios-sdk"),
]
)
]Konfigurer
Initialisér Kixo i din SwiftUI App-struct eller AppDelegate:
import Kixo
@main
struct MyApp: App {
init() {
Kixo.configure(
projectId: "YOUR_PROJECT_ID",
apiKey: "YOUR_API_KEY"
)
}
var body: some Scene {
WindowGroup { ContentView() }
}
}Bemærk
Én linje er nok. SDK'et bruger production som standardmiljø, den administrerede ingest-host og slår de almindelige auto-trackere til. Tilsidesæt kun enkelte flag med ConfigurationOptions(...), når du har brug for det.
Konfigurationsmuligheder
Kixo.configure(
projectId: "YOUR_PROJECT_ID",
apiKey: "YOUR_API_KEY",
options: ConfigurationOptions(
autoTrackScreens: true,
autoTrackTaps: true,
autoTrackNetwork: false,
autoTrackCrashes: true,
autoTrackSessions: true,
autoTrackPush: true,
sessionTimeout: 30,
flushInterval: 30,
flushAt: 20,
maxBufferSize: 200,
// apiHost: nil → managed Kixo ingest host
// debug: nil → true in DEBUG, false otherwise
// environment: nil → production
)
)Bemærk
Konfiguration styret fra serveren. Hver enkelt tracker-indstilling kan også slås til eller fra på dashboardets side Settings → Data Collection. Projektindstillinger kan tilsidesætte lokale standarder.
Automatisk registrerede events
screen_view— øjeblikkelige visninger af UIKit view controllers samt SwiftUI-navigationscreen_visit— et struktureret besøg, der afsluttes ved navigation eller når appen går i baggrunden, med opholdstid, engagementstællinger, skærmidentitet og flow-metadatasession_start/session_endtap— tryk på knapper og gesture recognizerscrash— indsamlet diagnostik for crashes og exceptionsnetwork— valgfrie, rensede aggregater af forespørgsler og rutediagnostikpush_received/push_open/push_dismissed/push_silent/push_action— hele push-livscyklussenpush_permission/push_token_invalidatedlifecycle— overgange mellem foreground, background og appstart
Brugerdefinerede events
Kixo.track("purchase_completed", properties: [
"product_id": "SKU-123",
"amount": 49.99,
"currency": "USD",
])Typede eventhjælpere
Et bekvemt lag oven på Kixo.track til de events, Kixo genkender på navn (purchase, signup, subscribe_start, trial_start, cancel, upgrade, activation, share, invite). Giver validering af egenskabernes struktur ved kompileringstid og ét samlet sted for nøglenavne — backendens standardevent-detektor matcher ordret.
Kixo.trackPurchase(
amount: 49.99,
currency: "USD",
productId: "pro_yearly"
)
Kixo.trackSubscriptionStart(
plan: "pro",
amount: 9.99,
currency: "USD",
interval: .month
)
Kixo.trackSignup(method: "google")
Kixo.trackTrialStart(plan: "pro", days: 14)
Kixo.trackCancel(plan: "pro", reason: "too_expensive")
Kixo.trackUpgrade(fromPlan: "free", toPlan: "pro")
Kixo.trackActivation(event: "first_post_published")
Kixo.trackShare(channel: "twitter", contentId: "post_123")
Kixo.trackInvite(channel: "email", recipientCount: 5)Identificér brugere
Reserverede standardnøgler for egenskaber har præfikset $ (Mixpanel-konvention), så de holdes adskilt fra dine egne traits og vises i dashboardets profilkolonner. Brug den typede StandardProperty-enum eller den rå streng med præfikset $ — se Standardkatalog over egenskaber nedenfor for hele listen med 37 nøgler.
Kixo.identify("user_123", traits: [
"$email": "jane@example.com", // identity
"$name": "Jane Doe", // identity
"$plan": "pro", // subscription pack
"$lifetime_orders": 12, // e-commerce pack
"signup_source": "twitter_ad" // custom trait
])Tag en bruger til segmentering
Brug setUserProperty med en boolsk-værdi for at knytte et enkelt ja/nej-tag til brugeren. Tagget bevares på tværs af sessioner og bruges i segmenter, e-mailkampagner og chatforespørgsler — uden anden opsætning end SDK-kaldet.
// Tag a user as subscribed — segments + campaigns can target this
Kixo.setUserProperty("subscribe", value: true)
// VIP membership
Kixo.setUserProperty("vip", value: true)
// String + numeric values work too
Kixo.setUserProperty("plan_tier", value: "enterprise")
Kixo.setUserProperty("lifetime_orders", value: 42)
// Bulk-set
Kixo.setUserProperties([
"subscribe": true,
"plan_tier": "enterprise",
])Egenskaber gemmes i UserDefaults på tværs af appstarter og knyttes automatisk til alle udgående events. I chat kan du skrive ting som "send en velkomstmail til brugere, hvor subscribe er true" — Kixo bygger segmentet og laver et udkast til skabelonen for dig. Ryddes ved Kixo.reset().
Standardkatalog over egenskaber
Reserverede property keys har præfikset $, så de holdes adskilt fra jeres egne traits. Kixo's katalog dækker 37 nøgler fordelt på 3 universelle pakker (identitet, geo, livscyklus) og 5 B2B-pakker (abonnement, e-handel, medier, markedsplads, loyalitet). Angiv de nøgler, der passer til jeres produkt — dashboardet tilpasser sig og viser kun de pakker, I faktisk bruger.
Identitet
Altid relevant. Angiver kolonnerne i profiloverskriften.
| Nøgle | Type | Beskrivelse |
|---|---|---|
$email | streng | Primær e-mailadresse, ofte brugt som merge key til identity stitching. |
$phone | streng | E.164-telefonnummer. |
$name | streng | Fuldt visningsnavn. |
$first_name | streng | Fornavn. |
$last_name | streng | Efternavn. |
$avatar_url | streng | Fuld URL til brugerens avatarbillede. |
Geografi
Geografisk kontekst.
| Nøgle | Type | Beskrivelse |
|---|---|---|
$country | streng | ISO-landekode efter 3166-standarden. |
$city | streng | Bynavn. |
$region | streng | Delstat eller provins. |
$timezone | streng | IANA-zone som America/Los_Angeles. |
$language | streng | IETF-tag som en eller ru-RU. |
$locale | streng | Fuldt locale-id. |
Livscyklus
Hvornår vi sidst så dem.
| Nøgle | Type | Beskrivelse |
|---|---|---|
$created | ISO8601 | Tidspunkt for tilmelding eller kontooprettelse. |
$last_seen | ISO8601 | Tidspunkt for seneste aktivitet. |
Abonnement
Angiv denne, hvis dit produkt har abonnementer.
| Nøgle | Type | Beskrivelse |
|---|---|---|
$plan | streng | Slug for niveau — free, pro, enterprise. |
$subscription_status | streng | active / trial / cancelled / past_due. |
$trial_ends | ISO8601 | Hvornår den nuværende prøveperiode udløber. |
$mrr | tal | Månedlig tilbagevendende omsætning i kontoens valuta. |
$subscription_started | ISO8601 | Hvornår det nuværende abonnement startede. |
E-handel
Angiv denne, hvis I sælger produkter.
| Nøgle | Type | Beskrivelse |
|---|---|---|
$lifetime_orders | tal | Antal gennemførte ordrer. |
$lifetime_revenue | tal | Samlet forbrug. |
$aov | tal | Gennemsnitlig ordreværdi. |
$last_purchase | ISO8601 | Seneste gennemførte køb. |
$first_purchase | ISO8601 | Første gennemførte køb. |
$cart_abandoned_count | tal | Samlet antal forladte indkøbskurve. |
Medier
Angiv denne, hvis I udgiver indhold.
| Nøgle | Type | Beskrivelse |
|---|---|---|
$content_tier | streng | free / premium / paid. |
$subscribed_categories | CSV-streng eller array | Kategorier, som brugeren følger. |
$watch_time_total | tal | Samlet afspilningstid i sekunder. |
$last_played | ISO8601 | Seneste afspilningsstart. |
Markedsplads
Angiv denne, hvis I driver en platform med to sider.
| Nøgle | Type | Beskrivelse |
|---|---|---|
$seller_tier | streng | Slug for sælgers niveau. |
$buyer_tier | streng | Slug for købers niveau. |
$listings_count | tal | Aktive annoncer, som brugeren ejer. |
$reviews_count | tal | Anmeldelser, brugeren har modtaget. |
$verified | boolsk | KYC-status. |
Loyalitet
Bruges til engagements- og belønningsprogrammer.
| Nøgle | Type | Beskrivelse |
|---|---|---|
$loyalty_points | tal | Aktuel saldo af indløselige point. |
$vip_level | streng | Slug for VIP-niveau. |
$referral_count | tal | Vellykkede henvisninger tilskrevet denne bruger. |
Tip
Kan du ikke se dit mønster? Brug nøgler uden præfiks til brugerdefinerede traits. De vises i dashboardets panel for Custom Traits uden at rode profilkolonnerne til. De fem vertikale pakker ovenfor er kvalificerede bud på de mest almindelige B2B-mønstre — kundespecifik terminologi (fx shipping_plan) forbliver uden præfiks.
Super-properties
Nøgle/værdi-par pr. session, som automatisk knyttes til alle udgående events. I modsætning til identify traits, som beskriver identitet, beskriver super-properties sessionens kontekst — aktiv A/B-variant, build-variant og tilvalgte feature flags. Gemmes i UserDefaults på tværs af appstarter og ryddes ved reset(). Ved kollision har properties på track altid forrang.
Kixo.setSuperProperty("build_flavor", value: "beta")
Kixo.setSuperProperties([
"ab_variant": "B",
"referrer_campaign": "autumn-launch",
])
// Sugar for A/B tracking — keys as 'experiment_<id>'.
Kixo.setExperimentVariant("checkout_v2", variant: "variant_a")
Kixo.unsetSuperProperty("build_flavor")
Kixo.clearSuperProperties()Automatisk skærmsporing i SwiftUI
Skærmvisninger i SwiftUI spores automatisk, når SDK'et kan afgøre navnet på et view. Hvis du vil have mere kontrol eller bruge egne navne, kan du bruge view-modifieren .kixoScreen():
struct HomeView: View {
var body: some View {
VStack { Text("Welcome") }
.kixoScreen("HomeView")
}
}Sessionsafspilning
Replay genskaber det, brugeren faktisk så — SDK'et indsamler skærmbilleder som HEIC-kodede billedrammer sammen med et strukturelt snapshot af view-hierarkiet, og afspilleren i dashboardet samler det til en gennemseelig afspilning ved siden af eventtidslinjen. Konfigurer replay for projektet i Dashboard → Indstillinger → Sessionsafspilning; SDK'et læser automatisk den politik og opdaterer den, mens appen kører.
Kixo.configure(
projectId: "YOUR_PROJECT_ID",
apiKey: "YOUR_API_KEY"
)I dashboardet styrer du, om replay er slået til, maskering, optagelsestilstande og om native replay må uploade via mobilnetværk. Hvis upload via mobilnetværk er slået fra, kan frames stadig optages i en afgrænset buffer på enheden; uploaden venter på et tilladt netværk.
SDK'et indsamler de data, der er slået til i projektet, samt de events og properties, som appen sender.
Maskering og privatliv
Fordi replay indsamler pixels, sker maskeringen på enheden før, før et billede overhovedet bliver kodet. Adgangskoder og andre følsomme felter registreres automatisk og maskeres, og tekst, der indsamles i det strukturelle snapshot, går gennem et PII-filter. Hvis du vil maskere noget brugerdefineret — en privat beskedtråd, en kontosaldo eller en kladdeskærm — skal du sætte kxRedact på viewet. Kixo rasteriserer et dækkende rektangel over viewets grænser før HEIC-kodning, så dets pixels aldrig forlader enheden.
balanceLabel.kxRedact = true
cardNumberField.kxRedact = trueTip
Tryk, der registreres på skærme i replay, bruges også i dashboardets mobile heatmap, så du kan se, hvor brugerne trykker på hver skærm, uden ekstra opsætning af SDK'et. Replay afhænger af projektets abonnement; hvis frame-optagelse ikke er tilgængelig, registrerer SDK'et stadig sessionsmetadata uden at uploade framestrømmen.
Pushnotifikationer
SDK'et installerer en AppDelegate-proxy ved kørsel på Kixo.configure — lydløse pushes (content-available: 1) og synlige pushes leveret i baggrunden registreres automatisk. Du behøver ikke skrive kode i din AppDelegate. Eksisterende UNUserNotificationCenterDelegate-implementeringer bliver fortsat kaldt som normalt; Kixo wrapper dem.
Registrér device token via den almindelige didRegisterForRemoteNotificationsWithDeviceToken:
func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
let token = deviceToken.map { String(format: "%02x", $0) }.joined()
Kixo.setPushToken(token)
}Hvis appen bruger Firebase Messaging, skal du sende registreringstokenet med provider: .firebase. Kixo gemmer den provider og leverer via FCM HTTP v1; konfigurer appens Firebase service account i Kixo, før du sender kampagner.
func messaging(_ messaging: Messaging, didReceiveRegistrationToken token: String?) {
guard let token else { return }
Kixo.setPushToken(token, provider: .firebase)
}Levering og offlineadfærd
SDK'et lægger events i lokal kø, sender dem i batches og prøver igen ved midlertidige fejl med backoff. Hvis indsamling er sat på pause i projektindstillingerne, bliver nye events ikke sendt, før den slås til igen.
Diagnostik
Skrivebeskyttet statussnapshot. Nyttigt på debugskærme eller i smoke tests — svarer på "hvorfor kommer mine events ikke igennem?" uden brug af debugger.
let diag = Kixo.diagnostics()
print(diag.queue.bufferedEventCount) // events waiting to flush
print(diag.paused) // collection paused state
print(diag.environment) // configured environment
print(diag.apiHost) // configured ingest hostGennemtving flush (til tests)
Synkron overload, der blokerer i op til timeout sekunder, mens et flush fuldføres. Beregnet til XCTest-fixtures — må aldrig kaldes fra main thread.
func testEventLanded() {
Kixo.track("test_event")
let landed = Kixo.flush(timeout: 5.0)
XCTAssertTrue(landed)
}Nulstil
Ryd identitet, super-properties og den gemte kø. Kald den ved logout, så efterfølgende events ikke tilskrives den forrige bruger.
Kixo.reset()