Apple, iOS 17’de yinelemelere neden olan bir hatayı kabul etti. Bu iOS 17.3’te düzeltildi. Daha fazla bilgi.
OneSignal yinelenen teslimatları nasıl önler
OneSignal, teslimatları sunucularımızdan çıkmadan önce tekilleştirir. Her gönderim iki düzeyde kontrol edilir: aynı bildirim aynı aboneliğe asla iki kez teslim edilmez ve token gönderim sırasında farklı bir aboneliğe geçse bile aynı cihaz token’ına asla iki kez teslim edilmez. Idempotency anahtarları bu korumayı kendi API yeniden denemelerinize de genişletir ve mobil SDK’lar zaten işledikleri bildirimleri atlar. Bu kontroller nedeniyle, bir cihazdaki yinelemeler genellikle gönderim pipeline’ından veya bildirimleri görüntüleyen uygulama kodundan kaynaklanır. Aşağıdaki bölümler nereden kaynaklandığını bulmanıza yardımcı olur.Buradan başlayın
Durumunuza en uygun bölümü seçin:- Mesajları API aracılığıyla kendi backend’inizden veya pipeline’ınızdan gönderiyorsunuz → Aynı mesaj birden çok kez gönderildi
- Uygulamanız OneSignal’ın yanı sıra Firebase veya başka bir push SDK’sı kullanıyor → Üçüncü taraf bildirim işleyicileri
- Android uygulamanız bildirimler için kodda özelleştirme yapıyor (servis uzantısı veya ön plan dinleyicisi) → Android bildirim işleyicileri
- iOS uygulamanız kendi
UNUserNotificationCenterDelegate’ini uyguluyor → iOS ön plan işleyicisi - Yalnızca geliştirme derlemelerinde veya birden fazla kurulumla yineleme görüyorsunuz → Birden fazla uygulama örneği
- Eski, daha önce teslim edilmiş bildirimler uygulama Android’de açıldığında yeniden görünüyor → bunlar geri yüklenen bildirimlerdir, yineleme değildir. Bkz. Geri yüklenen bildirimler
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
FirebaseMessagingServiceveya iOS’taUNUserNotificationCenterDelegategibi, gelen payload’u okuyup ondan yerel bir bildirim oluşturan özel mesaj işleyicileri.
OneSignal bildirimlerini tanımlama
Her OneSignal bildirimi, OneSignal bildirim UUID’sini içereni anahtarıyla bir custom nesnesi içerir:
JSON
Üçüncü taraf işleyicilerinde OneSignal bildirimlerini filtreleme
OneSignal dışı herhangi bir işleyicidecustom.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.
- Android
- iOS
Özel bir
FirebaseMessagingService veya başka bir uzak mesaj işleyicisinde:Kotlin
Android bildirim işleyicileri
OneSignal, bir bildirim görüntülenmeden önce durdurup özelleştirmenize olanak tanıyan iki Android callback’i sunar:- Bildirim servis uzantısındaki
onNotificationReceived: uygulama arka plandayken de dahil olmak üzere her push için ve ayrıca geri yüklenen bildirimler için çalışır. - Ön plan yaşam döngüsü dinleyicisindeki
onWillDisplay: yalnızca uygulama ön planda olduğunda çalışır.
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:
- Önce
event.preventDefault()çağırmadanevent.getNotification().display()çağırmak, bu da bildirimi iki kez gösterir. - OneSignal orijinali de görüntülerken
NotificationManagerCompat.notify()ile ayrı bir bildirim göndermek.
display()’i veya kendi NotificationManagerCompat.notify()’ınız, ikisi birden asla.
onWillDisplay için de geçerlidir:
Kotlin
Callback’lerde asenkron çalışma
Görüntülemeden önce arka plan çalışması (ağ çağrıları, veritabanı aramaları) yapıyorsanız, callback’tepreventDefault() ç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.
Asenkron çalışmayı 30 saniye içinde tamamlayın. SDK, bu süreden sonra callback’i beklemeyi bırakır ve preventDefault() ile tutulan bir bildirim görüntülenmeden bırakılır.
iOS ön plan işleyicisi
OneSignal, SDK başlatma sırasında kendiniUNUserNotificationCenterDelegate 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ındancompletionHandler([.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.
event.preventDefault() çağırın:
Swift
Birden fazla uygulama örneği
- Android
- iOS
- Web
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.
OneSignal’ın hedef kitleme yinelenen bildirim gönderilmesine karşı güvenlik önlemleri var mı?
Evet. Teslimatlar, OneSignal’ın sunucularından çıkmadan önce iki düzeyde tekilleştirilir: bildirim başına abonelik başına ve bildirim başına cihaz token’ı başına. Kendi API yeniden denemeleriniz idempotency anahtarları ile korunur. Bkz. OneSignal yinelenen teslimatları nasıl önler.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 bircollapse_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.
Bildirim tepsisini yönetme
Mobil bildirimler için tıklama, kapatma, geri yükleme ve temizleme davranışı.