Android SDK (Kotlin)
Kotlin AAR, minSdk 23; Firebase Messaging ve AndroidX core dışında sıfır bağımlılık. Firebase token'ı ve transport'u sağlar; her bildirimi SDK çizer (sunucu data-only mesaj gönderir) ve delivered / opened / clicked / dismissed bildirir.
Uygulama tarafı çalışmadan önce service account yüklenmiş ve google-services.json yerinde olmalı: Android platform kurulumu.
1 Bağımlılıklar
// app/build.gradle.kts
plugins {
id("com.google.gms.google-services")
}
dependencies {
implementation("com.opennotification:sdk:0.1.0")
implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
implementation("com.google.firebase:firebase-messaging")
}
Artifact Maven Central'a çıkana kadar yerelde derleyip yayınlayın:
cd packages/sdk-android && gradle :sdk:publishToMavenLocal
ve repository'lerinize mavenLocal() ekleyin.
2 Başlat
Application alt sınıfınızda — herhangi bir push gelmeden önce çalışmalı:
class App : Application() {
override fun onCreate() {
super.onCreate()
OpenNotification.init(
this,
"https://push.example.com",
"pk_live_…",
OpenNotification.Config(
channelId = "default",
channelName = "Bildirimler",
smallIcon = R.drawable.ic_notification, // tek renkli, saydam üzerine beyaz
launchActivity = MainActivity::class.java, // isteğe bağlı; yoksa launcher activity
),
)
OpenNotification.onOpen = { message -> Router.open(message.url, message.data) }
OpenNotification.onReceive = { message -> /* ön planda geldi */ }
}
}
init bildirim kanalını oluşturur, servisin zaten verdiği bir token'ı (FCM üzerinden soğuk başlatma) kaydeder ve FirebaseMessaging'den güncel token'ı ister. Bundan sonra kayıt, token yenilemeleri dahil otomatiktir.
Kütüphane manifest'i OpenNotificationMessagingService'i kaydeder. Sizinkine eklenecek bir şey yok.
3 İzin (Android 13+)
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
OpenNotification.requestPermission(this) // API 33 altında no-op
}
}
Sonucu onRequestPermissionsResult'ta izlemek isterseniz istek kodu OpenNotification.PERMISSION_REQUEST_CODE. Manifest'inizde yoksa izni bildirin:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
4 Kimlik ve tag'ler
OpenNotification.login("user_123") { error -> }
OpenNotification.setTags(mapOf("plan" to "platinum", "streak" to 42))
OpenNotification.removeTags(listOf("streak"))
OpenNotification.setLanguage("tr")
OpenNotification.logout()
OpenNotification.unsubscribe()
OpenNotification.trackSession() // ön plana dönüşte (ProcessLifecycleOwner / Activity.onStart); sunucu tekilleştirir
Tüm callback'ler ((Throwable?) -> Unit)? tipindedir ve ana thread dışında çalışır. Kayıttan önce login saklanır ve token'la gönderilir. Semantik: Kimlik.
HttpURLConnection PATCH gönderemediği için SDK POST /v1/subscriptions/:id/user kullanır — API aynı handler'ı iki fiilde de açar.
Sessiz push'lar ve kanallar
Sessiz push kampanyası silent = "1" ile bir veri mesajı olarak gelir: SDK hiçbir şey çizmez, onReceive'i message.silent == true ve message.data ile çağırır.
OpenNotification.onReceive = { message -> if (message.silent) Sync.run(message.data) }
Panelde tanımlanan kanallar (Android kanalları) push ile gelir: SDK kanalı taşıdığı tanımdan ilk kullanımda oluşturur ve ona post eder. Cihazda olmayan ve push'un tarif etmediği kanal Config.channelId'ye düşer. Android mevcut kanalın önemini değiştirmez — paneldeki değişiklik yeni kanal id'si gerektirir.
Oturumlar
Kayıt ilk oturumu sayar. Uygulama ön plana her geldiğinde OpenNotification.trackSession() çağırın (olağan yer bir ProcessLifecycleOwner gözlemcisidir); sunucu 30 dakika boşluk kuralını uygular, sık çağırmak sorun değildir.
5 Açılmalar ve soğuk başlatma
onOpen gövdeye ya da butona basışta ana thread'de tetiklenir (message.actionId dolu, butonun URL'i varsa message.url onunla değişir). Açılmalar lambda'nız çalışmadan sunucuya bildirilir.
Basış uygulamayı başlatırsa intent mesajı taşır. Alan activity'de okuyun:
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
OpenNotification.messageFrom(intent)?.let { Router.open(it.url, it.data) }
}
override fun onNewIntent(intent: Intent) {
super.onNewIntent(intent)
OpenNotification.messageFrom(intent)?.let { Router.open(it.url, it.data) }
}
messageFrom bildirimden gelmeyen intent'ler için null döner.
SDK ne çizer
Data mesajından renderer şununla bir NotificationCompat bildirimi kurar:
| Data anahtarı | Nasıl görünür |
|---|---|
title, body | Metin; uzun gövdede BigTextStyle |
image | BigPictureStyle ve büyük simge |
icon | Görsel yoksa büyük simge |
actions (JSON) | En çok 3 buton; her basış clicked olarak izlenir |
sound | default, bir raw kaynak adı ya da sessiz için none |
group | Bildirim grup anahtarı |
badge | setNumber ile uygulama rozeti |
url, msgId, campaignId, diğer her şey | Intent extra'larında taşınır |
Kapatmalar delete intent üzerinden NotificationReceiver ile bildirilir.
Zaten bir FirebaseMessagingService'iniz mi var?
Yalnızca bir servis mesaj alabilir. Sizinkinden iletin:
override fun onNewToken(token: String) = OpenNotification.register(token)
override fun onMessageReceived(message: RemoteMessage) {
OpenNotificationMessagingService.handle(message) // msgId/title olmayan mesajları yok sayar
}
Test
gradle :sdk:testReleaseUnitTest(ANDROID_HOMEister).- Google Play servisli cihaz ya da emülatörde: panelin zamanlama adımındaki Test gönder ya da
externalId'nizi hedefleyenPOST /v1/notifications. - Kayıt ve izleme çağrıları için
adb logcat -s OpenNotification.