Prejsť na dokumentáciu

Android SDK

Kixo Android SDK podporuje Kotlin 2.0+ aj Javu, vyžaduje minSdk 24 (Android 7.0) a je zostavené proti compileSdk 35. Vaša hostiteľská aplikácia si naďalej spravuje vlastné targetSdk. Jediné volanie Kixo.configure vo vašej triede Application.onCreate automaticky sleduje obrazovky, ťuknutia, relácie, pády a udalosti životného cyklu. Sledovanie push notifikácií vyžaduje nižšie opísaný FCM bridge. Automatické sledovanie sieťových požiadaviek zatiaľ nie je súčasťou aktuálneho vydania pre Android. SDK podporuje aj replay relácií, identitu a ciele.

Rýchly štart

Tri súbory. Pridajte Maven repozitár, pridajte závislosť a potom vložte dva riadky do svojej podtriedy Application.

Požiadavky na build: compileSdk 35, minSdk 24, Kotlin 2.0+ alebo Java a bytecode pre Java 17.

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven {
            url = uri("https://raw.githubusercontent.com/kixoio/kixo-android-sdk/main/repo")
        }
    }
}

Poznámka

Tým je integrácia analytiky hotová. Štandardné automatické trackery sú predvolene zapnuté; push stále vyžaduje nižšie uvedený FCM bridge. Jednotlivé príznaky prepisujte cez KixoConfiguration.Builder(...) len vtedy, keď to naozaj potrebujete.

Pridajte do aplikácie

Kixo Maven repozitár je hostovaný na GitHub Pages. Pridajte ho vedľa google() a mavenCentral() v settings.gradle.kts:

kotlin
// settings.gradle.kts
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven {
            url = uri("https://raw.githubusercontent.com/kixoio/kixo-android-sdk/main/repo")
        }
    }
}

Potom deklarujte závislosť v module aplikácie:

kotlin
// app/build.gradle.kts
dependencies {
    implementation("io.kixo:kixo-android-sdk:0.1.20")
}

Tip

android.permission.INTERNET a android.permission.ACCESS_NETWORK_STATE sú súčasťou manifestu SDK. Povolenia pre notifikácie zostávajú vo vašej aplikácii a deklarujete ich až pri zapnutí push funkcií.

Viacmodulové projekty

Konfigurácia implementation v Gradle je nie je tranzitívna: ak v knižničnom module, napríklad v :core_domain, deklarujete implementation("io.kixo:kixo-android-sdk:0.1.20"), Kixo sa tým NESPRÍSTUPNÍ pre :app ani pre žiadneho iného konzumenta. Fungujú dva prístupy — vyberte si jeden.

Pattern A — každý modul, ktorý volá Kixo, si ho deklaruje sám (odporúčané). Udrží classpath každého modulu čo najmenší a zabráni reťazovým rebuildom. Použite version catalog (libs.kixo.sdk), aby ste verziu menili len na jednom mieste.

kotlin
// :core_domain/build.gradle.kts
dependencies {
    implementation("io.kixo:kixo-android-sdk:0.1.20")   // local use only
}

// :app/build.gradle.kts
dependencies {
    implementation(project(":core_domain"))
    implementation("io.kixo:kixo-android-sdk:0.1.20")   // declared again — fine
}

Pattern B — re-export cez api(...). Jedna deklarácia, ale verejné ABI knižničného modulu tým začne obsahovať typy Kixo — každá zmena verzie potom vyvolá rebuild všetkých nadväzujúcich modulov. Použite to len vtedy, keď knižnica používa typy Kixo aj vo vlastných verejných signatúrach, napríklad ak funkcia vracia KixoDiagnostics.

kotlin
// :core_domain/build.gradle.kts
dependencies {
    api("io.kixo:kixo-android-sdk:0.1.20")              // re-exposed
}

// :app/build.gradle.kts
dependencies {
    implementation(project(":core_domain"))            // gets Kixo for free
}

Upozornenie

Ak sa vám pri kompilácii modulu zobrazí Unresolved reference: Kixo, tomuto modulu chýba vlastná závislosť od SDK — pridajte vyššie uvedený riadok s implementation alebo použite Pattern B.

Inicializácia

Kixo nakonfigurujte vo svojej podtriede ApplicationonCreate sa spustí ešte pred prvou activity, takže každé zobrazenie obrazovky, ťuknutie aj udalosť životného cyklu sa zachytí od prvého frameu. Application zaregistrujte v manifeste cez android:name=".MyApp".

kotlin
import android.app.Application
import io.kixo.sdk.Kixo

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        Kixo.configure(
            context   = this,
            projectId = "kx_proj_YOUR_PROJECT_ID",
            apiKey    = "kx_key_YOUR_API_KEY",
        )
    }
}

Ak potrebujete jemnejšie nastavenie — príznaky automatického sledovania, interval flushovania, vzorkovanie replayu alebo vlastný API host — vytvorte KixoConfiguration explicitne:

kotlin
import io.kixo.sdk.Kixo
import io.kixo.sdk.KixoConfiguration

val config = KixoConfiguration.Builder(
    projectId = "kx_proj_YOUR_PROJECT_ID",
    apiKey    = "kx_key_YOUR_API_KEY",
)
    .autoTrackScreens(true)
    .autoTrackTaps(true)
    .autoTrackNetwork(false)  // reserved; no-op in the current Android release
    .autoTrackCrashes(true)
    .autoTrackSessions(true)
    .autoTrackPush(true)
    .flushIntervalMillis(30_000)
    .flushAt(20)
    .maxBufferSize(200)
    .build(applicationContext)

Kixo.configure(this, config)

Poznámka

Idempotentné. Druhé volanie configure v rámci toho istého procesu je no-op zapísaný na úrovni WARN — SDK ponechá prvú konfiguráciu. Udalosti, ktoré váš auth singleton zaradí do frontu medzi pred a doručením configure, sa dočasne ukladajú (maximálne 50) a po pripojení SDK sa odošlú, takže Kixo.identify(...) môžete volať z globálneho miesta ešte pred dokončením Application.onCreate.

Sledovanie udalostí

Väčšinu instrumentácie pokrývajú tri základné primitíva: track pre udalosti, markGoal pre konverzné signály a addBreadcrumb pre kontext mimo udalostí.

kotlin
import io.kixo.sdk.Kixo

Kixo.track("video_played", mapOf(
    "video_id"    to "vid_42",
    "duration_ms" to 18_500,
    "autoplay"    to false,
))

// markGoal(name, value?, currency?, properties?) — pass extra context
// through the named 'properties' argument (a Map can't be the 2nd
// positional arg; that slot is the Double 'value').
Kixo.markGoal("activated", properties = mapOf(
    "step" to "onboarding_completed",
))

// Revenue goals use the typed value + currency parameters:
Kixo.markGoal("purchase_completed", value = 49.99, currency = "USD")

Kixo.addBreadcrumb(
    message  = "user toggled dark mode",
    category = "ui",
    level    = "info",
)

Tip

Ciele majú úrovne. Označené ciele vstupujú do aktivačných funnelov v Kixo aj do denného cron procesu na detekciu zmien — ak objem cieľa klesne týždeň na týždeň o 70 %, v dashboarde sa zobrazí s označením Vyžaduje kontrolu. markGoal používajte pre niekoľko momentov, na ktorých naozaj záleží, a track pre všetko ostatné.

Štandardné udalosti

Pohodlná vrstva nad Kixo.track pre udalosti, ktoré Kixo rozpoznáva podľa názvu — teda presné reťazcové kľúče, na ktoré sa zhoduje backendový detektor štandardných udalostí. Získate kontrolu tvaru vlastností pri kompilácii a jeden zdroj pravdy pre názvy.

kotlin
import io.kixo.sdk.Kixo
import io.kixo.sdk.SubscriptionInterval

Kixo.trackPurchase(
    amount    = 49.99,
    currency  = "USD",
    productId = "pro_yearly",
)

Kixo.trackSubscriptionStart(
    plan     = "pro",
    amount   = 9.99,
    currency = "USD",
    interval = SubscriptionInterval.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)

Identifikácia používateľov

Naviažte ďalšie udalosti na stabilné ID používateľa a sadu traits. Prepojenie anonymného a známeho používateľa prebieha v Kixo — udalosti zachytené pred identify sa spätne priradia tomu istému používateľovi.

kotlin
import io.kixo.sdk.Kixo

// Reserved standard property keys carry a $-prefix (Mixpanel
// convention) so they namespace away from your own custom traits
// and promote to the dashboard's profile columns. See
// io.kixo.sdk.StandardProperty for the typed catalogue, or the
// "Standard property catalog" section below for the full 37-key list.
Kixo.identify("user_123", mapOf(
    "$email" to "jane@example.com",     // identity
    "$name"  to "Jane Doe",              // identity
    "$plan"  to "pro",                   // subscription pack
    "$lifetime_orders" to 12,            // e-commerce pack
    "signup_source" to "twitter_ad",     // custom trait
))

// Logout: clear identity, super-properties, and the persisted queue.
Kixo.reset()

⚠️ Pasca so znakom dolára v Kotline. Štandardné identifikačné kľúče majú prefix $ ($email, $name, $first_name) — a v literáli v Kotline musíte znak dolára escapovať ako "\$email". Ak napíšete "$email", vykoná sa interpolácia vašej premennej email, takže hodnota sa potichu uloží ako trait vlastné a nikdy nevyplní stĺpce e-mail / meno v Audience. Najjednoduchšia oprava je použiť typované preťaženie (SDK 0.1.13+), pri ktorom sa to nedá pokaziť: Kixo.setUserProperty(StandardProperty.EMAIL, email).

Označte používateľa na segmentáciu

Použite setUserProperty s hodnotou boolean, ak chcete používateľovi priradiť jednoduchý príznak áno/nie. Tento príznak zostane zachovaný aj po ďalších spusteniach a môžete ho hneď použiť v segmentoch, e-mailových kampaniach aj dopytoch v chate — bez ďalšieho nastavovania, stačí volanie SDK.

kotlin
// Tag a user as subscribed — segments + campaigns can target this
Kixo.setUserProperty("subscribe", true)

// VIP membership
Kixo.setUserProperty("vip", true)

// String + numeric values work too
Kixo.setUserProperty("plan_tier", "enterprise")
Kixo.setUserProperty("lifetime_orders", 42)

// Bulk-set
Kixo.setUserProperties(mapOf(
    "subscribe" to true,
    "plan_tier" to "enterprise",
))

Vlastnosti uložené cez SharedPreferences zostávajú zachované aj po ďalších spusteniach a automaticky sa pripájajú ku každej odoslanej udalosti. V chate môžete napísať napríklad "pošli uvítací e-mail používateľom, pre ktorých subscribe je true" — Kixo za vás vytvorí segment aj návrh šablóny. Vymažú sa pri Kixo.reset().

Katalóg štandardných vlastností

Vyhradené kľúče vlastností majú prefix $, takže sú oddelené od vašich vlastných traits. Katalóg Kixo obsahuje 37 kľúčov v 3 univerzálnych balíkoch (identita, geo, životný cyklus) a 5 B2B vertikálnych balíkoch (predplatné, e-commerce, médiá, trhovisko, vernosť). Nastavte tie, ktoré sa hodia pre váš produkt — dashboard sa prispôsobí a zobrazí len balíky, ktoré vyplníte.

Identita

Vždy relevantné. Nastavuje stĺpce v hlavičke profilu.

KľúčTypPopis
$emailreťazecPrimárny e-mail, často používaný ako merge key pri spájaní identít.
$phonereťazecTelefónne číslo vo formáte E.164.
$namereťazecCelé zobrazované meno.
$first_namereťazecKrstné meno.
$last_namereťazecPriezvisko.
$avatar_urlreťazecÚplná URL adresa avataru používateľa.

Geo

Geografický kontext.

KľúčTypPopis
$countryreťazecKód krajiny podľa ISO 3166.
$cityreťazecNázov mesta.
$regionreťazecŠtát alebo provincia.
$timezonereťazecIANA zóna, napríklad America/Los_Angeles.
$languagereťazecIETF tag, napríklad en alebo ru-RU.
$localereťazecÚplný identifikátor locale.

Životný cyklus

Kedy sme ho videli.

KľúčTypPopis
$createdISO8601Čas registrácie alebo vytvorenia účtu.
$last_seenISO8601Čas poslednej interakcie.

Predplatné

Nastavte, ak má váš produkt plány.

KľúčTypPopis
$planreťazecSlug úrovne — free, pro, enterprise.
$subscription_statusreťazecactive / trial / cancelled / past_due.
$trial_endsISO8601Kedy vyprší aktuálne skúšobné obdobie.
$mrrčísloMesačný opakovaný príjem v mene účtu.
$subscription_startedISO8601Kedy sa začalo aktuálne predplatné.

E-commerce

Nastavte, ak predávate produkty.

KľúčTypPopis
$lifetime_ordersčísloPočet dokončených objednávok.
$lifetime_revenuečísloCelkové výdavky.
$aovčísloPriemerná hodnota objednávky.
$last_purchaseISO8601Čas posledného úspešného nákupu.
$first_purchaseISO8601Prvý úspešný nákup.
$cart_abandoned_countčísloCelkový počet opustení košíka.

Médiá

Nastavte, ak publikujete obsah.

KľúčTypPopis
$content_tierreťazecfree / premium / paid.
$subscribed_categoriesCSV reťazec alebo poleKategórie, ktoré používateľ sleduje.
$watch_time_totalčísloCelkový čas sledovania v sekundách.
$last_playedISO8601Čas posledného spustenia prehrávania.

Trhovisko

Nastavte, ak je váš produkt obojstranná platforma.

KľúčTypPopis
$seller_tierreťazecSlug úrovne na strane predajcu.
$buyer_tierreťazecSlug úrovne na strane kupujúceho.
$listings_countčísloAktívne inzeráty, ktoré používateľ vlastní.
$reviews_countčísloRecenzie, ktoré používateľ získal.
$verifiedbooleanStav KYC.

Vernosť

Nastavte, ak používate vernostné alebo odmeňovacie programy.

KľúčTypPopis
$loyalty_pointsčísloAktuálny zostatok bodov, ktoré možno uplatniť.
$vip_levelreťazecSlug VIP úrovne.
$referral_countčísloÚspešné odporúčania pripísané tomuto používateľovi.

Tip

Nenašli ste svoj vzor? Pre vlastné traity použite kľúče bez prefixu. Zobrazia sa v paneli Custom Traits v dashboarde bez toho, aby zahltili profilové stĺpce. Päť vertikálnych balíkov vyššie je kvalifikovaný odhad najbežnejších tvarov v B2B — terminológia špecifická pre zákazníka, napríklad shipping_plan, zostáva bez prefixu.

Super-properties

Páry kľúč/hodnota viazané na reláciu, ktoré sa automaticky pripájajú ku každej odchádzajúcej udalosti. Na rozdiel od traits identify, ktoré opisujú identitu, super-properties opisujú kontext relácie — napríklad aktívny A/B variant, build flavor alebo zapnuté feature flagy. Pretrvávajú aj medzi spusteniami aplikácie; vymažú sa pri reset(). Ak dôjde ku kolízii, vždy majú prednosť per-event properties v track.

kotlin
import io.kixo.sdk.Kixo

Kixo.setSuperProperty("build_flavor", "beta")
Kixo.setSuperProperties(mapOf(
    "ab_variant"        to "B",
    "referrer_campaign" to "autumn-launch",
))

// Sugar for A/B tracking — stored as 'experiment_<id>'.
Kixo.setExperimentVariant("checkout_v2", "variant_a")

Kixo.unsetSuperProperty("build_flavor")
Kixo.clearSuperProperties()

Push notifikácie

Máte dve možnosti integrácie. Zvoľte A, ak používate FCM a chcete čo najkratšie funkčné nastavenie. Zvoľte B, ak už máte vlastnú FirebaseMessagingService, ktorú nemôžete prerobiť, alebo chcete mať presnú kontrolu nad tým, ktoré doručenia cez FCM Kixo uvidí.

Možnosť A — rozšírte KixoFirebaseMessagingService (automatické sledovanie)

Rozšírte KixoFirebaseMessagingService a vo svojej implementácii zavolajte super.onMessageReceived(...) — Kixo automaticky odošle push_received (viditeľný payload) alebo push_silent (iba dátový payload). Základná trieda spracuje aj registráciu onNewToken, ak ju neprepíšete. Registrácia AndroidManifest.xml zostáva rovnaká ako pri bežnej FCM službe.

kotlin
import com.google.firebase.messaging.RemoteMessage
import io.kixo.sdk.KixoFirebaseMessagingService

class MyMessagingService : KixoFirebaseMessagingService() {
    override fun onMessageReceived(remoteMessage: RemoteMessage) {
        super.onMessageReceived(remoteMessage)  // Kixo auto-tracks push_received
        // … your own routing / notification display
    }
}

Poznámka

Kixo túto voliteľnú triedu kompiluje proti Firebase Messaging, ale Firebase do vašej aplikácie nepridáva tranzitívne. SDK deklaruje Firebase ako compileOnly; aplikácia, ktorá si zvolí túto možnosť, už musí závisieť od firebase-messaging, rovnako ako pri každom FCM receiveri.

Možnosť B — volajte manuálne API z vlastnej FCM služby

Zaregistrujte svoj FCM token v Kixo cez FirebaseMessagingService.onNewToken a potom každé doručenie zaznamenajte explicitne. Tento postup použite, ak má Kixo vidieť len vybranú časť doručení cez FCM. Doručovanie na Android momentálne podporuje iba FCM.

kotlin
import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage
import io.kixo.sdk.Kixo
import io.kixo.sdk.PushProvider

class MyMessagingService : FirebaseMessagingService() {
    override fun onNewToken(token: String) {
        Kixo.setPushToken(token, PushProvider.FCM)
    }

    override fun onMessageReceived(message: RemoteMessage) {
        // Convert the FCM payload to a Map<String, Any?> and log it —
        // Kixo correlates this with the open / dismiss it sees later.
        Kixo.logPushReceived(message.data.toMap(), appState = "background")
    }
}

Android neposkytuje univerzálny hook životného cyklu pre otvorenia notifikácií, ich zavretia ani akčné tlačidlá. Tieto signály preto prepošlite z notification intentov alebo receiverov, ktoré vytvára vaša aplikácia:

kotlin
import io.kixo.sdk.Kixo

Kixo.logPushOpened(payload = pushPayload)            // open
Kixo.logPushOpened(payload = pushPayload, actionId = "reply")  // action-button tap
Kixo.logPushDismissed(payload = pushPayload)         // swipe-away

Replay relácií

Prehrajte si verný vizuálny záznam toho, čo používateľ videl. Pri každom zachytení SDK zakóduje komprimovaný snímok obrazovky (obrázok JPEG) spolu so štruktúrnym snímkom hierarchie zobrazení a odošle oboje — prehrávač v dashboarde tak dokáže vykresliť pixelovo presný záznam popri časovej osi interakcií. Replay pre projekt nastavíte v Prehľad → Nastavenia → Prehrávanie relácií. SDK si túto projektovú politiku automaticky načítava aj obnovuje vrátane maskovania, režimov zachytávania a povolenia odosielania cez mobilnú sieť.

kotlin
import io.kixo.sdk.Kixo
import io.kixo.sdk.KixoConfiguration

val config = KixoConfiguration.Builder(
    projectId = "kx_proj_YOUR_PROJECT_ID",
    apiKey    = "kx_key_YOUR_API_KEY",
)
    .build(applicationContext)

Kixo.configure(this, config)

Ak je odosielanie cez mobilnú sieť vypnuté, replay zostane vo fronte, kým nebude dostupná povolená sieť.

Tip

Maskujte ešte pred odoslaním. Kixo zachytáva pixely, preto maskovanie prebehne pred ešte predtým, než čokoľvek opustí zariadenie. Polia pre heslo a e-mail sa rozpoznajú automaticky a znečitateľnia sa, text v štruktúrnych snímkach prechádza filtrom PII a každé view označené pomocou setKixoMask(true) sa vo frame pred pred zakódovaním do JPEG vyrenderuje ako nepriehľadný obdĺžnik — jeho pixely zariadenie nikdy neopustia. Obrazovky v Jetpack Compose sú predvolene maskované celé; ak chcete zahrnúť obrazovku, ktorú ste skontrolovali, zavolajte setKixoMask(false) na najvyššom ComposeView. Operátori potom v dashboarde prechádzajú prehrávač replayu spolu s časovou osou udalostí.

Zber dát

SDK zachytáva údaje, ktoré máte v projekte povolené, aj udalosti a vlastnosti, ktoré odosiela vaša aplikácia.

Ladenie

Kixo.diagnostics() vráti snapshot stavu SDK len na čítanie — hodí sa do skrytej debug obrazovky aj do smoke testu. Bez debuggera vám povie, prečo udalosti netečú.

kotlin
import io.kixo.sdk.Kixo

val diag = Kixo.diagnostics()
Log.d("Kixo", "queued=${diag.queue.bufferedEventCount}")
Log.d("Kixo", "paused=${diag.paused}")                  // collection paused state
Log.d("Kixo", "lifecycleState=${diag.lifecycleState}")  // SDK lifecycle state

Vynúťte flush z test harnessu — počas sieťového round-tripu blokuje až na timeoutMs:

kotlin
import io.kixo.sdk.Kixo

// Async fire-and-forget — returns immediately.
Kixo.flush()

// Blocking variant for instrumentation tests. Never call on the main thread.
val landed: Boolean = Kixo.flushBlocking(timeoutMs = 5_000L)
assertTrue(landed)

Compose Navigation

Trasy Activity / Fragment okamžite vytvoria udalosti screen_view a zároveň aj štruktúrované záznamy screen_visit s metadátami o dĺžke zobrazenia a pohybe medzi obrazovkami. Pri Jetpack Compose Navigation volajte Kixo.screen z LaunchedEffect naviazaného na route — SDK potom uvidí jednu udalosť pre každú destináciu bez ohľadu na počet rekompozícií.

kotlin
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.navigation.NavHostController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import io.kixo.sdk.Kixo

@Composable
fun AppNavHost(nav: NavHostController) {
    NavHost(navController = nav, startDestination = "home") {
        composable("home") {
            LaunchedEffect("home") { Kixo.screen("HomeScreen") }
            HomeScreen()
        }
        composable("settings") {
            LaunchedEffect("settings") { Kixo.screen("SettingsScreen") }
            SettingsScreen()
        }
    }
}

AI asistenti na písanie kódu

Verejné API SDK je malé a navrhnuté tak, aby sa s ním dobre pracovalo cez našeptávanie v editore — všetky metódy sú na singletone Kixo, každá ukážka v Kotlin v tomto návode začína import io.kixo.sdk.Kixo a náš README obsahuje blok „AI agent quick reference“, ktorý si nástroje ako Claude Code, Cursor a Codex vedia vložiť priamo do kontextu. Ak sa agent zasekne, začnite týmto overeným základom:

kotlin
// Tell your AI coding agent:
// "Integrate the Kixo Android SDK using io.kixo:kixo-android-sdk
//  from https://raw.githubusercontent.com/kixoio/kixo-android-sdk/main/repo.
//  Call Kixo.configure(this, projectId, apiKey) in Application.onCreate.
//  Then use Kixo.track / Kixo.identify / Kixo.markGoal as needed."

Poznámka

Každá sekcia vyššie je písaná s ohľadom na tento workflow — importy sú vždy explicitné, typy sú vždy pomenované a singleton SDK nikdy nedostáva alias. Dajte túto stránku svojmu agentovi a nechajte ho pracovať.