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:
https://github.com/kixoio/kixo-ios-sdkAko zavisnostima upravljate u Package.swift, koristite binarni release paket i proizvod:
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:
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
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 navigacijascreen_visit— strukturisana poseta koja se zatvara pri navigaciji ili prelasku u pozadinu, sa vremenom zadržavanja, brojačima angažovanja, identitetom ekrana i metapodacima tokasession_start/session_endtap— dodiri dugmadi i prepoznavači gestovacrash— zabeležena dijagnostika padova i izuzetakanetwork— opcioni sanitizovani agregati zahteva i dijagnostika rutapush_received/push_open/push_dismissed/push_silent/push_action— ceo životni ciklus push porukepush_permission/push_token_invalidatedlifecycle— prelazi u foreground, background i pri pokretanju aplikacije
Prilagođeni događaji
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.
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.
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.
// 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č | Tip | Opis |
|---|---|---|
$email | niska | Primarna imejl adresa, često glavni ključ za povezivanje identiteta. |
$phone | niska | Broj telefona u formatu E.164. |
$name | niska | Puno ime za prikaz. |
$first_name | niska | Ime. |
$last_name | niska | Prezime. |
$avatar_url | niska | Pun URL do korisnikove avatar slike. |
Geo
Geografski kontekst.
| Ključ | Tip | Opis |
|---|---|---|
$country | niska | ISO 3166 kod države. |
$city | niska | Naziv grada. |
$region | niska | Država ili pokrajina. |
$timezone | niska | IANA zona, na primer America/Los_Angeles. |
$language | niska | IETF oznaka, na primer en ili ru-RU. |
$locale | niska | Puni identifikator lokalizacije. |
Životni ciklus
Kada smo ga videli.
| Ključ | Tip | Opis |
|---|---|---|
$created | ISO8601 | Vreme registracije ili otvaranja naloga. |
$last_seen | ISO8601 | Vreme poslednje interakcije. |
Pretplata
Podesite ako vaš proizvod ima planove.
| Ključ | Tip | Opis |
|---|---|---|
$plan | niska | Slug nivoa — free, pro, enterprise. |
$subscription_status | niska | active / trial / cancelled / past_due. |
$trial_ends | ISO8601 | Kada ističe trenutni probni period. |
$mrr | broj | Mesečni ponavljajući prihod u valuti naloga. |
$subscription_started | ISO8601 | Kada je počela trenutna pretplata. |
E-trgovina
Podesite ako prodajete proizvode.
| Ključ | Tip | Opis |
|---|---|---|
$lifetime_orders | broj | Broj završenih porudžbina. |
$lifetime_revenue | broj | Ukupna potrošnja. |
$aov | broj | Prosečna vrednost porudžbine. |
$last_purchase | ISO8601 | Najnovija uspešna kupovina. |
$first_purchase | ISO8601 | Prva uspešna kupovina. |
$cart_abandoned_count | broj | Ukupan broj napuštanja korpe. |
Mediji
Podesite ako objavljujete sadržaj.
| Ključ | Tip | Opis |
|---|---|---|
$content_tier | niska | free / premium / paid. |
$subscribed_categories | CSV string ili niz | Kategorije koje korisnik prati. |
$watch_time_total | broj | Ukupno vreme gledanja u sekundama. |
$last_played | ISO8601 | Najnovije pokretanje reprodukcije. |
Tržište
Podesite ako ste platforma sa dve strane.
| Ključ | Tip | Opis |
|---|---|---|
$seller_tier | niska | Slug nivoa na strani prodavca. |
$buyer_tier | niska | Slug paketa na strani kupca. |
$listings_count | broj | Aktivni oglasi koje korisnik poseduje. |
$reviews_count | broj | Recenzije koje je korisnik dobio. |
$verified | logička vrednost | KYC status. |
Program lojalnosti
Podesite ako koristite programe angažovanja i nagrađivanja.
| Ključ | Tip | Opis |
|---|---|---|
$loyalty_points | broj | Trenutni raspoloživi saldo poena. |
$vip_level | niska | Slug VIP nivoa. |
$referral_count | broj | Uspeš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.
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():
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.
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.
balanceLabel.kxRedact = true
cardNumberField.kxRedact = trueSavet
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:
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.
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.
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 hostPrinudno 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.
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.
Kixo.reset()