Jeśli do tworzenia żądań wysyłania używasz interfejsów API FCM, możesz zauważyć, że z czasem marnujesz zasoby, wysyłając wiadomości do nieaktywnych urządzeń z nieaktualnymi tokenami rejestracji. Może to mieć wpływ na dane dotyczące dostarczania wiadomości raportowane w konsoli Firebase lub dane eksportowane do BigQuery, które będą wyglądać jak znaczny (ale nieprawidłowy) spadek współczynników dostarczania. Ten Omawiamy sposoby, jakie możesz podjąć, aby zadbać o skuteczny przekaz reklamowy 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 połączono z FCM od ponad miesiąca. Z czasem staje się coraz mniejsza i mniej prawdopodobne, że urządzenie nigdy nie połączy się z siecią FCM. Wiadomości wysyłane i rozpowszechniane w ramach tych tokenów są mało prawdopodobne.
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 osiągną 270 dni nieaktywności, FCM uzna je za nieaktualne tokeny. Gdy token wygaśnie, FCM oznacza go jako nieprawidłowy i odrzuca wysyłane do niego wiadomości. Jednak w rzadkich przypadkach, gdy urządzenie ponownie nawiąże połączenie i otworzy aplikację, FCM wygeneruje nowy token.
Podstawowe sprawdzone metody
W przypadku każdej aplikacji, która korzysta z interfejsów API FCM do tworzenia żądań wysyłania w sposób programowy, należy przestrzegać kilku podstawowych zasad. Najważniejsze, to:
- Odbieraj tokeny rejestracji od sprzedawcy FCM i przechowuj je w 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.
- Utrzymywanie aktualności tokenów i usuwanie nieaktualnych tokenów. Oprócz usuwania tokenów, które FCM nie uważa już za ważne, warto też zwracać uwagę na inne oznaki tego, że tokeny stały się nieaktualne, i usuwać je w sposób zapobiegawczy. Z tego przewodnika dowiesz się, jak to zrobić.
Pobieranie i przechowywanie tokenów rejestracji
Przy pierwszym uruchomieniu aplikacji pakiet SDK FCM generuje rejestrację 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 FCM pakiety SDK.
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 odinstaluje lub ponownie zainstaluje aplikację.
- Użytkownik czyści dane aplikacji
- Aplikacja stanie się ponownie aktywna, gdy wygaśnie FCM token
Przykład: przechowywanie tokenów i danych o czasie w pliku Cloud Firestore
Możesz na przykład użyć metody Cloud Firestore, aby przechowywać tokeny w kolekcji
pod tytułem fcmTokens
. Każdy identyfikator dokumentu w kolekcji odpowiada
i zawiera identyfikator użytkownika, w którym zapisany jest 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)
}
Pobierany token jest przechowywany w Cloud Firestore przez wywołanie funkcji 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()
}
}
Utrzymywanie tokenów w stanie aktualności i usuwanie nieaktualnych tokenów
Ustalenie, czy token jest aktualny czy nie, nie zawsze jest łatwe. Aby uwzględnić wszystkie przypadki, należy określić próg, po przekroczeniu którego tokeny są uważane za stałe. Domyślnie FCM uznaje token za nieaktualny, jeśli instancja aplikacji nie była połączona przez miesiąc. Token starszy niż miesiąc prawdopodobnie pochodzi z nieaktywnego urządzenia. Aktywne urządzenie odświeża swój token.
W zależności od przypadku użycia miesiąc może być za krótki lub za długi, dlatego to od Ciebie zależy, jakie kryteria będą dla Ciebie odpowiednie.
Wykrywanie nieprawidłowych odpowiedzi z tokenem z backendu FCM
Pamiętaj, aby wykryć nieprawidłowe odpowiedzi tokena z FCM i odpowiedzieć 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 HTTP w wersji 1 te komunikaty o błędzie mogą wskazywać, że żądanie wysyłania było kierowane do nieprawidłowych lub nieważnych tokenów:
UNREGISTERED
(HTTP 404)INVALID_ARGUMENT
(HTTP 400)
Jeśli masz pewność, że ładunek wiadomości jest prawidłowy, i otrzymasz jedną z tych odpowiedzi na token kierowany, możesz bezpiecznie usunąć rekord tego tokena, ponieważ nigdy więcej nie będzie on prawidłowy. Aby na przykład usunąć nieprawidłowe tokeny z Cloud Firestore, możesz wdrożyć i uruchomić funkcję o takim kształcie:
// 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.
Regularne aktualizowanie tokenów
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. - Dodaj logikę serwera, aby co jakiś czas aktualizować sygnaturę czasową tokena, 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, jaki schemat czasowy stosujesz, pamiętaj o okresowej aktualizacji tokenów. An częstotliwość aktualizacji raz na miesiąc zapewnia dobrą 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. Odświeżanie częściej niż raz w tygodniu nie przynosi żadnych korzyści.
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. Możesz na przykład zaimplementować Cloud Functions for Firebase, aby codziennie sprawdzać, czy sygnatura czasowa mieści się w określonym okresie nieaktualności, np. const
EXPIRATION_TIME = 1000 * 60 * 60 * 24 * 30;
, a następnie usuwać 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 nieaktualnych tokenów z tematów,
Jeśli korzystasz z tematów, możesz też zarejestrować nieaktualne tokeny z tematów, do których są one subskrybowane. Aby to zrobić, wykonaj te 2 kroki:
- Aplikacja powinna ponownie subskrybować tematy raz w miesiącu i za każdym razem, gdy zmieni się token rejestracji. Jest to samonaprawne rozwiązanie, w którym subskrypcje pojawiają się automatycznie, gdy aplikacja ponownie stanie się aktywna.
- Jeśli instancja aplikacji jest nieaktywna przez miesiąc (lub w okresie, który określasz jako nieaktywny), powinnaś/powinieneś anulować subskrypcję tematów za pomocą pakietu Firebase Admin SDK, aby usunąć z poziomu backendu FCM mapowanie tokenu na temat.
Dzięki tym 2 krokom rozgałęzienia będą się pojawiać szybciej, ponieważ jest mniej nieaktualnych tokenów, do których można się rozgałęzić, a nieaktualne instancje aplikacji automatycznie ponownie się subskrybują, gdy znów będą aktywne.
Zmierz skuteczność wyświetlania
Aby uzyskać jak najbardziej dokładny obraz dostarczania wiadomości, najlepiej wysyłać wiadomości tylko do aktywnie używanych 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 utworzysz kierowanie wiadomości na token, weź pod uwagę te kwestie:
- Czy Google Analytics, dane zebrane w BigQuery lub inne sygnały śledzenia wskazuje, że token jest aktywny.
- Czy poprzednie próby dostarczenia wiadomości przez dłuższy czas były konsekwentnie nieudane?
- Czy token rejestracji został zaktualizowany na Twoich serwerach w zeszłym miesiącu?
- Czy w przypadku urządzeń z Androidem interfejs API danych FCM zgłasza wysoki odsetek niepowodzeń przy dostarczaniu wiadomości z powodu
droppedDeviceInactive
?
Więcej informacji o dostawie: Informacje o dostarczaniu wiadomości