Pushizo Docs
SDK rehberleri

Android SDK

Kotlin, minSdk 23, AGP 8; FCM üzerinden push, bildirim kanalları, in-app, bildirim kutusu, tercihler.

Paket com.pushizo:pushizo-android; push FCM üzerinden gider (Pushizo her zaman data-only mesaj gönderir, bildirimi SDK kurar). Örnek: examples/android-kotlin.

Kurulum

  1. Firebase projesi oluşturun, Android uygulamanızı ekleyin, google-services.json dosyasını app/ altına koyun. Kök build.gradle.kts: id("com.google.gms.google-services") version "4.4.2" apply false; app/build.gradle.kts: id("com.google.gms.google-services").
  2. Dashboard → Kanallar → Android Push → Firebase servis hesabı JSON'unu yükleyip Doğrula.
  3. Bağımlılık:
// app/build.gradle.kts
dependencies { implementation("com.pushizo:pushizo-android:0.1.0") }
// Monorepo içinden: settings.gradle.kts → include(":pushizo"); project(":pushizo").projectDir = file("<repo>/sdk/android/pushizo")
//                   ve implementation(project(":pushizo"))
  1. Manifest'e ek bir şey gerekmez: INTERNET, POST_NOTIFICATIONS, PushizoMessagingService ve NotificationOpenedReceiver manifest merge ile eklenir. Varsayılan ikon/renk için:
<meta-data android:name="com.pushizo.sdk.default_notification_icon" android:resource="@drawable/ic_stat_pushizo" />
<meta-data android:name="com.pushizo.sdk.default_notification_color" android:resource="@color/brand" />

Başlatma (Application)

class App : Application() {
    override fun onCreate() {
        super.onCreate()
        Pushizo.initialize(
            this,
            "app_…",
            Pushizo.Options(
                apiUrl = "https://api.example.com",
                requiresPrivacyConsent = false,
                logLevel = HsLog.Level.WARN,
                defaultChannelName = "Bildirimler",
            ),
        )
        Pushizo.Notifications.addClickListener { event ->
            // event.notification, event.actionId, event.url (düğme URL'si yoksa bildirim URL'si)
        }
    }
}

İzin (Android 13+)

Pushizo.Notifications.requestPermission(activity)

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == Pushizo.Notifications.PERMISSION_REQUEST_CODE) Pushizo.Notifications.onPermissionResult()
}

val observer: (Boolean) -> Unit = { granted -> /* izin değişti */ }
Pushizo.Notifications.addPermissionObserver(observer)
Pushizo.Notifications.removePermissionObserver(observer)

İzin yoksa abonelik pending kalır; izin verilince otomatik kaydedilir. Pushizo.Notifications.permission mevcut durumu eşzamanlı verir. Gözlemci, etkin izin gerçekten değiştiğinde (izin isteği sonucu ya da uygulama ön plana dönünce) ana iş parçacığında çağrılır; Java için Pushizo.Notifications.PermissionObserver arayüzü.

API

Pushizo.setConsentGiven(true)
Pushizo.login("user_42", identityHash = null)
Pushizo.logout()

Pushizo.User.addTag("plan", "pro"); Pushizo.User.addTags(mapOf("a" to "1")); Pushizo.User.removeTag("plan")
Pushizo.User.getTags(); Pushizo.User.setLanguage("tr"); Pushizo.User.id; Pushizo.User.externalId

Pushizo.User.pushSubscription.optIn() / optOut() / id / token / optedIn / state
Pushizo.User.pushSubscription.addObserver { state -> … }

Pushizo.Notifications.addForegroundLifecycleListener { e -> e.preventDefault() } // ön planda gösterme
Pushizo.Session.sendEvent("purchase", mapOf("sku" to "A1"), 49.9)
Pushizo.Debug.setLogLevel(HsLog.Level.DEBUG)

E-posta ve SMS

Pushizo.User.addEmail("Ali@Example.com")      // → ali@example.com; geçersizse IllegalArgumentException
Pushizo.User.removeEmail("ali@example.com")
Pushizo.User.addSms("+90 (532) 123-45-67")      // → +905321234567
Pushizo.User.removeSms("+905321234567")
Pushizo.User.emails; Pushizo.User.smsNumbers // bu cihazda kayıtlı adresler

Kayıt kuralları iOS ile aynıdır: kimlikli kullanıcıda external_id (+ identity_hash), anonimde user.subscription_id; çevrimdışıyken kuyrukta bekler.

Kullanıcı tercihleri

lifecycleScope.launch {
    val result = Pushizo.User.getPreferences()            // result.preferences: [HsPreference], result.categories: [HsMessageCategory]
    Pushizo.User.setPreferences(listOf(
        HsPreferenceInput("promos", channel = null, optedIn = false),        // tüm kanallarda kapat
        HsPreferenceInput("orders", channel = "android_push", optedIn = true),
    ))
}
// Java/köprü: Pushizo.User.getPreferences { r -> } ve Pushizo.User.setPreferences(list, callback)

Abonelik henüz yoksa IllegalStateException. HsPreference: category, channel (null = tüm kanallar), optedIn, explicit, source, updatedAt.

Bildirim kanalları

Dashboard → Ayarlar → Android bildirim kategorileri (/config → android_channels): SDK başlatmada ve her config yenilemesinde NotificationChannel oluşturur/günceller (importance: low/default/high/urgent; sound → res/raw/<ad>; vibration; group). Android var olan kanalda yalnızca ad/açıklama/grup günceller. android_channel_id taşıyan push bu kanalı kullanır; yoksa Options.defaultChannelId.

In-app mesajlar

Pushizo.InAppMessages.addTrigger("level", "gold")          // addTriggers(map), removeTrigger(s), clearTriggers(), getTriggers()
Pushizo.InAppMessages.setScreen("cart")                    // Activity/Composable görünürken; ayrılırken setScreen(null)
Pushizo.Session.sendEvent("cart_viewed")
Pushizo.InAppMessages.paused = true
Pushizo.InAppMessages.addClickListener { e -> /* e.messageId, e.actionId, e.url */ }
Pushizo.InAppMessages.addLifecycleListener(object : HsInAppLifecycleListener {
    override fun onWillDisplay(event: HsInAppLifecycleEvent) {}
    override fun onDidDisplay(event: HsInAppLifecycleEvent) {}
    override fun onWillDismiss(event: HsInAppLifecycleEvent) {}
    override fun onDidDismiss(event: HsInAppLifecycleEvent) {}
})

Çizim: resumed Activity üstünde yerel View'larla Dialog (Compose gerekmez). Activity durursa mesaj sessizce kaldırılıp sonraki Activity'de yeniden gösterilir. Tetik kuralları, sıklık ve aksiyonlar (push_prompt Android 13+'ta requestPermission çağırır) tüm SDK'larda aynıdır. Özel çizim: Pushizo.InAppMessages.setRenderer(HsInAppRenderer).

Bildirim kutusu

lifecycleScope.launch {
    val page = Pushizo.Inbox.list(limit = 20, cursor = null)  // page.items, page.unreadCount, page.nextCursor, page.hasMore
    Pushizo.Inbox.markRead(page.items.first().id)
    Pushizo.Inbox.markAllRead()
    Pushizo.Inbox.archive(id)
    Pushizo.Inbox.unreadCount()
}
// Java/köprü: Pushizo.Inbox.list(20, null) { result -> result.getOrNull() }  (HsCallback)

Bildirim tepsisi ve payload alanları

Pushizo.Notifications.clearAll()                           // tüm Pushizo bildirimleri + grup özetleri
Pushizo.Notifications.removeNotification(event.notification.androidNotificationId)
Pushizo.Notifications.removeGroupedNotifications("orders") // android_group anahtarı

FCM data içinde SDK'nın okuduğu görünüm anahtarları:

AnahtarAPI alanıDavranış
hs_small_iconsmall_iconDrawable kaynak adı; yoksa manifest varsayılanı, o da yoksa SDK ikonu
hs_large_iconlarge_iconhttp(s) URL indirilir ya da drawable/mipmap adı
hs_accent_colorandroid_accent_colorAARRGGBB ya da RRGGBB
hs_visibilityandroid_visibility1 public, 0 private, -1 secret
hs_groupandroid_groupBildirim grubu + özet (Android 7+)
hs_channelandroid_channel_idBildirim kanalı
hs_soundandroid_soundres/raw sesi (kanal sesi önceliklidir, Android 8+)

Davranışlar

  • Bölgesel API kökü (ADR-0032 §4): Options.apiUrl varsayılan bırakılırsa config api_url benimsenir ve SharedPreferences'ta saklanır; 421 HS_WRONG_CELL yanıtında details.api_url köküne geçilip istek bir kez yeniden denenir. Yalnızca https kabul edilir.
  • Token: onNewToken → PATCH /subscriptions/{id}; kayıt yoksa POST. Uygulama/OS sürümü her oturumda güncellenir.
  • Mesaj: onMessageReceived → received kaydı → NotificationCompat ile gösterim (başlık, gövde, büyük resim, ikonlar, renk, görünürlük, düğmeler, kanal, collapse_key, grup). Tıklama → opened + url/deep link intent.
  • Çevrimdışı: SharedPreferences kuyruğu; WorkManager (FlushWorker) ağ gelince gönderir. Oturum: ProcessLifecycleOwner ile session_start/session_end.

Test

cd sdk/android && gradle :pushizo:testDebugUnitTest, derleme gradle :pushizo:assembleDebug; örnek cd examples/android-kotlin && gradle :app:assembleDebug. Emülatörden yerel API http://10.0.2.2:4000.

Sorun giderme

BelirtiNeden / çözüm
Token alınamıyorgoogle-services.json eksik veya paket adı uyumsuz; Logcat'te Pushizo etiketi.
Abonelik pendingBildirim izni verilmemiş (Android 13+) veya bildirimler sistem ayarından kapalı.
SENDER_ID_MISMATCHDashboard'daki servis hesabı başka Firebase projesine ait.
Bildirim gösterilmiyorÖn plan dinleyicisi preventDefault() çağırmış ya da kanal kullanıcı tarafından kapatılmış.
In-app mesaj gelmiyorAbonelik yok, tetik sağlanmıyor (ad büyük/küçük harf duyarlı), sıklık dolmuş veya paused; HsLog.Level.DEBUG ile "in-app listesi yenilendi" satırına bakın.
Inbox.list → IllegalStateExceptionAbonelik/kullanıcı henüz kaydedilmedi; 403 → login'de identityHash eksik/yanlış.

Bu sayfada