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

Gönderme isteklerini programatik olarak oluşturmak için FCM API'lerini kullanıyorsanız zaman içinde eski kayıt jetonlarına sahip etkin olmayan cihazlara mesaj göndererek kaynak israf ettiğinizi fark edebilirsiniz. Bu durum, Firebase konsolunda raporlanan mesaj yayını verilerini veya BigQuery'ye aktarılan verileri etkileyebilir. Bu durumda, yayın oranlarında önemli (ancak aslında geçerli olmayan) bir düşüş görülebilir. Bu kılavuzunda verilen mesajlarla etkili bir iletişim sağlamak için alabileceğiniz hedefleme ve geçerli yayınlama raporlamasında kullanılması gerekir.

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

Eski kayıt jetonları, aşağıdaki özelliklere sahip etkin olmayan cihazlarla ilişkilendirilmiş jetonlardır: FCM ile bir aydan uzun süredir bağlı değil. Zaman geçtikçe daha az ve cihazın FCM ağına tekrar bağlanma olasılığı düşer. Mesaj gönder bu eski jetonların gönderme ve konu ayırmalarının teslim edilir.

Bir jetonun eski olmasının birkaç nedeni vardır. Örneğin, ilgili cihazın ilişkili olduğu jeton kaybolabilir, imha edilebilir, depolama alanına konabilir ve unuttum.

Eski jetonlar 270 günlük etkin olmama durumuna ulaştığında FCM bunları dikkate alır süresi dolmuş jetonlar Bir jetonun süresi dolduktan sonra FCM, jetonu geçersiz olarak işaretler ve jetona gönderilen mesajları reddeder. Ancak FCM, cihazın tekrar bağlanıp uygulamanın açılması gibi nadir durumlarda uygulama örneği için yeni bir jeton yayınlar.

Temel en iyi uygulamalar

Programatik olarak istek göndermek için FCM API'lerini kullanan tüm uygulamalarda uygulamanız gereken bazı temel uygulamalar vardır. En iyi uygulamalardan bazıları şunlardır:

  • FCM sitesinden kayıt jetonlarını alın ve sunucu. Sunucunun önemli bir rolü, her istemcinin jetonunu takip etmek ve etkin jetonların güncel bir listesini tutmaktır. Kodunuza ve sunucularınıza jeton zaman damgası uygulamanızı ve bu zaman damgasını düzenli aralıklarla güncellemenizi önemle tavsiye ederiz.
  • Jeton güncelliğini koruyun ve eski jetonları kaldırın. Ek olarak FCM tarafından artık geçerli kabul edilmeyen jetonlar kaldırılırsa jetonların eskidiğine dair diğer işaretleri izlemek ve bunları kaldırmak için önlem almalısınız. Bu kılavuzda, bu hedefe ulaşmak için kullanabileceğiniz seçeneklerden bazıları ele alınmaktadır.

Kayıt jetonlarını alma ve saklama

Uygulamanız ilk kez başlatıldığında FCM SDK'sı bir kayıt oluşturur jeton olacaktır. Bu, API'den gelen hedeflenmiş gönderme isteklerine eklemeniz veya konuları hedeflemek için konu aboneliklerine eklemeniz gereken jetondur.

Uygulamanızın ilk başlatma sırasında bu jetonu almasını ve uygulama sunucunuza gönderebilirsiniz. Bu zaman damgası, FCM SDK'ları tarafından size sağlanmadığından kodunuz ve sunucularınız tarafından uygulanmalıdır.

Ayrıca, jetonu sunucuya kaydetmek ve zaman damgasını güncellemek de önemlidir. her değişiklik yapıldığında, örneğin şu durumlarda:

  • Uygulama yeni bir cihaza geri yüklenir.
  • Kullanıcı uygulamayı kaldırır veya yeniden yükler
  • Kullanıcı uygulama verilerini temizler
  • FCM mevcut jetonunun süresinin dolmasından sonra uygulama tekrar etkin hale gelir

Örnek: store tokens and timestamps in Cloud Firestore

Örneğin, jetonları fcmTokens adlı bir koleksiyonda depolamak için Cloud Firestore kullanabilirsiniz. Koleksiyondaki her belge kimliği bir kullanıcı kimliğine karşılık gelir ve belge, mevcut kayıt jetonunu ve son güncellenme zaman damgasını depolar. set işlevini bu Kotlin örneğinde gösterildiği gibi 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)
    }

Her jeton alındığında sendTokenToServer çağrılarak Cloud Firestore içinde saklanı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()
            }
        }

Jeton güncelliğini koruyun ve eski jetonları kaldırın

Bir jetonun yeni mi yoksa eski mi olduğunu belirlemek her zaman kolay değildir. Alıcı: tüm durumları kapsaması halinde, jetonları değerlendirmek için bir eşik belirlemeniz gerekir. eskidir. Varsayılan olarak FCM, uygulaması olan bir jetonu eski olarak kabul eder örneği bir aydır bağlanmadı. Bir aydan eski olan jetonlar etkin olmayan bir cihaz olmak; etkin cihaz, normal bir şekilde jeton.

Kullanım alanınıza bağlı olarak bir ay çok kısa veya çok uzun olabilir. amacıyla sizin için faydalı olabilir.

FCM arka ucundan geçersiz jeton yanıtlarını tespit et

FCM tarafından gönderilen geçersiz jeton yanıtlarını tespit edip şu tarihe kadar yanıtlayın: geçersiz olduğu bilinen tüm kayıt jetonlarını sisteminizden silme veya geçerlilik süresi dolmuş olabilir. HTTP v1 API'de aşağıdaki 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 bu yanıtları hedeflediyseniz bu kaydı silebilirsiniz. . Örneğin, geçersiz jetonları silmek için Cloud Firestore öğesinden sonra aşağıdaki gibi bir işlevi dağıtıp ç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 jetonun geçerlilik süresi 270 gün sonra sona ererse veya bir istemci açıkça kaydını iptal ederse geçersiz jeton yanıtı döndürür. Eskiliği kendi tanımlarınıza göre daha doğru bir şekilde izlemeniz gerekiyorsa proaktif olarak eski kayıt jetonlarını kaldırabilirsiniz.

Jetonları düzenli olarak güncelleme

Tüm kayıt jetonlarını düzenli aralıklarla almanızı ve güncellemenizi öneririz. . Bunun için:

  • İstemci uygulamanıza, uygun API çağrısını (ör. Apple platformları için token(completion): veya Android için getToken()) kullanarak mevcut jetonu almak ve ardından mevcut jetonu depolanması için uygulama sunucunuza (zaman damgasıyla) göndermek üzere uygulama mantığı ekleyin. Bu, tüm istemcileri veya jetonları kapsayacak şekilde yapılandırılmış aylık bir iş olabilir.
  • Jetonun zaman damgasını düzenli aralıklarla güncellemek için sunucu mantığı ekleyin. jetonun değişip değişmediğinden bağımsız olarak.

WorkManager'ı kullanarak jetonları güncellemeye yönelik Android mantığı örneği için Firebase blogundaki Cloud Messaging Jetonlarını Yönetme başlıklı makaleyi inceleyin.

Hangi zamanlama düzenini izlerseniz izleyin jetonları düzenli olarak güncellediğinizden emin olun. Ayda bir kez güncelleme sıklığı, pil etkisi arasında iyi bir denge sağlar ve etkin olmayan kayıt jetonlarını tespit ederiz. Bu yenilemeyle, çalışmaya devam etmesi durumunda, aktif olmayan cihazların kaydının yenilenmesini tekrar etkin hale gelir. Yenilemeyi haftalıktan daha sık yapmanın bir faydası yoktur.

Eski kayıt jetonlarını kaldırma

Bir cihaza mesaj göndermeden önce, cihazın kayıt jetonunun zaman damgasının eskilik aralığı içinde olduğundan emin olun. Örneğin, zaman damgasının const EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 30; gibi tanımlanmış bir eskilik aralığı içinde olduğundan emin olmak için günlük kontrol çalıştırmak üzere Cloud Functions for Firebase'ü uygulayabilir ve ardından eski jetonları kaldırabilirsiniz:

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(); });
});

Konuların eski jeton e-posta listesinden çıkma

Konuları kullanıyorsanız konulara ait eski jetonların kaydını iptal etmek de isteyebilirsiniz YouTube'u keşfedin. Bu işlem iki adımdan oluşur:

  1. Uygulamanız, konulara ayda bir kez ve kayıt jetonu değiştiğinde yeniden abone olmalıdır. Bu da kendi kendini iyileştiren bir çözüm oluşturur. Bir uygulama tekrar etkinleştiğinde abonelikler otomatik olarak yeniden görünür.
  2. Bir uygulama örneği bir ay boyunca (veya kendi eskilik aralığınız) etkin değilse FCM arka ucundan jetonla konu eşlemesini silmek için Firebase Admin SDK'sını kullanarak uygulamanın konu aboneliğini iptal etmeniz gerekir.

Bu iki adımın avantajı, dağıtılacak eski jeton sayısı daha az olduğu için dağıtımlarınızın daha hızlı gerçekleşmesi ve eski uygulama örnekleriniz tekrar etkinleştirildiğinde otomatik olarak yeniden abone olmasıdır.

Yayının başarısını ölçme

İleti tesliminin en doğru resmini elde etmek için yalnızca etkin olarak kullanılan uygulama örneklerine göndermemiz gerekir. Bu, özellikle de Çok sayıda abonesi olan konulara düzenli olarak mesaj gönderme; eğer Bu abonelerin bir kısmının gerçekten aktif olmadığını gösterir. Bu, abonelerinizin zamanla önemli hale gelebilir.

Mesajları jetonla hedeflemeden önce şunları göz önünde bulundurun:

  • Google Analytics, BigQuery'de yakalanan veriler veya diğer izleme sinyalleri jetonun etkin olduğunu belirtir mi?
  • Önceki teslimat denemeleri bir süre boyunca sürekli olarak başarısız oldu mu?
  • Kayıt jetonu, sunucularınızda son bir ay içinde güncellendi mi?
  • Android cihazlarda FCM Data API nedeniyle yüksek oranda ileti teslimi hatası droppedDeviceInactive?

Yayınlama hakkında daha fazla bilgi için bkz. Mesaj teslimini anlama.