FCM kayıt jetonu yönetimi için en iyi uygulamalar

Gönderme isteklerini programlı olarak oluşturmak için FCM API'lerini kullanırsanız, zamanla eski kayıt belirteçlerine sahip etkin olmayan cihazlara ileti göndererek kaynakları boşa harcadığınızı fark edebilirsiniz. Bu durum, Firebase konsolunda raporlanan mesaj teslim verilerini veya BigQuery'ye aktarılan verileri etkileyerek teslim oranlarında dramatik (ancak aslında 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 anlatılmaktadır.

Eski ve süresi dolmuş kayıt jetonları

Eski kayıt belirteçleri, bir aydan uzun süredir FCM'ye bağlanmamış etkin olmayan cihazlarla ilişkili belirteçlerdir. Zaman geçtikçe cihazın FCM'ye tekrar bağlanma olasılığı giderek azalıyor. Bu eski belirteçlere ilişkin mesaj gönderimleri ve konu yayınlarının teslim edilmesi pek olası değildir.

Bir jetonun bayat hale gelmesinin birkaç nedeni vardır. Örneğin tokenın ilişkili olduğu cihaz kaybolabilir, imha edilebilir veya depoya konularak unutulabilir.

Eski tokenlar 270 günlük hareketsizlik süresine ulaştığında, FCM bunları süresi dolmuş tokenlar olarak değerlendirecektir. Bir jetonun süresi dolduğunda, FCM onu geçersiz olarak işaretler ve ona yapılan gönderimleri reddeder. Ancak FCM, cihazın yeniden bağlandığı ve uygulamanın açıldığı nadir durumlarda uygulama örneği için yeni bir belirteç yayınlar.

Temel en iyi uygulamalar

Gönderme isteklerini program aracılığıyla 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:

  • FCM'den kayıt jetonlarını alın ve bunları sunucunuzda saklayın. Sunucunun önemli bir rolü, her müşterinin jetonunu takip etmek ve aktif jetonların güncellenmiş bir listesini tutmaktır. Kodunuzda ve sunucularınızda bir belirteç zaman damgası uygulamanızı ve bu zaman damgasını düzenli aralıklarla güncellemenizi önemle tavsiye ederiz.
  • Token tazeliğini koruyun ve eski tokenları kaldırın. FCM'nin artık geçerli saymadığı tokenleri kaldırmanın yanı sıra, tokenlerin eskidiğine dair diğer işaretleri de izlemek ve bunları proaktif bir şekilde kaldırmak isteyebilirsiniz. Bu kılavuzda bunu başarmak için kullanabileceğiniz seçeneklerden bazıları ele alınmaktadır.

Kayıt jetonlarını alın ve saklayın

Uygulamanızın ilk başlangıcında FCM SDK, istemci uygulaması örneği için bir kayıt belirteci oluşturur. Bu, API'den hedeflenen gönderme isteklerine eklemeniz veya konuları hedeflemek için konu aboneliklerine eklemeniz gereken belirteçtir.

Uygulamanızın bu jetonu ilk açılışta almasını ve bir zaman damgasıyla birlikte uygulama sunucunuza kaydetmesini önemle tavsiye ederiz . Bu zaman damgası, FCM SDK'ları tarafından size sağlanmadığından 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üklenir
  • Kullanıcı uygulamayı kaldırır veya yeniden yükler
  • Kullanıcı uygulama verilerini temizler
  • FCM'nin mevcut jetonunun süresi dolduktan sonra uygulama tekrar aktif hale gelir

Örnek: belirteçleri ve zaman damgalarını Cloud Firestore'da saklayın

Örneğin, jetonları 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 belirtecini ve onun 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 belirteç 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()
            }
        }

Token tazeliğini koruyun ve eski tokenları kaldırın

Bir tokenın yeni mi yoksa eski mi olduğunu belirlemek her zaman kolay değildir. Tüm durumları kapsayacak şekilde, tokenlerin eski olduğunu düşündüğünüz durumlar için bir eşik belirlemelisiniz. Varsayılan olarak FCM, uygulama örneği bir ay boyunca bağlanmamışsa bir belirtecin eski olduğunu kabul eder. Bir aydan eski herhangi bir tokenın etkin olmayan bir cihaz olması muhtemeldir; aksi takdirde aktif bir cihaz jetonunu yenilerdi.

Kullanım durumunuza bağlı olarak bir ay çok kısa ya da çok uzun olabilir, bu nedenle işinize yarayacak kriterleri belirlemek size kalmıştır.

FCM arka ucundan geçersiz belirteç yanıtlarını algılama

FCM'den gelen geçersiz jeton yanıtlarını tespit ettiğinizden emin olun ve geçersiz olduğu veya süresinin dolduğu bilinen tüm kayıt jetonlarını sisteminizden silerek yanıt verin. HTTP v1 API'sinde bu hata mesajları, gönderme isteğinizin geçersiz veya süresi dolmuş jetonları hedeflediğini gösterebilir:

  • UNREGISTERED (HTTP 404)
  • INVALID_ARGUMENT (HTTP 400)

Mesaj yükünün geçerli olduğundan eminseniz ve hedeflenen bir belirteç için bu yanıtlardan herhangi birini alırsanız, bir daha asla geçerli olmayacağı için bu belirtecin kaydını silmeniz güvenlidir. Örneğin, geçersiz belirteçleri Cloud Firestore'dan silmek için aşağıdakine benzer 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()
        }
    });

FCM, yalnızca bir belirtecin süresinin 270 gün sonra dolması veya müşterinin açıkça kaydını iptal etmesi durumunda geçersiz bir belirteç yanıtı döndürür. Kendi tanımlarınıza göre eskiliği daha doğru bir şekilde takip etmeniz gerekiyorsa eski kayıt jetonlarını proaktif olarak kaldırabilirsiniz .

Belirteçleri düzenli olarak güncelleyin

Sunucunuzdaki tüm kayıt jetonlarını düzenli aralıklarla almanızı ve güncellemenizi öneririz. Bu şunları yapmanızı gerektirir:

  • Uygun API çağrısını (örneğin, Apple platformları için token(completion): veya Android için getToken() kullanarak geçerli belirteci almak için istemci uygulamanıza uygulama mantığını ekleyin ve ardından geçerli belirteci depolama için uygulama sunucunuza gönderin (bir zaman damgası). Bu, tüm istemcileri veya 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ığını ekleyin.

WorkManager kullanarak belirteçleri güncellemeye yönelik Android mantığı örneği için Firebase blogundaki Bulut Mesajlaşma Belirteçlerini Yönetme konusuna bakın.

Hangi zamanlama modelini izlerseniz izleyin, belirteçleri düzenli aralıklarla güncellediğinizden emin olun. Ayda bir güncelleme sıklığı, pil etkisi ile etkin olmayan kayıt jetonlarının tespiti arasında iyi bir denge sağlar. Bu yenilemeyi yaparak, pasif duruma geçen herhangi bir cihazın tekrar aktif hale geldiğinde kaydını yenilemesini de sağlamış olursunuz. Yenilemeyi haftalıktan daha sık yapmanın hiçbir faydası yoktur.

Eski kayıt jetonlarını kaldırın

Bir cihaza mesaj göndermeden önce, cihazın kayıt jetonunun zaman damgasının eskilik süresi içinde olduğundan emin olun. Örneğin, zaman damgasının const EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 30; ve ardından 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(); });
});

Konulardaki eski belirteçlerin aboneliğini iptal edin

Konuları kullanırsanız abone oldukları konulardaki eski belirteçlerin kaydını da silmek isteyebilirsiniz. Bu iki adımı içerir:

  1. Uygulamanız ayda bir kez ve 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 onaran bir çözüm oluşturur.
  2. Bir uygulama örneği bir ay boyunca boşta kalırsa (veya kendi eskime pencereniz), FCM arka ucundan token-konu eşlemesini silmek için Firebase Admin SDK'yı kullanarak konunun aboneliğinden çıkmalısınız.

Bu iki adımın yararı, dağıtılacak eski jetonların sayısı azaldığından dağıtımlarınızın daha hızlı gerçekleşmesi ve eski uygulama örneklerinizin tekrar aktif olduklarında otomatik olarak yeniden abone olmalarıdır.

Teslimat başarısını ölçün

Mesaj tesliminin en doğru resmini elde etmek için mesajları yalnızca aktif olarak kullanılan uygulama örneklerine göndermek en iyisidir. Bu özellikle çok sayıda abonesi olan konulara düzenli olarak mesaj gönderiyorsanız önemlidir; Bu abonelerin bir kısmı gerçekten etkin değilse, bunun dağıtım istatistikleriniz üzerindeki etkisi zaman içinde önemli olabilir.

İletileri bir belirtece hedeflemeden önce şunları göz önünde bulundurun:

  • Google Analytics, BigQuery'de toplanan veriler veya diğer izleme sinyalleri jetonun etkin olduğunu gösteriyor mu?
  • Önceki teslimat girişimleri belirli bir süre boyunca sürekli olarak başarısız oldu mu?
  • Geçtiğimiz ay sunucularınızda kayıt jetonu güncellendi mi?
  • Android cihazlar için FCM Veri API'si , droppedDeviceInactive nedeniyle yüksek oranda mesaj teslimi hatası bildiriyor mu?

Teslim hakkında daha fazla bilgi için bkz. İleti teslimini anlama .