Sprawdzone metody zarządzania tokenami rejestracji w FCM

Jeśli używasz interfejsów API FCM do automatycznego tworzenia żądań wysyłania, możesz: że z czasem marnujesz zasoby, wysyłając wiadomości do nieaktywnych urządzeń z nieaktualnymi tokenami rejestracji. Ta sytuacja może mieć wpływ na wiadomość dane o dostarczaniu raportowane w konsoli Firebase lub dane wyeksportowane do BigQuery, co w rzeczywistości wiąże się ze znacznym (ale w rzeczywistości) spadkiem liczby wyświetleń. Ten Omawiamy sposoby, jakie możesz podjąć, aby zadbać o sprawny przekaz i prawidłowe raportowanie wyświetlania reklam.

nieaktualne i wygasłe tokeny rejestracji,

Nieaktualne tokeny rejestracji to tokeny powiązane z nieaktywnymi urządzeniami, które mają nie były połączone z FCM od ponad miesiąca. Z czasem staje się coraz mniejsza i zmniejsza prawdopodobieństwo ponownego połączenia się z FCM. Wiadomość i rozpowszechnianie tematów w przypadku tych nieaktualnych tokenów jest mało prawdopodobne, aby ich liczba dostarczone.

Token może stać się nieaktualny z kilku powodów. Na przykład urządzenie z którym powiązany jest token może zostać zgubiony, zniszczony lub umieszczony w pamięci zapomniane.

Gdy nieaktualne tokeny będą nieaktywne przez 270 dni, FCM uwzględni je wygasłych tokenów. Gdy token wygaśnie, FCM oznacza go jako nieprawidłowy odrzuca wysyłane do niego wiadomości. FCM generuje jednak nowy token dla aplikacji w rzadkim przypadku, gdy urządzenie ponownie połączy się z siecią i aplikacja zostanie otwarta.

Podstawowe sprawdzone metody

Jest kilka podstawowych zasad, których należy przestrzegać w każdej aplikacji, która używa Interfejsy API FCM do automatycznego tworzenia żądań wysyłania. Najważniejsze, to:

  • Odbieraj tokeny rejestracji z FCM i przechowuj je na swoim serwera. Ważną rolą serwera jest śledzenie token i aktualizuj listę aktywnych tokenów. Zdecydowanie zalecamy implementacji sygnatury czasowej tokena w kodzie i na serwerach, w regularnych odstępach czasu.
  • Dbaj o aktualność tokenów i usuwaj nieaktualne tokeny. Oprócz i usuwając tokeny, które FCM już nie uznał za prawidłowe, możesz monitorowania innych oznak tego, że tokeny stały się nieaktualne, i je usuwać. proaktywnie. Z tego przewodnika dowiesz się, jak to zrobić.

Pobieranie i przechowywanie tokenów rejestracji

Przy pierwszym uruchomieniu aplikacji pakiet FCM SDK generuje dla instancji aplikacji klienckiej. To jest token, który musisz umieścić w kierowane żądania wysyłania z interfejsu API lub dodawanie do subskrypcji tematów na potrzeby kierowania, tematy.

Zdecydowanie zalecamy pobranie tego tokena przy pierwszym uruchomieniu i zapisaniu przez aplikację i wysyłanie do serwera aplikacji wraz z sygnaturą czasową. Sygnaturą czasową musi być implementowanych przez Twój kod i Twoje serwery, ponieważ nie jest on udostępniany przez Pakiety SDK FCM.

Ważne jest też, aby zapisać token na serwerze i zaktualizować sygnaturę czasową po każdej zmianie, na przykład gdy:

  • Aplikacja zostanie przywrócona na nowym urządzeniu
  • użytkownik odinstalowuje lub ponownie instaluje aplikację;
  • Użytkownik czyści dane aplikacji.
  • Aplikacja stanie się ponownie aktywna po wygaśnięciu dotychczasowej rejestracji w FCM token

Przykład: przechowywanie tokenów i sygnatur czasowych w Cloud Firestore

Możesz na przykład użyć Cloud Firestore, aby przechowywać tokeny w kolekcji pod tytułem fcmTokens. Każdy identyfikator dokumentu w kolekcji odpowiada identyfikatora użytkownika. W dokumencie jest zapisywany bieżący token rejestracji oraz jego identyfikator sygnatura czasowa ostatniej aktualizacji. Użyj funkcji set w sposób pokazany w tym przykładzie Kotlin:

    /**
     * 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)
    }

Przy każdym pobieraniu token jest zapisywany w Cloud Firestore przez wywołanie 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()
            }
        }

Dbaj o aktualność tokenów i usuwaj nieaktualne tokeny

Ustalenie, czy token jest aktualny czy nie, nie zawsze jest łatwe. Do dla wszystkich przypadków, należy zastosować próg przy rozważaniu użycia tokenów nieaktualny. Domyślnie FCM uważa token za nieaktualny, jeśli jego aplikacja instancja nie połączyła się od miesiąca. Każdy token starszy niż miesiąc jest prawdopodobny być nieaktywnym urządzeniem; aktywne urządzenie w innym przypadku odświeżyłoby token.

W zależności od Twojego zastosowania 1 miesiąc może być za krótki lub za długi, więc może zniknąć aby określić, jakie kryteria będą dla Ciebie najlepsze.

Wykrywanie nieprawidłowych odpowiedzi tokenów z backendu FCM

Pamiętaj, aby wykryć nieprawidłowe odpowiedzi tokena z FCM i do usunięcie z systemu wszelkich tokenów rejestracji, o których wiadomo, że są nieprawidłowe lub straciły ważność. W przypadku interfejsu API HTTP w wersji 1 te komunikaty o błędach mogą oznaczać, Twoja prośba o wysłanie treści dotyczy nieprawidłowych lub wygasłych tokenów:

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

Jeśli masz pewność, że ładunek wiadomości jest prawidłowy i otrzymasz jedną z dla danego tokena, możesz bezpiecznie usunąć swój rekord bo już nigdy nie będzie on ważny. Aby na przykład usunąć nieprawidłowe tokeny z Cloud Firestore możesz wdrożyć i uruchomić taką funkcję:

    // 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 zwraca nieprawidłową odpowiedź tokena tylko wtedy, gdy token wygasł po upływie 270 dni lub w przypadku wyraźnego wyrejestrowania się klienta. Jeśli potrzebujesz więcej dokładne śledzenie aktualizacji zgodnie z własnymi definicjami, usuwać nieaktualne tokeny rejestracji.

Regularnie aktualizuj tokeny

Zalecamy okresowe pobieranie i aktualizowanie wszystkich tokenów rejestracji na swoim serwerze. Wymagania:

  • Dodaj w aplikacji klienckiej funkcję logiczną, aby pobierać bieżący token za pomocą odpowiednie wywołanie interfejsu API (takie jak token(completion): na platformach Apple; getToken() w przypadku Androida), a następnie wyślij bieżący token do serwera aplikacji, aby ją zapisać. (z sygnaturą czasową). Może to być miesięczne zadanie skonfigurowane tak, aby obejmowało wszystkie klientów i tokenów.
  • dodawaj logikę serwera, aby aktualizować sygnaturę czasową tokena w regularnych odstępach czasu. niezależnie od tego, czy token się zmienił.

Przykład logiki Androida do aktualizowania tokenów za pomocą WorkManager zobacz Zarządzanie tokenami usługi Cloud Messaging o tym, jak działa projekt Firebase.

Niezależnie od tego, jakiego wzorca przestrzegasz, pamiętaj, aby co jakiś czas aktualizować tokeny. An częstotliwość aktualizacji raz w miesiącu zachowuje równowagę między wpływem na baterię oraz wykrywanie nieaktywnych tokenów rejestracji. Odświeżając stronę, Upewnij się, że każde nieaktywne urządzenie odświeża rejestrację po stanie się ponownie aktywny. Częstsze odświeżanie nie przynosi żadnych korzyści niż tygodniowo.

Usuń nieaktualne tokeny rejestracji

Przed wysłaniem wiadomości na urządzenie upewnij się, że sygnatura czasowa token rejestracji znajduje się w okresie braku aktualizacji. Na przykład: mogliby wdrożyć Cloud Functions dla Firebase, aby codziennie sprawdzać, czy sygnatura czasowa jest w określonym okresie braku aktualizacji, np. const EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 30;, a potem usuń nieaktualne tokeny:

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

Anulowanie subskrypcji nieaktualnych tokenów z tematów

Jeśli używasz tematów, możesz też wyrejestrować z nich nieaktualne tokeny. które subskrybują. Ten proces składa się z 2 etapów:

  1. Aplikacja powinna ponownie subskrybować tematy raz w miesiącu i za każdym razem, gdy token rejestracji. Jest to samonaprawne rozwiązanie, w którym subskrypcje pojawiają się automatycznie, gdy aplikacja ponownie stanie się aktywna.
  2. Jeśli instancja aplikacji jest nieaktywna przez miesiąc (lub masz własny okres braku aktualizacji), powinien anulować subskrypcję tematów za pomocą Firebase Admin SDK do usuń token z mapowaniem tematów z backendu FCM.

Zaletą tych 2 kroków jest to, że zwielokrotnienia następuje szybciej, będzie mniej nieaktualnych tokenów, na które możesz przesłać nieaktualne tokeny, a nieaktualne instancje aplikacji automatycznie wznowią subskrypcję, gdy te materiały staną się znów aktywne.

Zmierz skuteczność wyświetlania

Aby uzyskać najdokładniejszy obraz dostarczania wiadomości, najlepiej wysyłać tylko do aktywnych instancji aplikacji. Jest to szczególnie ważne, jeśli regularnie wysyłać wiadomości na tematy z dużą liczbą subskrybentów; jeśli część z nich jest nieaktywna, co ma wpływ na liczbę wyświetleń, statystyki mogą z czasem mieć znaczenie.

Zanim skierujesz wiadomości na token, weź pod uwagę te informacje:

  • Czy Google Analytics, dane zebrane w BigQuery lub inne sygnały śledzenia wskazuje, że token jest aktywny.
  • Czy wcześniejsze próby dostarczenia wiadomości w danym okresie nie udawały się regularnie?
  • Czy token rejestracji został zaktualizowany na Twoich serwerach w zeszłym miesiącu?
  • Na urządzeniach z Androidem – interfejs FCM Data API. zgłaszają wysoki odsetek niepowodzeń dostarczenia wiadomości z powodu droppedDeviceInactive?

Więcej informacji o dostawie: Informacje na temat dostarczania wiadomości