Ana içeriğe geç

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, bodyMetin; uzun gövdede BigTextStyle
imageBigPictureStyle ve büyük simge
iconGörsel yoksa büyük simge
actions (JSON)En çok 3 buton; her basış clicked olarak izlenir
sounddefault, bir raw kaynak adı ya da sessiz için none
groupBildirim grup anahtarı
badgesetNumber ile uygulama rozeti
url, msgId, campaignId, diğer her şeyIntent 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_HOME ister).
  • Google Play servisli cihaz ya da emülatörde: panelin zamanlama adımındaki Test gönder ya da externalId'nizi hedefleyen POST /v1/notifications.
  • Kayıt ve izleme çağrıları için adb logcat -s OpenNotification.