iOS SDK
Kixo iOS SDK analytics, attribution, push, lifecycle tracking va session replay uchun Swift 5.9+ hamda iOS 16+ni qo‘llab-quvvatlaydi. Replay’ning nisbatan og‘ir pipeline’lari uchun loyiha darajasidagi capture kalitlari va ehtiyotkor standart sozlamalar qo‘llanadi; paketning iOS 16 deployment targetidan tashqari u alohida OS yoki qurilma modeli bo‘yicha cheklov qo‘ymaydi. SDK Swift Package Manager orqali tarqatiladi va bitta Kixo.configure chaqiruvi bilan ekranlar, bosishlar, sessiyalar, crash’lar, push bildirishnomalari hamda lifecycle eventlarni avtomatik kuzatadi. Tarmoq so‘rovlarini kuzatish ixtiyoriy.
O‘rnatish
Swift Package Manager
Xcode’da File → Add Package Dependenciesga o‘ting va quyidagini kiriting:
https://github.com/kixoio/kixo-ios-sdkAgar dependencylarni Package.swift orqali boshqarsangiz, binary release package va product’dan foydalaning:
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"),
]
)
]Sozlash
Kixo’ni SwiftUI App struct’ida yoki AppDelegateda ishga tushiring:
import Kixo
@main
struct MyApp: App {
init() {
Kixo.configure(
projectId: "YOUR_PROJECT_ID",
apiKey: "YOUR_API_KEY"
)
}
var body: some Scene {
WindowGroup { ContentView() }
}
}Eslatma
Bir qatorning o‘zi yetadi. SDK standart bo‘yicha production environment’dan foydalanadi, managed ingest host’ga ulanadi va standard auto-trackerlarni yoqadi. Alohida flaglarni faqat zarur bo‘lsa ConfigurationOptions(...) bilan override qiling.
Sozlash parametrlari
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
)
)Eslatma
Server boshqaradigan konfiguratsiya. Har bir tracker flagini dashboard’dagi Settings → Data Collection sahifasidan ham o‘zgartirish mumkin. Loyiha sozlamalari lokal standartlarni bekor qilishi mumkin.
Avtomatik kuzatiladigan eventlar
screen_view— UIKit view-controller ko‘rinishlari va SwiftUI navigatsiyasi darhol qayd etiladiscreen_visit— navigatsiya yoki background holatida yakunlanadigan, dwell, engagement soni, screen identity va flow metadata bilan boyitilgan tuzilmali tashrifsession_start/session_endtap— tugma bosishlari va gesture recognizerlarcrash— yozib olingan crash va exception diagnostikasinetwork— ixtiyoriy tozalangan request agregatlari va route diagnostikasipush_received/push_open/push_dismissed/push_silent/push_action— push’ning to‘liq hayot siklipush_permission/push_token_invalidatedlifecycle— foreground / background / app-launch o‘tishlari
Custom eventlar
Kixo.track("purchase_completed", properties: [
"product_id": "SKU-123",
"amount": 49.99,
"currency": "USD",
])Typed event helperlar
Kixo nomi bo‘yicha taniydigan eventlar (purchase, signup, subscribe_start, trial_start, cancel, upgrade, activation, share, invite) uchun Kixo.track ustiga qurilgan qulay o‘rama. Property tuzilmasi compile time’da tekshiriladi, kalit nomlari esa yagona manbada saqlanadi — backend’dagi standard-event aniqlagichi nomlarni aynan o‘zgarmagan ko‘rinishda solishtiradi.
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)Foydalanuvchilarni tanitish
Ajratilgan standart property kalitlari $ prefiksi bilan keladi (Mixpanel konvensiyasi), shuning uchun ular sizning maxsus traitlaringizdan alohida namespace’da turadi va dashboarddagi profil ustunlariga chiqariladi. Typed StandardProperty enumidan yoki $ prefiksli oddiy stringdan foydalaning — barcha 37 ta kalit ro‘yxati uchun quyidagi Standart property katalogiga qarang.
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
])Foydalanuvchini segmentlash uchun belgilash
Foydalanuvchiga oddiy ha/yo‘q belgisi biriktirish uchun boolean qiymatli setUserPropertydan foydalaning. Bu belgi sessiyalar orasida saqlanadi va segmentlar, email kampaniyalari hamda chat so‘rovlari uchun ishlaydi — SDK chaqiruvidan tashqari boshqa sozlama kerak emas.
// 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",
])Propertylar ishga tushirishlar orasida UserDefaultsda saqlanadi va har bir yuboriladigan eventga avtomatik qo‘shiladi. Chatda "subscribe qiymati true bo‘lgan foydalanuvchilarga xush kelibsiz emailini yubor" kabi yozing — Kixo segmentni tuzadi va siz uchun shablon qoralamasini tayyorlaydi. Kixo.reset() paytida tozalanadi.
Standart property katalogi
Ajratilgan property kalitlari maxsus traitlaringiz bilan to‘qnashmasligi uchun $ prefiksi bilan keladi. Kixo katalogida 37 ta kalit bor: 3 ta universal to‘plam (identity, geo, lifecycle) va 5 ta B2B vertikal to‘plam (subscription, e-commerce, media, marketplace, loyalty). Mahsulotingizga moslarini belgilang — dashboard faqat to‘ldirilgan to‘plamlarni ko‘rsatishga moslashadi.
Identity
Har doim qo‘llanadi. Profil sarlavhasidagi ustunlarni belgilaydi.
| Kalit | Turi | Tavsif |
|---|---|---|
$email | satr | Asosiy email; ko‘pincha identifikatorlarni bog‘lashda merge key sifatida ishlatiladi. |
$phone | satr | E.164 telefon raqami. |
$name | satr | To‘liq ko‘rinadigan nom. |
$first_name | satr | Ism. |
$last_name | satr | Familiya. |
$avatar_url | satr | Foydalanuvchi avatar rasmi uchun to‘liq URL. |
Geo
Geografik kontekst.
| Kalit | Turi | Tavsif |
|---|---|---|
$country | satr | ISO 3166 mamlakat kodi. |
$city | satr | Shahar nomi. |
$region | satr | Shtat yoki viloyat. |
$timezone | satr | America/Los_Angeles kabi IANA zona nomi. |
$language | satr | en yoki ru-RU kabi IETF tegi. |
$locale | satr | To‘liq locale identifikatori. |
Hayot sikli
Ularni qachon ko‘rganmiz.
| Kalit | Turi | Tavsif |
|---|---|---|
$created | ISO8601 | Ro‘yxatdan o‘tish yoki akkaunt yaratilgan vaqt. |
$last_seen | ISO8601 | Oxirgi faollik vaqti. |
Obuna
Agar mahsulotingizda tariflar bo‘lsa, belgilang.
| Kalit | Turi | Tavsif |
|---|---|---|
$plan | satr | Tarif identifikatori — free, pro, enterprise. |
$subscription_status | satr | active / trial / cancelled / past_due. |
$trial_ends | ISO8601 | Joriy sinov muddati tugaydigan vaqt. |
$mrr | raqam | Hisob valyutasidagi oylik takroriy tushum. |
$subscription_started | ISO8601 | Joriy obuna boshlangan vaqt. |
Elektron tijorat
Agar mahsulot sotsangiz, belgilang.
| Kalit | Turi | Tavsif |
|---|---|---|
$lifetime_orders | raqam | Yakunlangan buyurtmalar soni. |
$lifetime_revenue | raqam | Jami xarajat. |
$aov | raqam | O‘rtacha buyurtma qiymati. |
$last_purchase | ISO8601 | Eng so‘nggi muvaffaqiyatli xarid. |
$first_purchase | ISO8601 | Birinchi muvaffaqiyatli xarid. |
$cart_abandoned_count | raqam | Savatchani tashlab ketishlar soni, butun davr bo‘yicha. |
Media
Agar kontent nashr qilsangiz, belgilang.
| Kalit | Turi | Tavsif |
|---|---|---|
$content_tier | satr | free / premium / paid. |
$subscribed_categories | CSV satri yoki massiv | Foydalanuvchi kuzatadigan kategoriyalar. |
$watch_time_total | raqam | Jami ko‘rish vaqti, soniyalarda. |
$last_played | ISO8601 | Oxirgi ijro boshlanishi. |
Marketpleys
Agar ikki tomonlama platforma bo‘lsangiz, belgilang.
| Kalit | Turi | Tavsif |
|---|---|---|
$seller_tier | satr | Sotuvchi tomonidagi tier slug. |
$buyer_tier | satr | Xaridor tomoni tier slugi. |
$listings_count | raqam | Foydalanuvchiga tegishli faol e’lonlar. |
$reviews_count | raqam | Foydalanuvchi olgan sharhlar. |
$verified | boolean | KYC holati. |
Sodiqlik
Faollik va mukofot dasturlari uchun qo‘llanadi.
| Kalit | Turi | Tavsif |
|---|---|---|
$loyalty_points | raqam | Ayni paytda ishlatish mumkin bo‘lgan ballar balansi. |
$vip_level | satr | VIP tarif identifikatori. |
$referral_count | raqam | Ushbu foydalanuvchiga biriktirilgan muvaffaqiyatli referallar. |
Maslahat
Mos andaza topilmadimi? Custom traitlar uchun oddiy kalitlardan foydalaning. Ular dashboard’dagi Custom Traits panelida ko‘rinadi va profil ustunlarini keraksiz to‘ldirmaydi. Yuqoridagi 5 ta vertikal to‘plam B2B’da eng ko‘p uchraydigan shakllar bo‘yicha taxminiy tavsiyalar xolos — mijozga xos atamalar (masalan, shipping_plan) oddiy kalit bo‘lib qoladi.
Super-properties
Har bir yuboriladigan eventga avtomatik qo‘shiladigan, sessiya bo‘yicha kalit-qiymat juftlari. identify traitlaridan farqli ravishda (ular identifikatsiyani ifodalaydi), super-properties sessiya kontekstini bildiradi: faol A/B varianti, build turi, yoqilgan feature flaglar. Ular ishga tushirishlar orasida UserDefaultsda saqlanadi va reset() paytida tozalanadi. To‘qnashuv bo‘lsa, track dagi event uchun berilgan properties har doim ustun keladi.
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()SwiftUI ekran kuzatuvi
SDK view nomini aniqlay olsa, SwiftUI ekran ko‘rishlari avtomatik kuzatiladi. Nozikroq boshqaruv yoki maxsus nom berish uchun .kixoScreen() view modifieridan foydalaning:
struct HomeView: View {
var body: some View {
VStack { Text("Welcome") }
.kixoScreen("HomeView")
}
}Sessiyani qayta ko‘rish
Replay foydalanuvchi amalda nimani ko‘rganini tiklaydi — SDK ekran kadrlarini (HEIC kodlashida) view hierarchy’ning tuzilmaviy snapshoti bilan birga yozib oladi, dashboarddagi pleer esa ularni eventlar vaqt jadvali yonida surib ko‘rish mumkin bo‘lgan qayta ijroga birlashtiradi. Loyiha uchun replay sozlamalarini Boshqaruv paneli → Sozlamalar → Sessiya qayta ko‘rishida belgilang; SDK bu siyosatni avtomatik o‘qiydi va ilova ishlayotgan paytda yangilab boradi.
Kixo.configure(
projectId: "YOUR_PROJECT_ID",
apiKey: "YOUR_API_KEY"
)Dashboard replay yoqilgan-yoqilmaganini, maskalashni, yozib olish rejimlarini va native replay mobil tarmoq orqali yuklashi mumkinligini boshqaradi. Mobil tarmoq orqali yuklash o‘chirilgan bo‘lsa ham, kadrlar hajmi cheklangan qurilma ichidagi buferga yozilishi mumkin; yuklash esa ruxsat etilgan tarmoq paydo bo‘lguncha kutadi.
SDK loyihangizda yoqilgan ma’lumotlarni, shuningdek ilovangiz yuboradigan eventlar va propertylarni yig‘adi.
Maskalash va maxfiylik
Replay piksellarni yozib olgani uchun redaction har qanday kadr kodlanishidan oldin qurilmaning o‘zida bajariladi. Password va boshqa maxfiy maydonlar avtomatik aniqlanib yashiriladi, strukturaviy snapshotga tushgan matn esa PII filtridan o‘tadi. O‘zingizga xos narsalarni — private message thread, account balance, draft screen — yashirish uchun view’da kxRedactni o‘rnating. Kixo HEIC kodlashidan oldin shu view chegaralari ustiga to‘liq to‘rtburchak chizadi, shuning uchun uning piksellari qurilmadan tashqariga chiqmaydi.
balanceLabel.kxRedact = true
cardNumberField.kxRedact = trueMaslahat
Replay uchun yozib olingan ekranlardagi taplar dashboarddagi mobil heatmapga ham uzatiladi, shuning uchun qo‘shimcha SDK sozlamalarisiz foydalanuvchilar har bir ekranning qayeriga tegganini ko‘ra olasiz. Replay loyiha rejangizga bog‘liq; kadrlarni yozib olish mavjud bo‘lmasa ham, SDK kadrlar oqimini yuklamasdan sessiya metama’lumotlarini yozishda davom etadi.
Push bildirishnomalar
SDK Kixo.configureda AppDelegate uchun runtime proxy o‘rnatadi — silent pushlar (content-available: 1) va fonda yetkazilgan ko‘rinadigan pushlar avtomatik qayd etiladi. AppDelegate ichida qo‘shimcha kod kerak emas. Mavjud UNUserNotificationCenterDelegate implementatsiyalari odatdagidek ishlashda davom etadi; Kixo ularni o‘rab ishlatadi.
Qurilma tokenini standart didRegisterForRemoteNotificationsWithDeviceToken orqali ro‘yxatdan o‘tkazing:
func application(
_ application: UIApplication,
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
let token = deviceToken.map { String(format: "%02x", $0) }.joined()
Kixo.setPushToken(token)
}Agar app Firebase Messaging’dan foydalansa, uning registration tokenini provider: .firebase orqali uzating. Kixo shu providerni saqlaydi va yetkazishni FCM HTTP v1 orqali amalga oshiradi; campaign yuborishdan oldin app’ning Firebase service account’ini Kixo’da sozlang.
func messaging(_ messaging: Messaging, didReceiveRegistrationToken token: String?) {
guard let token else { return }
Kixo.setPushToken(token, provider: .firebase)
}Yetkazish va offline holatda ishlash
SDK eventlarni lokal navbatga qo‘yadi, paketlab yuboradi va vaqtinchalik xatolarda backoff bilan qayta urinadi. Agar yig‘ish loyiha sozlamalaridan to‘xtatilgan bo‘lsa, u qayta yoqilmaguncha yangi eventlar yuborilmaydi.
Diagnostika
Faqat o‘qish uchun health snapshot. Debug ekranlari yoki smoke testlarda qulay — debugger ishlatmasdan turib “eventlarim nega kelmayapti?” degan savolga javob beradi.
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 hostMajburan flush qilish (testlar uchun)
Flush tugashini kutib, timeout soniyagacha bloklaydigan sinxron overload. XCTest fixturelari uchun mo‘ljallangan — buni hech qachon main thread’dan chaqirmang.
func testEventLanded() {
Kixo.track("test_event")
let landed = Kixo.flush(timeout: 5.0)
XCTAssertTrue(landed)
}Tozalash
Identity, super-properties va saqlangan navbatni tozalaydi. Logout paytida chaqiring, shunda keyingi eventlar oldingi foydalanuvchiga biriktirilmaydi.
Kixo.reset()