Ana içeriğe atla
Yinelenen bildirimler, aynı cihazın aynı mesaj içeriğini birden fazla kez aldığında oluşur. Bu kılavuz, en yaygın nedenleri ve bunların nasıl çözüleceğini ele alır. Aynı kullanıcı bildirimi birden fazla cihazda (telefon, tablet, masaüstü) görüyorsa, bu durum segmentasyon yapılandırmanıza (segmentler, harici kimlikler vb.) göre beklenen bir davranıştır. Yinelenen uygulama içi mesajlar için bunun yerine uygulama içi mesaj sorun giderme kılavuzuna bakın.
Apple, iOS 17’de yinelemelere neden olan bir hatayı kabul etti. Bu iOS 17.3’te düzeltildi. Daha fazla bilgi.

Buradan başlayın

Durumunuza en uygun bölümü seçin:

Aynı mesaj birden çok kez gönderildi

En yaygın neden, OneSignal API aracılığıyla aynı bildirim payload’unun birden fazla kez gönderilmesidir. Yaygın nedenler:
  • Sunucunuz, ilkinin başarılı olup olmadığını kontrol etmeden istekleri yeniden dener.
  • Backend pipeline’ınızdaki mantık aynı bildirimi iki kez gönderir.
  • OneSignal’a geçiş yapıyorsunuz ancak önceki bir sağlayıcıdan hala gönderiyorsunuz. Her iki sistemden de aynı anda gönderme yapmaktan kaçının.

Idempotent API istekleri

Yeniden denemelerde idempotency anahtarlarını yeniden kullanarak yinelenen mesajları önleyin.

Üçüncü taraf bildirim işleyicileri

Uygulamanızdaki başka bir kodun OneSignal’ın push payload’unu işleyip OneSignal’ınkine ek olarak kendi bildirimini görüntülemesi durumunda yineleme oluşabilir. Bu şunları içerir:
  • Aynı payload’u alan diğer uzak push SDK’ları (örneğin, Firebase Cloud Messaging).
  • Android’de FirebaseMessagingService veya iOS’ta UNUserNotificationCenterDelegate gibi, gelen payload’u okuyup ondan yerel bir bildirim oluşturan özel mesaj işleyicileri.
OneSignal SDK’sı, tek işleyici olduğunda OneSignal payload’larını otomatik olarak filtreler. Üçüncü taraf kodu, siz söylemedikçe bunları filtrelemesini bilmez.

OneSignal bildirimlerini tanımlama

Her OneSignal bildirimi, OneSignal bildirim UUID’sini içeren i anahtarıyla bir custom nesnesi içerir:
JSON
{
  "custom": {
    "i": "the-notification-id"
  }
}
Tam payload referansı için Özel OneSignal payload yapısı sayfasına bakın.

Üçüncü taraf işleyicilerinde OneSignal bildirimlerini filtreleme

OneSignal dışı herhangi bir işleyicide custom.i anahtarını kontrol edin ve mevcut olduğunda erken dönün. OneSignal kendi payload’larını işlerken diğer kodunuz kendi payload’larını işlemeye devam eder.
Özel bir FirebaseMessagingService veya başka bir uzak mesaj işleyicisinde:
Kotlin
override fun onMessageReceived(remoteMessage: RemoteMessage) {
    val customJson = remoteMessage.data["custom"]
    if (customJson != null) {
        try {
            val custom = JSONObject(customJson)
            if (custom.has("i")) {
                // OneSignal bildirimi — OneSignal SDK'sının işlemesine izin ver
                return
            }
        } catch (e: JSONException) {
            // OneSignal payload'u değil, devam et
        }
    }

    // Kendi bildiriminizi burada işleyin
}
Diğer sağlayıcınızdan gönderilen payload yapısını kontrol ediyorsanız, belirgin bir işaretleyici anahtar ekleyin (örneğin, my_app_notification: true) ve her iki yönde de filtreleyin — kendi kodunuzda yalnızca işaretleyicinizi içeren bildirimleri işleyin ve custom.i anahtarını içeren bildirimleri OneSignal’ın işlemesine bırakın.

Android bildirim işleyicileri

OneSignal, bir bildirim görüntülenmeden önce durdurup özelleştirmenize olanak tanıyan iki Android callback’i sunar: Bu callback’ler OneSignal’ın otomatik görüntülemesine ek olarak bildirimi görüntülediğinde yineleme oluşur.

preventDefault() ve display() kuralı

OneSignal, event.preventDefault() ile bastırılmadıkça her bildirimi otomatik olarak görüntüler. İki yaygın hata yinelemeye neden olur:
  • event.preventDefault() çağırmadan event.getNotification().display() çağırmak — bildirimi iki kez gösterir.
  • OneSignal orijinali de görüntülerken NotificationManagerCompat.notify() ile ayrı bir bildirim göndermek.
Yalnızca bir görüntüleme yolu etkin olmalıdır — OneSignal’ın display()’i veya kendi NotificationManagerCompat.notify()’ınız, ikisi birden asla.
override fun onNotificationReceived(event: INotificationReceivedEvent) {
    event.preventDefault()

    val notification = event.notification
    notification.setExtender { builder ->
        builder.setColor(0xFF0000FF.toInt())
    }
    notification.display()
}
Aynı kural, ön plan yaşam döngüsü dinleyicisindeki onWillDisplay için de geçerlidir:
Kotlin
OneSignal.Notifications.addForegroundLifecycleListener(object : INotificationLifecycleListener {
    override fun onWillDisplay(event: INotificationWillDisplayEvent) {
        event.preventDefault()

        // Kendi UI'ınızı oluşturun veya OneSignal bildirimini göstermek için event.notification.display() çağırın
    }
})
preventDefault() çağırırsanız ancak hiç display() çağırmazsanız, bildirim sessizce bırakılır ve kullanıcı onu görmez. Her kod yolu ya tam olarak bir kez display() çağırmalı ya da bildirimi kasıtlı olarak bastırmalıdır.
Hem bir bildirim servis uzantısı hem de bir ön plan yaşam döngüsü dinleyicisi kullanıyorsanız, belirli bir uygulama durumu için yalnızca bir işleyicinin bildirimi görüntülediğinden emin olun. Her ikisinden de display() çağırmak yinelemeye neden olur.

Callback’lerde asenkron çalışma

Görüntülemeden önce arka plan çalışması (ağ çağrıları, veritabanı aramaları) yapıyorsanız, callback’te preventDefault() çağrısını eşzamanlı olarak yapın ve display() çağrısını yalnızca asenkron çalışma tamamlandıktan sonra yapın. preventDefault() olmadan callback’ten dönmek OneSignal’ın bildirimi görüntülemesine izin verir ve sonraki bir display() çağrısı yinelemeye neden olur.

iOS ön plan işleyicisi

OneSignal, SDK başlatma sırasında kendini UNUserNotificationCenterDelegate olarak ayarlar. Uygulamanız da ön plan bildirim işlemeyi uyguluyorsa, bildirim iki kez görüntülenebilir — bir kez OneSignal’dan ve bir kez kodunuzdan. Yinelemeye neden olan yaygın kalıplar:
  • Çağrıları OneSignal’a iletmeden kendi UNUserNotificationCenterDelegate’inizi uygulamak, ardından completionHandler([.banner, .sound]) çağırıp aynı metottan özel bir uygulama içi uyarı göstermek.
  • OneSignal’ın da görüntülemekte olduğu gelen bir push’a yanıt olarak yerel bir bildirim (UNUserNotificationCenter.current().add(...)) planlamak.
Yinelemeye neden olmadan ön plan görüntülemeyi kontrol etmek için OneSignal’ın ön plan yaşam döngüsü dinleyicisini kullanın ve bildirimi kendiniz oluşturmak istediğinizde event.preventDefault() çağırın:
Swift
OneSignal.Notifications.addForegroundLifecycleListener(self)

func onWillDisplay(event: OSNotificationWillDisplayEvent) {
    event.preventDefault()

    // Kendi UI'ınızı oluşturun veya OneSignal bildirimini göstermek için event.notification.display() çağırın
}

Birden fazla uygulama örneği

Uygulamanızın hem production hem de development sürümleri yüklü olduğunda yineleme oluşabilir. Her uygulamanın benzersiz bir paket adı vardır ve kendi push token’ını alır.Bildirimi hangi uygulama örneğinin gönderdiğini onaylamak için bildirime uzun basın.

Tanı ipuçları

Yinelemeleri daha hızlı ayıklamak için aşağıdakileri toplayın ve OneSignal desteğine gönderin:
  • Yineleme alan cihazın OneSignal Abonelik Kimliği
  • OneSignal Mesaj Kimliği veya panodaki mesaja bir bağlantı
  • Uygulamanızdaki diğer kütüphaneler veya eklentilerin listesi
  • Sorunu yeniden üreten hata ayıklama günlüğü
  • Ayrıntılı yeniden üretim adımları

SSS

Uygulamamda iki bildirim SDK’sı olursa ne olur?

Her iki SDK de aynı bildirimi bağımsız olarak işleyip görüntüleyebilir. OneSignal kendi bildirimlerini otomatik olarak filtreler, ancak diğer SDK’lar bunu yapmaz. custom.i anahtarını kontrol ederek diğer SDK’nızın işleyicilerinden OneSignal payload’larını filtreleyin. Kod örnekleri için Üçüncü taraf bildirim işleyicileri bölümüne bakın.

Önceki bir sağlayıcıdan ve OneSignal’dan aynı anda push nasıl gönderilir?

Kademeli olarak geçiş yapabilirsiniz, ancak her iki sağlayıcıdan da aynı mesajı göndermekten kaçının.
  • Android: OneSignal’ı entegre ederken ve uygulamayı yayınlarken eski SDK bildirim işleme kodunu kaldırın. Kullanıcılar güncelledikçe, eski sağlayıcıdan push almayı durduracaklar.
  • iOS: Kullanıcılar güncellerken eski sağlayıcıdan geçici olarak göndermeye devam edebilirsiniz. Tamamen geçiş yaptıktan sonra, yinelemeleri önlemek için yalnızca OneSignal’dan gönderin.

Hızlı değişen güncellemeler için birden fazla bildirimi nasıl önlerim?

Bildirimleri üst üste yığmak yerine önceki bildirimleri değiştirmek için Bildirim oluştur API’sinde bir collapse_id kullanın. Birden fazla bildirim aynı collapse_id’yi paylaştığında, her yeni bildirim tepsideki önceki bildirimin yerini alır. Bu, hisse senedi fiyat güncellemeleri, canlı skorlar, teslimat ETA’ları ve benzeri sık güncellemeler için kullanışlıdır.

İlgili sayfalar

Mobil SDK sorun giderme

iOS ve Android’de push bildirimi teslimatıyla ilgili yaygın sorunları çözün.

Web push sorun giderme

Web push aboneliği, service worker ve teslimat sorunlarını ayıklayın.

Uygulama içi mesaj sorun giderme

Uygulama içi mesaj görüntüleme, tetikleyici ve yineleme sorunlarını düzeltin.

Mobil servis uzantıları

iOS ve Android’de görüntülemeden önce push bildirimlerini durdurun ve özelleştirin.

Gösterilmeyen bildirimler (web)

Gönderilen ancak görüntülenmeyen web push bildirimlerini sorun giderin.