Dokumentasi SDK

Integrasi Pulse SDK

Pasang SDK di aplikasi Android, iOS, atau Flutter untuk mengirim crash, error, HTTP, sesi, dan event ke dashboard, serta menampilkan maintenance, fitur baru, dan banner.

Contoh kode untuk:

Pengenalan

Pulse SDK adalah library native yang menghubungkan aplikasi mobile Anda dengan dashboard Pulse. Sekali dipasang, SDK:

  • Monitoring: mencatat crash, error, request HTTP, sesi, screen, dan event kustom, lalu menampilkannya di menu Monitoring.
  • Informasi in-app: mengambil maintenance, fitur baru, dan banner yang Anda buat di dashboard, lalu menampilkannya sebagai popup, banner, atau badge.
  • Push: berlangganan topic FCM per aplikasi dan build, sehingga informasi bisa dikirim sebagai push tanpa menyimpan token perangkat.

SDK tersedia native untuk Kotlin/Java dan Swift/Objective-C, serta sebagai plugin Flutter. Semua method aman dipanggil dari thread mana pun dan tidak pernah melempar exception ke aplikasi.

Mulai cepat

  1. Ambil workspace key. Login ke dashboard Pulse → Pengaturan → Workspace → Workspace key → Tampilkan. Key berawalan pk_.
  2. Pasang SDK sesuai platform (lihat Instalasi).
  3. Panggil start sekali saat aplikasi dibuka, dengan workspace key tersebut.
  4. Jalankan aplikasi, lalu buka menu Monitoring di dashboard. Sesi pertama muncul dalam beberapa detik.
SDK mengirim ke API Pulse terhosting (https://pulse-api.mhmadidris.site/api/v1) secara default. Anda hanya perlu mengisi baseUrl bila memakai pulse-api sendiri atau server lokal.

Persyaratan

PlatformMinimumCatatan
Android (native)API 21+, compileSdk 37+, JDK 17Kotlin atau Java. Tanpa dependency; OkHttp opsional.
iOS (native)iOS 15+, Swift 5.9+Swift atau Objective-C. Tanpa dependency pihak ketiga.
FlutterFlutter 3.41+, Dart ≥ 3.11Android API 26+ dan iOS 15+. Web dan desktop belum didukung.

Untuk compileSdk 37 gunakan Android Gradle Plugin 9.1.1 atau lebih baru.

Instalasi

Tambahkan dependency dari Maven Central (pastikan mavenCentral() ada di daftar repository).

app/build.gradle.kts

dependencies {
    implementation("io.github.mhmadidris:pulse-monitoring:0.1.2")
}

Inisialisasi

Panggil start sekali, sedini mungkin, agar crash dan sesi pertama ikut tercatat. Jika aplikasi memakai Firebase atau Crashlytics, inisialisasi Firebase lebih dulu lalu mulai Pulse. Handler crash sebelumnya tetap dipanggil.

App.kt

import android.app.Application
import dev.pulse.monitoring.PulseConfig
import dev.pulse.monitoring.PulseMonitoring

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        PulseMonitoring.start(
            this,
            PulseConfig(
                workspaceKey = "pk_…",       // Pengaturan → Workspace
                debug = BuildConfig.DEBUG,   // log ke Logcat, tag "PulseMonitoring"
            ),
        )
    }
}

AndroidManifest.xml

<application android:name=".App" />

Jika aplikasi sudah punya kelas Application, tambahkan pemanggilan di kelas itu; jangan membuat kelas kedua. Package ID, versi, dan build dibaca otomatis dari aplikasi.

Workspace key adalah identifier publik, bukan rahasia. Jangan pernah menaruh kredensial admin, service account, atau token server di aplikasi. Gunakan workspace terpisah untuk dev dan production.

User dan event

Setelah login, set ID internal user yang stabil, dan kosongkan saat logout agar event berikutnya tidak tertaut ke akun sebelumnya. Event kustom muncul di Monitoring → perilaku pengguna.

PulseMonitoring.setUser("user_123")   // setelah login
PulseMonitoring.trackEvent("document_sent", mapOf("document_count" to 2, "success" to true))
PulseMonitoring.setUser(null)         // saat logout
Batas eventNilai
Nama[A-Za-z0-9_.-], maksimal 100 karakter
PropertiMaksimal 20, key maksimal 40 karakter
NilaiString (maks. 200 karakter), angka, atau boolean

Hindari email, nama lengkap, isi dokumen, token, atau data sensitif lain di event dan pesan error.

Error dan crash

Uncaught exception JVM dicatat otomatis sebagai crash dan dikirim saat aplikasi dibuka lagi. Crash native (NDK/sinyal) belum ditangkap. Untuk exception yang Anda tangani sendiri:

try {
    upload()
} catch (e: Exception) {
    PulseMonitoring.recordError(e)
}

Error dengan jenis dan lokasi yang sama dikelompokkan menjadi satu issue di dashboard. Jangan melaporkan exception yang sama dua kali lewat catch dan handler global.

Metrik HTTP

Request HTTP menghasilkan durasi, status, dan error rate per endpoint. URL dikirim tanpa query string, fragment, dan kredensial.

OkHttp

val client = OkHttpClient.Builder()
    .addInterceptor(PulseOkHttpInterceptor())
    .build()

// Klien lain: catat manual
PulseMonitoring.recordHttp("GET", url, 200, durationMs, requestBytes = null, responseBytes = 2048)

Catat setiap request satu kali saja, dan jangan memasukkan ID sensitif ke path URL.

Screen

Dengan autoScreens = true (default), setiap Activity yang tampil dicatat dengan nama kelasnya. Untuk Compose atau fragment, panggil manual:

PulseMonitoring.trackScreen("Checkout")

Pakai satu cara saja untuk screen yang sama agar tidak tercatat ganda.

Informasi in-app

Maintenance, fitur baru, dan banner yang Anda terbitkan di dashboard aktif otomatis setelah start. Tidak ada setup tambahan. SDK mengambil feed saat start, setiap aplikasi kembali ke foreground, dan saat push masuk, lalu menyimpannya agar tetap tampil saat offline.

JenisKapan tampil
MaintenanceSetiap aplikasi dibuka atau kembali dari background selama aktif. Tidak bisa ditutup dengan tap di luar kartu.
Fitur baruSekali per item (dan muncul lagi bila item diedit). 2–10 halaman bisa digeser dengan tombol Lewati / Lanjut.
BannerSekali per item. Dengan gambar, tampil 16:9 dan gambar bisa ditekan untuk menjalankan aksi.

Item yang ditargetkan ke versi tertentu hanya tampil di build yang cocok: SDK mengirim build number aplikasi (versionCode) saat mengambil feed.

Membaca feed dan menangani aksi

PulseInformation.items()             // item aktif
PulseInformation.activeMaintenance() // maintenance aktif, atau null
PulseInformation.addListener { items -> /* main thread */ }
PulseInformation.refresh()

// Buka deep link sendiri; true = sudah ditangani (default: browser)
PulseInformation.setActionHandler { uri -> router.open(uri) }

Ingin menampilkan popup sendiri? Set autoPopups ke false, lalu panggil showPopups di layar yang Anda pilih.

Pemeliharaan

Selain popup, maintenance bisa ditampilkan sebagai komponen siap pakai yang muncul dan hilang sendiri mengikuti jadwal di dashboard.

Banner

<dev.pulse.monitoring.PulseMaintenanceBanner
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="16dp" />

Badge (titik di ikon)

<dev.pulse.monitoring.PulseMaintenanceBadge
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">
    <ImageView android:src="@drawable/ic_home"
        android:layout_width="24dp" android:layout_height="24dp" />
</dev.pulse.monitoring.PulseMaintenanceBadge>

Jika maintenance ditampilkan sebagai chip atau badge sendiri, matikan popup otomatisnya dengan autoMaintenancePopups = false. Feed dan listener tetap berjalan, dan menekan chip tetap bisa membuka detail maintenance.

Notifikasi push

Push memakai Firebase Cloud Messaging milik aplikasi Anda. SDK tidak menambahkan dependency Firebase dan tidak mengirim token ke server. Saat Firebase Messaging tersedia, SDK berlangganan topic:

Topic FCM

pulse.<package_id>.<platform>.all
pulse.<package_id>.<platform>.b<build>

Dashboard mengirim ke topic ini sesuai target versi informasi. Teruskan setiap pesan ke SDK; nilai true berarti pesan milik Pulse sudah ditangani.

FirebaseMessagingService

class AppMessagingService : FirebaseMessagingService() {
    override fun onMessageReceived(message: RemoteMessage) {
        if (PulseInformation.handlePush(message.data)) return
        // push lain milik aplikasi
    }
}

Tanpa Firebase, langganan topic dilewati dan monitoring tetap berjalan normal.

Notifikasi dari dashboard

Tersedia mulai SDK Android/iOS 0.1.3 dan Flutter 0.1.6 (segera dirilis).

Menu Push & distribusi → Kirim notifikasi mengirim notifikasi ke semua pengguna aplikasi lewat topic pulse.<package>.<platform>.all, lengkap dengan gambar opsional dan link yang dibuka saat ditekan. Pesan ini membawa pulse_type=notification dan, bila diisi, url.

Android tidak menampilkan notifikasi saat aplikasi terbuka. Teruskan pesan ke PulseNotifications.handle: SDK menampilkannya (beserta gambar) dan, saat ditekan, membuka url lewat action handler yang sama dengan tombol informasi. Di Android 13+, aplikasi perlu meminta izin POST_NOTIFICATIONS.

FirebaseMessagingService

override fun onMessageReceived(message: RemoteMessage) {
    if (PulseInformation.handlePush(message.data)) return
    if (PulseNotifications.handle(message.data, message.notification?.title,
            message.notification?.body, message.notification?.imageUrl?.toString())) return
    // push lain milik aplikasi
}

// Activity singleTop: teruskan intent baru
override fun onNewIntent(intent: Intent) {
    super.onNewIntent(intent)
    PulseNotifications.handleTap(this, intent)
}

Setiap tap dicatat sekali sebagai event pulse_notification_opened dengan properti has_url, tanpa isi pesan atau URL.

Referensi konfigurasi

OpsiDefaultFungsi
workspaceKeywajibWorkspace key dari Pengaturan → Workspace.
baseUrl / baseURLAPI Pulse terhostingHanya untuk pulse-api lokal atau self-hosted. Sertakan /api/v1.
debugfalseLog diagnostik SDK.
autoScreenstrueCatat Activity / view controller otomatis.
flushIntervalSeconds / flushInterval30Jeda pengiriman batch (detik).
enabledtrueMatikan seluruh SDK tanpa menghapus kode.
informationtrueAmbil dan tampilkan informasi dari dashboard.
autoPopupstrueTampilkan popup informasi otomatis.
autoMaintenancePopupstruePopup maintenance otomatis; matikan bila memakai chip/badge sendiri.
pushTopicstrueLangganan topic FCM bila Firebase Messaging ada.

Pengiriman data

  • Event diantrikan di disk (maks. 1000), lalu dikirim per batch (maks. 100 event / 512 KiB, gzip).
  • Batch dikirim tiap 30 detik, saat 50 event mengantri, saat aplikasi ke background, atau saat flush() dipanggil.
  • Gagal jaringan, 429, atau 5xx dicoba ulang dengan jeda bertambah (5 detik hingga 5 menit).

Data dan privasi

Yang dikumpulkan otomatis: package/bundle ID, versi dan build aplikasi, model perangkat, versi OS, locale, serta ID instalasi acak (bukan ID hardware, IDFA, atau IDFV). Isi request/response, query string, email, dan nama tidak dikumpulkan.

ID user, event kustom, dan pesan error berasal dari aplikasi Anda, jadi pastikan tidak berisi data sensitif. SDK iOS menyertakan PrivacyInfo.xcprivacy; deklarasi privasi aplikasi tetap perlu mencerminkan data kustom yang Anda kirim.

Troubleshooting

GejalaPeriksa
Data tidak muncul di dashboardWorkspace key benar, package/bundle ID dan flavor cocok dengan workspace, perangkat bisa mengakses internet. Aktifkan debug untuk melihat log SDK.
Maintenance tidak munculInformasi sudah terbit, jadwal aktif, target platform dan versi cocok, serta pengaturan autoMaintenancePopups.
HTTP tidak tercatatInterceptor / delegate terpasang di client yang dipakai, atau panggil recordHttp manual.
Screen tidak tercatatBeri nama route (Flutter) atau panggil trackScreen untuk Compose/SwiftUI.
Crash iOS belum masukMetricKit mengirim diagnostics sesuai jadwal Apple; uji di perangkat fisik.
checkReleaseAarMetadata meminta API 37Naikkan compileSdk aplikasi ke 37 dan gunakan AGP 9.1.1+.
MissingPluginException (Flutter)Hentikan aplikasi, jalankan pub get / pod install, lalu build ulang penuh.

Pertanyaan integrasi? Hubungi idris3097@gmail.com.