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, iletileri etkin olmayan hesaplara göndererek kaynaklarınızı boşa harcadığınızı eski kayıt jetonlarına sahip cihazlardır. Bu durum, iletiyi Firebase konsolunda raporlanan teslimat verileri veya BigQuery'ye aktarılan veriler teslim oranlarında önemli (ama gerçekte geçerli olmayan) bir düşüş olarak görülüyor. Bu rehberinde, etkili bir mesaj stratejisi oluşturmaya yardımcı olmak 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'ye bir aydan uzun süredir bağlı değil. Zaman geçtikçe daha az ve cihazın FCM'ye tekrar bağlanma olasılığı azalır. Mesaj gönder Bu eski jetonlar için göndermelerin ve konu dağılmalarının, teslim edilir.

Jetonların eskimesinin 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 kullanım süresi dolmuş jetonlar. Bir jetonun süresi dolduğunda, FCM jetonu geçersiz olarak işaretler ve içerir. Ancak FCM, uygulama için yeni bir jeton yayınlar. Örneğin, cihaz tekrar bağlanır ve uygulama açılır.

Temel en iyi uygulamalar

Gönderme isteklerini programatik olarak oluşturmak için FCM API'leri. En iyisi şunlardır:

  • FCM'den kayıt jetonlarını alın ve şurada depolayın: sunucu. Sunucu için önemli bir rol, her bir istemcinin jeton ve etkin jetonların güncel bir listesini tutun. Önerilerimiz: kodunuzda ve sunucularınızda jeton zaman damgası uygulama ve bu zaman damgasını düzenli aralıklarla kontrol edin.
  • Jeton güncelliğini koruyun ve eski jetonları kaldırın. Ek olarak FCM'nin artık geçerli kabul etmediği jetonları kaldırarak, jetonların eskidiğine dair diğer işaretleri izlemek ve bunları kaldırmak için önlem almalısınız. Bu kılavuzda, bunu başarmak için kullanabileceğiniz bazı seçenekler açıklanmaktadır.

Kayıt jetonlarını alma ve depolama

Uygulamanız ilk kez başlatıldığında FCM SDK'sı bir kayıt oluşturur jeton olacaktır. Bu API'den hedeflenen gönderme istekleri veya hedefleme için konu aboneliklerine ekleme konu.

Uygulamanızın ilk başlatma sırasında bu jetonu almasını ve uygulama sunucunuza gönderebilirsiniz. Bu zaman damgası kodu ve sunucularınız tarafından uygulanır, çünkü bu veriler FCM SDK'ları

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 siler
  • FCM, mevcut ödeme süresini sona erdikten sonra uygulama tekrar etkin hale gelir. jeton

Örnek: Cloud Firestore'da depolama jetonları ve zaman damgaları

Örneğin, jetonları bir koleksiyonda depolamak için Cloud Firestore'u kullanabilirsiniz fcmTokens olarak adlandırıldı. Koleksiyondaki her belge kimliği şuna karşılık gelir: bir kullanıcı kimliği mevcutsa (belge, geçerli kayıt jetonunu ve son güncelleme zaman damgası. set işlevini aşağıdaki 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)
    }

Alınan jetonlar, aşağıdaki çağrılar aracılığıyla Cloud Firestore'da depolanır: sendTokenToServer:

    /**
     * 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. her şeyi kapsıyor. 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 etme

FCM'nin geçersiz jeton yanıtlarını tespit edip şu tarihe kadar yanıtladığınızdan emin olun: geçersiz olduğu bilinen tüm kayıt jetonlarını sisteminizden silme veya geçerlilik süresi dolmuş olabilir. HTTP v1 API ile bu hata mesajları, gönderme isteğiniz geçersiz veya süresi dolmuş jetonları hedefliyor:

  • 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 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 süresi dolduysa geçersiz jeton yanıtı döndürür müşteri kayıt işlemini açıkça iptal ettiyse. Daha fazla eskileri kendi tanımlarınıza göre doğru bir şekilde takip ederseniz eski kayıt jetonlarını proaktif olarak kaldırabilir.

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 şunları yapmanız gerekir:

  • Mevcut jetonu almak için istemci uygulamanıza uygulama mantığını ekleyin: uygun API çağrısı (ör. token(completion): veya mobil cihazlar için getToken() (Android için) ve ardından geçerli jetonu depolama alanı için uygulama sunucunuza gönderin. (zaman damgasıyla birlikte). Bu, tüm aylık dönemleri kapsayacak şekilde yapılandırılmış aylık bir iş olabilir veya jetonlardan oluşur.
  • 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.

Jetonları güncellemek için Android mantığına örnek olarak WorkManager, bkz. Cloud Messaging Jetonlarını Yönetme bulabilirsiniz.

Hangi zamanlama kalıbını takip ederseniz edin, jetonları düzenli aralıklarla 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. Yenileme işlemini daha sık gerçekleştirmenin bir faydası yoktur daha yüksek.

Eski kayıt jetonlarını kaldırma

Bir cihaza mesaj göndermeden önce cihazın zaman damgasının kayıt jetonunuz eskilik zaman aralığınız içinde olmalıdır. Örneğin, Cloud Functions for Firebase'i kullanarak günlük kontroller yaparak zaman damgası, const EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 30; gibi tanımlanmış bir eskilik dönemi dönemi içinde bulunuyorsa ve ardından eski jetonları 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(); });
});

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 her ay konulara yeniden abone olmalıdır. hakkında daha fazla bilgi edinin. 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 eskiyen zaman aralığınız) boşta kalırsa veya Firebase Yönetici SDK'sını Jetonu FCM arka ucundan konu eşlemeye silme.

Bu iki adımın avantajı, yayılmalarınızın daha hızlı gerçekleşmesidir. Çünkü Devre dışı bırakılacak eski jeton sayısı daha az olur ve eski uygulama örnekleriniz etkin olduklarında otomatik olarak yeniden abone olurlar.

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ı bir jetona 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 belirli bir süre boyunca tutarlı olarak başarısız oldu mu?
  • Kayıt jetonu geçen ay sunucularınızda 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.