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 şunları yapabilirsiniz: 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 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 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ün boyunca etkin olmama durumuna ulaştığında FCM bunları dikkate alır 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

Google Etiket Yöneticisi'ni kullanan tüm uygulamalarda uygulamanız gereken bazı temel Gönderme isteklerini programatik olarak oluşturmak için FCM API'leri kullanın. En iyisi şunlardır:

  • FCM sitesinden kayıt jetonlarını alın ve 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 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, 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.

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 adlı çocuğun mevcut aboneliği bittikten sonra uygulama tekrar etkin hale gelir jeton

Örnek: Cloud Firestore konumundaki mağaza jetonları ve zaman damgaları

Örneğin, jetonları bir koleksiyonda depolamak için Cloud Firestore kullanabilirsiniz adı fcmTokens. 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)
    }

Bir jeton alındığında, çağrı özelliği kullanılarak Cloud Firestore içinde 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. 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 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 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 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ığı 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, emin olmak için günlük kontrol yürütmek üzere Cloud Functions for Firebase zaman damgası, const EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 30; gibi tanımlanmış bir eskilik dönemi süresi 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ı FCM arka ucundan konu eşlemeye ait jetonu silin.

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.