Idi na dokumentaciju

iOS SDK

Kixo iOS SDK podržava Swift 5.9+ i iOS 16+ za analitiku, atribuciju, push, praćenje životnog ciklusa i replay sesija. Replay koristi prekidače za snimanje na nivou projekta i podrazumevano oprezna podešavanja za zahtevnije tokove obrade; ne uvodi poseban minimalni OS niti ograničenje na model uređaja mimo iOS 16 deployment targeta paketa. SDK se isporučuje preko Swift Package Manager-a i jednim pozivom Kixo.configure automatski prati ekrane, dodire, sesije, padove aplikacije, push notifikacije i događaje životnog ciklusa. Praćenje mrežnih zahteva se uključuje po želji.

Instalacija

Swift Package Manager

U Xcode-u idite na File → Add Package Dependencies i unesite:

text
https://github.com/kixoio/kixo-ios-sdk

Ako zavisnostima upravljate u Package.swift, koristite binarni release paket i proizvod:

swift
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"),
        ]
    )
]

Podesite

Inicijalizujte Kixo u svojoj SwiftUI strukturi App ili u AppDelegate:

swift
import Kixo

@main
struct MyApp: App {
    init() {
        Kixo.configure(
            projectId: "YOUR_PROJECT_ID",
            apiKey: "YOUR_API_KEY"
        )
    }

    var body: some Scene {
        WindowGroup { ContentView() }
    }
}

Napomena

Dovoljan je jedan red. SDK podrazumevano koristi produkciono okruženje, upravljani ingest host i uključuje standardne auto-trackere. Pojedinačne oznake menjajte pomoću ConfigurationOptions(...) samo kada je potrebno.

Opcije konfiguracije

swift
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
    )
)

Napomena

Konfiguracija pod kontrolom servera. Svaka oznaka po trackeru može da se promeni i na stranici Settings → Data Collection u dashboardu. Podešavanja projekta mogu da nadjačaju lokalne podrazumevane vrednosti.

Automatski praćeni događaji

  • screen_view — trenutna pojavljivanja UIKit kontrolera prikaza i SwiftUI navigacija
  • screen_visit — strukturisana poseta koja se zatvara pri navigaciji ili prelasku u pozadinu, sa vremenom zadržavanja, brojačima angažovanja, identitetom ekrana i metapodacima toka
  • session_start / session_end
  • tap — dodiri dugmadi i prepoznavači gestova
  • crash — zabeležena dijagnostika padova i izuzetaka
  • network — opcioni sanitizovani agregati zahteva i dijagnostika ruta
  • push_received / push_open / push_dismissed / push_silent / push_action — ceo životni ciklus push poruke
  • push_permission / push_token_invalidated
  • lifecycle — prelazi u foreground, background i pri pokretanju aplikacije

Prilagođeni događaji

swift
Kixo.track("purchase_completed", properties: [
    "product_id": "SKU-123",
    "amount": 49.99,
    "currency": "USD",
])

Tipizovani pomoćnici za događaje

Pojednostavljeni sloj preko Kixo.track za događaje koje Kixo prepoznaje po nazivu (purchase, signup, subscribe_start, trial_start, cancel, upgrade, activation, share, invite). Provera oblika svojstava pri kompajliranju i jedno centralno mesto za nazive ključeva — backend detektor standardnih događaja traži doslovno podudaranje.

swift
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)

Identifikujte korisnike

Rezervisani standardni ključevi svojstava nose prefiks $ (Mixpanel konvencija) kako bi bili odvojeni od vaših prilagođenih osobina i prikazivali se u kolonama profila na dashboardu. Koristite tipizovani enum StandardProperty ili sirovu nisku sa prefiksom $ — u Standardni katalog svojstava ispod je kompletna lista od 37 ključeva.

swift
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
])

Označite korisnika za segmentaciju

Koristite setUserProperty sa vrednošću tipa logička vrednost da korisniku dodelite jednostavnu da/ne oznaku. Oznaka ostaje sačuvana kroz sesije i koristi se za segmente, email kampanje i upite u chatu — bez dodatnog podešavanja osim SDK poziva.

swift
// 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",
])

Svojstva se čuvaju u UserDefaults između pokretanja i automatski se dodaju svakom odlaznom događaju. U chatu recite nešto poput "pošalji imejl dobrodošlice korisnicima gde je subscribe true" — Kixo će za vas napraviti segment i pripremiti šablon. Brišu se pri Kixo.reset().

Standardni katalog svojstava

Rezervisani ključevi svojstava nose prefiks $ kako bi bili odvojeni od vaših prilagođenih osobina. Kixo katalog obuhvata 37 ključeva u 3 univerzalna paketa (identitet, geo, životni ciklus) i 5 B2B vertikalnih paketa (pretplata, e-trgovina, mediji, tržište, program lojalnosti). Podesite samo ono što je relevantno za vaš proizvod — dashboard se prilagođava i prikazuje samo pakete koje popunite.

Identitet

Uvek relevantno. Podešava kolone zaglavlja profila.

KljučTipOpis
$emailniskaPrimarna imejl adresa, često glavni ključ za povezivanje identiteta.
$phoneniskaBroj telefona u formatu E.164.
$nameniskaPuno ime za prikaz.
$first_nameniskaIme.
$last_nameniskaPrezime.
$avatar_urlniskaPun URL do korisnikove avatar slike.

Geo

Geografski kontekst.

KljučTipOpis
$countryniskaISO 3166 kod države.
$cityniskaNaziv grada.
$regionniskaDržava ili pokrajina.
$timezoneniskaIANA zona, na primer America/Los_Angeles.
$languageniskaIETF oznaka, na primer en ili ru-RU.
$localeniskaPuni identifikator lokalizacije.

Životni ciklus

Kada smo ga videli.

KljučTipOpis
$createdISO8601Vreme registracije ili otvaranja naloga.
$last_seenISO8601Vreme poslednje interakcije.

Pretplata

Podesite ako vaš proizvod ima planove.

KljučTipOpis
$planniskaSlug nivoa — free, pro, enterprise.
$subscription_statusniskaactive / trial / cancelled / past_due.
$trial_endsISO8601Kada ističe trenutni probni period.
$mrrbrojMesečni ponavljajući prihod u valuti naloga.
$subscription_startedISO8601Kada je počela trenutna pretplata.

E-trgovina

Podesite ako prodajete proizvode.

KljučTipOpis
$lifetime_ordersbrojBroj završenih porudžbina.
$lifetime_revenuebrojUkupna potrošnja.
$aovbrojProsečna vrednost porudžbine.
$last_purchaseISO8601Najnovija uspešna kupovina.
$first_purchaseISO8601Prva uspešna kupovina.
$cart_abandoned_countbrojUkupan broj napuštanja korpe.

Mediji

Podesite ako objavljujete sadržaj.

KljučTipOpis
$content_tierniskafree / premium / paid.
$subscribed_categoriesCSV string ili nizKategorije koje korisnik prati.
$watch_time_totalbrojUkupno vreme gledanja u sekundama.
$last_playedISO8601Najnovije pokretanje reprodukcije.

Tržište

Podesite ako ste platforma sa dve strane.

KljučTipOpis
$seller_tierniskaSlug nivoa na strani prodavca.
$buyer_tierniskaSlug paketa na strani kupca.
$listings_countbrojAktivni oglasi koje korisnik poseduje.
$reviews_countbrojRecenzije koje je korisnik dobio.
$verifiedlogička vrednostKYC status.

Program lojalnosti

Podesite ako koristite programe angažovanja i nagrađivanja.

KljučTipOpis
$loyalty_pointsbrojTrenutni raspoloživi saldo poena.
$vip_levelniskaSlug VIP nivoa.
$referral_countbrojUspešne preporuke pripisane ovom korisniku.

Savet

Ne vidite svoj obrazac? Za prilagođene trait-ove koristite obične ključeve. Prikazuju se u panelu Custom Traits na dashboardu, bez zagušenja kolona profila. Pet vertikalnih paketa iznad su promišljene pretpostavke o najčešćim B2B modelima — terminologija specifična za korisnika (npr. shipping_plan) ostaje bez prefiksa.

Super-svojstva

Parovi ključ/vrednost na nivou sesije koji se automatski dodaju svakom odlaznom događaju. Za razliku od identify osobina, koje opisuju identitet, super-svojstva opisuju kontekst sesije — aktivnu A/B varijantu, varijantu builda i uključene feature flagove. Čuvaju se u UserDefaults i ostaju sačuvana između pokretanja; brišu se pri reset(). Svojstva properties u track uvek imaju prednost pri koliziji.

swift
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()

Praćenje ekrana u SwiftUI

Prikazi ekrana u SwiftUI prate se automatski kada SDK može da odredi naziv prikaza. Za precizniju kontrolu ili prilagođene nazive koristite modifikator prikaza .kixoScreen():

swift
struct HomeView: View {
    var body: some View {
        VStack { Text("Welcome") }
            .kixoScreen("HomeView")
    }
}

Snimak sesije

Replay rekonstruiše ono što je korisnik zaista video — SDK snima kadrove ekrana kodirane u HEIC, zajedno sa strukturnim snimkom hijerarhije prikaza, a plejer u dashboardu ih spaja u prikaz koji može da se premotava, pored vremenske linije događaja. Podesite replay za projekat u Kontrolna tabla → Podešavanja → Snimanje sesije; SDK tu politiku čita automatski i osvežava je dok aplikacija radi.

swift
Kixo.configure(
    projectId: "YOUR_PROJECT_ID",
    apiKey: "YOUR_API_KEY"
)

Na dashboardu se podešava da li je replay uključen, maskiranje, režimi snimanja i da li native replay sme da otprema podatke preko mobilne mreže. Kada je otpremanje preko mobilne mreže isključeno, kadrovi i dalje mogu da se snimaju u ograničeni bafer na uređaju; otpremanje čeka dozvoljenu mrežu.

SDK beleži podatke koji su uključeni u projektu, kao i događaje i svojstva koje vaša aplikacija šalje.

Maskiranje i privatnost

Pošto replay snima piksele, redakcija se obavlja na uređaju pre nego što se ijedan kadar kodira. Lozinke i druga osetljiva polja automatski se prepoznaju i rediguju, a tekst uhvaćen u strukturnom snimku prolazi kroz PII filter. Ako želite da redigujete nešto prilagođeno — privatnu prepisku, stanje računa, ekran sa nacrtom — postavite kxRedact na prikaz. Kixo pre HEIC kodiranja iscrtava puni pravougaonik preko granica tog prikaza, tako da njegovi pikseli nikada ne napuštaju uređaj.

swift
balanceLabel.kxRedact = true
cardNumberField.kxRedact = true

Savet

Dodiri zabeleženi na ekranima u replay-u takođe pune mobilnu toplotnu mapu na dashboardu, pa bez dodatnog podešavanja SDK-a vidite gde korisnici dodiruju svaki ekran. Replay zavisi od plana vašeg projekta; kada snimanje kadrova nije dostupno, SDK i dalje beleži metapodatke sesije bez otpremanja toka kadrova.

Push obaveštenja

SDK postavlja AppDelegate proxy u runtime-u na Kixo.configure — tihi push-evi (content-available: 1) i vidljivi push-evi isporučeni u pozadini beleže se automatski. Ne morate da dodajete nikakav kod u AppDelegate. Postojeće implementacije UNUserNotificationCenterDelegate nastavljaju da rade normalno; Kixo ih samo obavija.

Registrujte token uređaja preko standardnog didRegisterForRemoteNotificationsWithDeviceToken:

swift
func application(
    _ application: UIApplication,
    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
    let token = deviceToken.map { String(format: "%02x", $0) }.joined()
    Kixo.setPushToken(token)
}

Ako aplikacija koristi Firebase Messaging, prosledite njegov registration token pomoću provider: .firebase. Kixo čuva tog provajdera i isporučuje poruke preko FCM HTTP v1; pre slanja kampanja podesite Firebase service account aplikacije u Kixo.

swift
func messaging(_ messaging: Messaging, didReceiveRegistrationToken token: String?) {
    guard let token else { return }
    Kixo.setPushToken(token, provider: .firebase)
}

Isporuka i ponašanje van mreže

SDK lokalno stavlja događaje u red, šalje ih u paketima i ponavlja privremeno neuspele pokušaje uz backoff. Ako je prikupljanje pauzirano u podešavanjima projekta, novi događaji se ne šalju dok se prikupljanje ponovo ne uključi.

Dijagnostika

Snimak stanja samo za čitanje. Koristan na debug ekranima ili u smoke testovima — odgovara na pitanje „zašto mi događaji ne stižu?” bez debagera.

swift
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 host

Prinudno slanje reda (za testove)

Sinhroni overload koji blokira do timeout sekundi dok se flush ne završi. Namenjen je za XCTest fixture-e — nikad ga ne pozivajte sa glavne niti.

swift
func testEventLanded() {
    Kixo.track("test_event")
    let landed = Kixo.flush(timeout: 5.0)
    XCTAssertTrue(landed)
}

Resetuj

Obrišite identitet, super-svojstva i sačuvani red. Pozovite pri odjavi kako naredni događaji ne bi bili pripisani prethodnom korisniku.

swift
Kixo.reset()