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
- Ambil workspace key. Login ke dashboard Pulse → Pengaturan → Workspace → Workspace key → Tampilkan. Key berawalan
pk_. - Pasang SDK sesuai platform (lihat Instalasi).
- Panggil
startsekali saat aplikasi dibuka, dengan workspace key tersebut. - Jalankan aplikasi, lalu buka menu Monitoring di dashboard. Sesi pertama muncul dalam beberapa detik.
https://pulse-api.mhmadidris.site/api/v1) secara default. Anda hanya perlu mengisi baseUrl bila memakai pulse-api sendiri atau server lokal.Persyaratan
| Platform | Minimum | Catatan |
|---|---|---|
| Android (native) | API 21+, compileSdk 37+, JDK 17 | Kotlin atau Java. Tanpa dependency; OkHttp opsional. |
| iOS (native) | iOS 15+, Swift 5.9+ | Swift atau Objective-C. Tanpa dependency pihak ketiga. |
| Flutter | Flutter 3.41+, Dart ≥ 3.11 | Android 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.
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 event | Nilai |
|---|---|
| Nama | [A-Za-z0-9_.-], maksimal 100 karakter |
| Properti | Maksimal 20, key maksimal 40 karakter |
| Nilai | String (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.
| Jenis | Kapan tampil |
|---|---|
| Maintenance | Setiap aplikasi dibuka atau kembali dari background selama aktif. Tidak bisa ditutup dengan tap di luar kartu. |
| Fitur baru | Sekali per item (dan muncul lagi bila item diedit). 2–10 halaman bisa digeser dengan tombol Lewati / Lanjut. |
| Banner | Sekali 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
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
| Opsi | Default | Fungsi |
|---|---|---|
workspaceKey | wajib | Workspace key dari Pengaturan → Workspace. |
baseUrl / baseURL | API Pulse terhosting | Hanya untuk pulse-api lokal atau self-hosted. Sertakan /api/v1. |
debug | false | Log diagnostik SDK. |
autoScreens | true | Catat Activity / view controller otomatis. |
flushIntervalSeconds / flushInterval | 30 | Jeda pengiriman batch (detik). |
enabled | true | Matikan seluruh SDK tanpa menghapus kode. |
information | true | Ambil dan tampilkan informasi dari dashboard. |
autoPopups | true | Tampilkan popup informasi otomatis. |
autoMaintenancePopups | true | Popup maintenance otomatis; matikan bila memakai chip/badge sendiri. |
pushTopics | true | Langganan 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
| Gejala | Periksa |
|---|---|
| Data tidak muncul di dashboard | Workspace key benar, package/bundle ID dan flavor cocok dengan workspace, perangkat bisa mengakses internet. Aktifkan debug untuk melihat log SDK. |
| Maintenance tidak muncul | Informasi sudah terbit, jadwal aktif, target platform dan versi cocok, serta pengaturan autoMaintenancePopups. |
| HTTP tidak tercatat | Interceptor / delegate terpasang di client yang dipakai, atau panggil recordHttp manual. |
| Screen tidak tercatat | Beri nama route (Flutter) atau panggil trackScreen untuk Compose/SwiftUI. |
| Crash iOS belum masuk | MetricKit mengirim diagnostics sesuai jadwal Apple; uji di perangkat fisik. |
| checkReleaseAarMetadata meminta API 37 | Naikkan 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.