Я хочу управлять подпиской на темы из клиента (приложение для Android). В настоящее время я делаю это в Activity onCreate (). Мне интересно, правильный ли способ - подписаться / отказаться от подписки на InstanceIdService :: onTokenRefresh () или в любое удобное время (при нажатии кнопки и т. Д.).
Короче говоря, если я управляю подпиской на тему на стороне клиента (без сервера), мне все равно придется возиться с InstanceIdService?
Разные источники документации по-разному относятся к подписке на тему Firebase Cloud Messaging (FCM). Некоторые упоминают InstanceIdService, некоторые нет. Они здесь:
- Руководство Firebase по Отправка тематических сообщений с помощью Firebase Console
Он не упоминает InstanceIdService, когда речь идет о подписках на темы.
После того, как вы выполнили задачи настройки, вы можете добавить клиентский код для подписки на тему, а затем обрабатывать сообщения, отправленные в эту тему.
Клиентские приложения могут подписаться на любую существующую тему или создать новую тему. Когда клиентское приложение подписывается на новое имя темы (которое еще не существует для вашего проекта Firebase), новая тема с таким именем создается в FCM, и любой клиент может впоследствии подписаться на нее.
Чтобы подписаться на тему, клиентское приложение вызывает Firebase Cloud Messaging subscribeToTopic () с именем темы FCM:
FirebaseMessaging.getInstance().subscribeToTopic("news");
Класс MyFirebaseInstanceIdService будет службой, используемой для обработки логики FCM. Эта служба используется для предупреждения приложения о создании нового токена InstanceID и для получения сгенерированного токена.
Измените его, чтобы расширить FirebaseInstanceIdService и переопределить метод onTokenRefresh для подписки на тему. Используйте следующий код, чтобы обновить метод onTokenRefresh в MyFirebaseInstanceIdService, чтобы он выглядел так:
public class MyFirebaseInstanceIdService extends FirebaseInstanceIdService {
private static final String TAG = "MyFirebaseIIDService";
private static final String FRIENDLY_ENGAGE_TOPIC = "friendly_engage";
/**
* The Application's current Instance ID token is no longer valid
* and thus a new one must be requested.
*/
@Override
public void onTokenRefresh() {
// If you need to handle the generation of a token, initially or
// after a refresh this is where you should do that.
String token = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "FCM Token: " + token);
// Once a token is generated, we subscribe to topic.
FirebaseMessaging.getInstance()
.subscribeToTopic(FRIENDLY_ENGAGE_TOPIC);
}
}
Он использует InstanceIdService, но подписки на тему там не происходит. Это делается просто в клиенте как часть нажатия кнопки в действии:
Button subscribeButton = (Button) findViewById(R.id.subscribeButton);
subscribeButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// [START subscribe_topics]
FirebaseMessaging.getInstance().subscribeToTopic("news");
// [END subscribe_topics]
// Log and toast
String msg = getString(R.string.msg_subscribed);
Log.d(TAG, msg);
Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();
}
});
Комментарий к коду InstanceIdService предлагает менеджеру подписки onTokenRefresh()
@Override
public void onTokenRefresh() {
// Get updated InstanceID token.
String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d(TAG, "Refreshed token: " + refreshedToken);
// If you want to send messages to this application instance or
// manage this apps subscriptions on the server side, send the
// Instance ID token to your app server.
sendRegistrationToServer(refreshedToken);
}