Gönderme isteklerini programlı olarak oluşturmak için FCM API'lerini kullanırsanız, mesajları eski kayıt belirteçleriyle etkin olmayan cihazlara göndererek zaman içinde kaynakları boşa harcadığınızı fark edebilirsiniz. Bu durum, Firebase konsolunda bildirilen mesaj teslim verilerini veya BigQuery'ye aktarılan verileri etkileyerek, teslim oranlarında dramatik (ancak gerçekte geçerli olmayan) bir düşüş olarak ortaya çıkabilir. Bu kılavuzda, etkili mesaj hedefleme ve geçerli teslim raporlaması sağlamaya yardımcı olmak için alabileceğiniz bazı önlemler açıklanmaktadır.
Temel en iyi uygulamalar
Gönderme isteklerini programlı olarak oluşturmak için FCM API'lerini kullanan herhangi bir uygulamada izlemeniz gereken bazı temel uygulamalar vardır. Başlıca en iyi uygulamalar şunlardır:
- Kayıt belirteçlerini sunucunuzda saklayın. Sunucu için önemli bir rol, her müşterinin belirtecini takip etmek ve güncellenmiş bir aktif belirteç listesi tutmaktır. Kodunuza ve sunucularınıza bir belirteç zaman damgası uygulamanızı ve bu zaman damgasını düzenli aralıklarla güncellemenizi önemle tavsiye ederiz.
- Bayatlaşan saklanan belirteçleri kaldırın . Geçersiz belirteç yanıtlarının bariz olduğu durumlarda belirteçleri kaldırmaya ek olarak, muhtemelen belirtecin eski olduğuna dair diğer işaretleri izlemeniz gerekecektir. Bu kılavuz, bunu başarmak için seçeneklerinizden bazılarını ele almaktadır.
Kayıt belirteçlerini alın ve saklayın
Uygulamanızın ilk başlangıcında, FCM SDK, istemci uygulama örneği için bir kayıt belirteci oluşturur. Bu, API'den hedeflenen gönderme isteklerine dahil etmeniz veya konuları hedeflemek için konu aboneliklerine eklemeniz gereken belirteçtir.
İstemci kurulum kılavuzlarımızda belirtildiği gibi, uygulamanız bu belirteci ilk başlatmada almalı ve bir zaman damgasıyla birlikte uygulama sunucunuza kaydetmelidir . Bu zaman damgası, sizin için FCM SDK'ları tarafından sağlanmadığı için kodunuz ve sunucularınız tarafından uygulanmalıdır.
Ayrıca belirteci sunucuya kaydetmek ve zaman damgasını her değiştiğinde güncellemek önemlidir, örneğin:
- Uygulama yeni bir cihaza geri yüklendi
- Kullanıcı uygulamayı kaldırır/yeniden yükler
- Kullanıcı, uygulama verilerini temizler.
Örnek: belirteçleri ve zaman damgalarını Cloud Firestore'da saklayın
Örneğin, belirteçleri
fcmTokens adlı bir koleksiyonda depolamak için Cloud Firestore'u kullanabilirsiniz. Koleksiyondaki her belge kimliği, bir kullanıcı kimliğine karşılık gelir ve belge, geçerli kayıt jetonunu ve son güncellenen zaman damgasını saklar. Bu Kotlin örneğinde gösterildiği gibi
set işlevini kullanın:
/** * Persist token to third-party servers. * * Modify this method to associate the user's FCM registration token with any server-side account * maintained by your application. * * @param token The new token. */ private fun sendTokenToServer(token: String?) { // If you're running your own server, call API to send token and today's date for the user // Example shown below with Firestore // Add token and timestamp to Firestore for this user val deviceToken = hashMapOf( "token" to token, "timestamp" to FieldValue.serverTimestamp(), ) // Get user ID from Firebase Auth or your own server Firebase.firestore.collection("fcmTokens").document("myuserid") .set(deviceToken) }
Bir jeton her alındığında,
sendTokenToServer çağrılarak Cloud Firestore'da depolanır:
/** * Called if the FCM registration token is updated. This may occur if the security of * the previous token had been compromised. Note that this is called when the * FCM registration token is initially generated so this is where you would retrieve the token. */ override fun onNewToken(token: String) { Log.d(TAG, "Refreshed token: $token") // If you want to send messages to this application instance or // manage this apps subscriptions on the server side, send the // FCM registration token to your app server. sendTokenToServer(token) }var token = Firebase.messaging.token.await() // Check whether the retrieved token matches the one on your server for this user's device val preferences = this.getPreferences(Context.MODE_PRIVATE) val tokenStored = preferences.getString("deviceToken", "") lifecycleScope.launch { if (tokenStored == "" || tokenStored != token) { // If you have your own server, call API to send the above token and Date() for this user's device // Example shown below with Firestore // Add token and timestamp to Firestore for this user val deviceToken = hashMapOf( "token" to token, "timestamp" to FieldValue.serverTimestamp(), ) // Get user ID from Firebase Auth or your own server Firebase.firestore.collection("fcmTokens").document("myuserid") .set(deviceToken).await() } }
FCM arka ucundan geçersiz belirteç yanıtlarını algıla
FCM'den geçersiz belirteç yanıtlarını tespit ettiğinizden emin olun ve geçersiz olduğu bilinen tüm kayıt belirteçlerini sisteminizden silerek yanıt verin. HTTP v1 API ile, bu hata mesajları, gönderme isteğinizin eski veya geçersiz belirteçleri hedeflediğini gösterebilir:
-
UNREGISTERED(HTTP 404)
-
INVALID_ARGUMENT(HTTP 400)
INVALID_ARGUMENT ileti yükündeki sorunlarda da atıldığı için, yalnızca yükün tamamen geçerli olması durumunda geçersiz bir belirteci işaret ettiğini unutmayın. Daha fazla bilgi için Hata Kodlarına bakın.
Mesaj yükünün geçerli olduğundan eminseniz ve hedeflenen belirteç için bu yanıtlardan herhangi birini alırsanız, bir daha asla geçerli olmayacağı için bu belirteç kaydınızı silebilirsiniz. Örneğin, Cloud Firestore'dan geçersiz belirteçleri silmek için aşağıdaki gibi bir işlevi dağıtabilir ve çalıştırabilirsiniz:
// Registration token comes from the client FCM SDKs const registrationToken = 'YOUR_REGISTRATION_TOKEN'; const message = { data: { // Information you want to send inside of notification }, token: registrationToken }; // Send message to device with provided registration token getMessaging().send(message) .then((response) => { // Response is a message ID string. }) .catch((error) => { // Delete token for user if error code is UNREGISTERED or INVALID_ARGUMENT. if (errorCode == "messaging/registration-token-not-registered") { // If you're running your own server, call API to delete the token for the user // Example shown below with Firestore // Get user ID from Firebase Auth or your own server Firebase.firestore.collection("fcmTokens").document(user.uid).delete() } });
Kayıt jetonunun tazeliğini sağlama
Bir jetonun yeni mi yoksa eski mi olduğunu belirlemek her zaman kolay değildir. Tüm durumları kapsamak için, belirteçlerin eski olduğunu düşündüğünüz zaman için bir eşik kabul etmelisiniz; bizim önerimiz iki aydır. İki aydan daha eski herhangi bir belirteç muhtemelen etkin olmayan bir cihaz olacaktır; aksi takdirde aktif bir cihaz jetonunu yenilerdi.
Belirteçleri düzenli olarak güncelleyin
Sunucunuzdaki tüm kayıt belirteçlerini düzenli olarak almanızı ve güncellemenizi öneririz. Bu, şunları yapmanızı gerektirir:
- Uygun API çağrısını (
token(completion):for Apple platformları veya
getToken()for Android) kullanarak geçerli belirteci almak için istemci uygulamanıza uygulama mantığı ekleyin ve ardından geçerli belirteci depolama için uygulama sunucunuza gönderin (zaman damgasıyla birlikte) ). Bu, tüm istemcileri/belirteçleri kapsayacak şekilde yapılandırılmış aylık bir iş olabilir.
- Belirtecin değişip değişmediğine bakılmaksızın, belirtecin zaman damgasını düzenli aralıklarla güncellemek için sunucu mantığı ekleyin.
Takip ettiğiniz zamanlama modeli ne olursa olsun, jetonları periyodik olarak güncellediğinizden emin olun. Her iki ayda bir güncelleme sıklığı, muhtemelen pil etkisi ile etkin olmayan kayıt belirteçlerini algılama arasında iyi bir denge kurar. Bu yenilemeyi yaparak, devre dışı kalan herhangi bir cihazın tekrar etkinleştiğinde kaydını yenilemesini de sağlamış olursunuz. Yenilemeyi haftalıktan daha sık yapmanın bir faydası yoktur.
Eski kayıt belirteçlerini kaldırın
Bir cihaza mesaj göndermeden önce, cihazın kayıt belirtecinin zaman damgasının, eskilik penceresi süreniz içinde olduğundan emin olun. Örneğin, zaman damgasının
const EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 60; ve sonra eski belirteçleri kaldırın:
exports.pruneTokens = functions.pubsub.schedule('every 24 hours').onRun(async (context) => { // Get all documents where the timestamp exceeds is not within the past month const staleTokensResult = await admin.firestore().collection('fcmTokens') .where("timestamp", "<", Date.now() - EXPIRATION_TIME) .get(); // Delete devices with stale tokens staleTokensResult.forEach(function(doc) { doc.ref.delete(); }); });
Eski belirteçlerin konulardaki aboneliğini iptal edin
Eski kayıt belirteçlerini kaldırmak için konu aboneliklerini yönetmek başka bir husustur. İki adımı içerir:
- Uygulamanız ayda bir kez ve/veya kayıt jetonu değiştiğinde konulara yeniden abone olmalıdır. Bu, bir uygulama tekrar aktif hale geldiğinde aboneliklerin otomatik olarak yeniden göründüğü, kendi kendini iyileştiren bir çözüm oluşturur.
- Bir uygulama örneği 2 ay boyunca (veya kendi bayatlık pencereniz) boşta kalırsa, belirteç/konu eşlemesini FCM arka ucundan silmek için Firebase Admin SDK'yı kullanarak konulardaki abonelikten çıkmalısınız.
Bu iki adımın avantajı, yayılacak daha az eski belirteç olduğundan, yayma işlemlerinizin daha hızlı gerçekleşmesi ve eski uygulama bulut sunucularınızın yeniden aktif olduklarında otomatik olarak yeniden abone olmalarıdır.
Teslim başarısını ölçme
Genel olarak, aktif olarak kullanılan uygulama örneklerinden gözlemlenen veya yakalanan eylemlere dayalı mesajları hedeflemenizi öneririz. Bu, özellikle çok sayıda abonesi olan konulara düzenli olarak mesaj gönderiyorsanız önemlidir; bu abonelerin bir kısmı fiilen aktif değilse, teslimat istatistikleriniz üzerindeki etkisi zaman içinde önemli olabilir.
İletileri bir simgeye hedeflemeden önce şunları göz önünde bulundurun:
- Google Analytics, BigQuery'de toplanan veriler veya diğer izleme sinyalleri, belirtecin etkin olduğunu gösteriyor mu?
- Önceki teslimat girişimleri belirli bir süre boyunca sürekli olarak başarısız oldu mu?
- Son iki ay içinde sunucularınızda kayıt belirteci güncellendi mi?
- Android cihazlar için FCM Data API ,
droppedDeviceInactivenedeniyle yüksek oranda mesaj teslim hatası rapor ediyor mu?
Teslim hakkında daha fazla bilgi için bkz. İleti teslimini anlama .