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
- Firebase projesi oluşturun, Android uygulamanızı ekleyin,
google-services.jsondosyasınıapp/altına koyun. Kökbuild.gradle.kts:id("com.google.gms.google-services") version "4.4.2" apply false;app/build.gradle.kts:id("com.google.gms.google-services"). - Dashboard → Kanallar → Android Push → Firebase servis hesabı JSON'unu yükleyip Doğrula.
- 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"))- Manifest'e ek bir şey gerekmez:
INTERNET,POST_NOTIFICATIONS,PushizoMessagingServiceveNotificationOpenedReceivermanifest 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ı adreslerKayı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ı:
| Anahtar | API alanı | Davranış |
|---|---|---|
hs_small_icon | small_icon | Drawable kaynak adı; yoksa manifest varsayılanı, o da yoksa SDK ikonu |
hs_large_icon | large_icon | http(s) URL indirilir ya da drawable/mipmap adı |
hs_accent_color | android_accent_color | AARRGGBB ya da RRGGBB |
hs_visibility | android_visibility | 1 public, 0 private, -1 secret |
hs_group | android_group | Bildirim grubu + özet (Android 7+) |
hs_channel | android_channel_id | Bildirim kanalı |
hs_sound | android_sound | res/raw sesi (kanal sesi önceliklidir, Android 8+) |
Davranışlar
- Bölgesel API kökü (ADR-0032 §4):
Options.apiUrlvarsayılan bırakılırsa configapi_urlbenimsenir veSharedPreferences'ta saklanır; 421HS_WRONG_CELLyanıtındadetails.api_urlköküne geçilip istek bir kez yeniden denenir. Yalnızcahttpskabul edilir. - Token:
onNewToken→PATCH /subscriptions/{id}; kayıt yoksaPOST. Uygulama/OS sürümü her oturumda güncellenir. - Mesaj:
onMessageReceived→receivedkaydı →NotificationCompatile 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ışı:
SharedPreferenceskuyruğu;WorkManager(FlushWorker) ağ gelince gönderir. Oturum:ProcessLifecycleOwnerilesession_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
| Belirti | Neden / çözüm |
|---|---|
| Token alınamıyor | google-services.json eksik veya paket adı uyumsuz; Logcat'te Pushizo etiketi. |
Abonelik pending | Bildirim izni verilmemiş (Android 13+) veya bildirimler sistem ayarından kapalı. |
SENDER_ID_MISMATCH | Dashboard'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 gelmiyor | Abonelik 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 → IllegalStateException | Abonelik/kullanıcı henüz kaydedilmedi; 403 → login'de identityHash eksik/yanlış. |
iOS SDK
Swift 5.9, iOS 15+; SPM ve CocoaPods. APNs push, Notification Service Extension ile zengin medya ve teslimat onayı, in-app, bildirim kutusu, tercihler.
Flutter SDK
pushizo_flutter — Android ve iOS yerel SDK'larını MethodChannel/EventChannel ile saran eklenti; push, in-app (Flutter widget'larıyla çizim), bildirim kutusu, tercihler.