Нужно ли мне расширять FirebaseInstanceIdService для подписки на темы FCM?

Я хочу управлять подпиской на темы из клиента (приложение для Android). В настоящее время я делаю это в Activity onCreate (). Мне интересно, правильный ли способ - подписаться / отказаться от подписки на InstanceIdService :: onTokenRefresh () или в любое удобное время (при нажатии кнопки и т. Д.).

Короче говоря, если я управляю подпиской на тему на стороне клиента (без сервера), мне все равно придется возиться с InstanceIdService?

Разные источники документации по-разному относятся к подписке на тему Firebase Cloud Messaging (FCM). Некоторые упоминают InstanceIdService, некоторые нет. Они здесь:

  1. Руководство Firebase по Отправка тематических сообщений с помощью Firebase Console

Он не упоминает InstanceIdService, когда речь идет о подписках на темы.

После того, как вы выполнили задачи настройки, вы можете добавить клиентский код для подписки на тему, а затем обрабатывать сообщения, отправленные в эту тему.

Клиентские приложения могут подписаться на любую существующую тему или создать новую тему. Когда клиентское приложение подписывается на новое имя темы (которое еще не существует для вашего проекта Firebase), новая тема с таким именем создается в FCM, и любой клиент может впоследствии подписаться на нее.

Чтобы подписаться на тему, клиентское приложение вызывает Firebase Cloud Messaging subscribeToTopic () с именем темы FCM:

FirebaseMessaging.getInstance().subscribeToTopic("news");
  1. Firebase Android Codelab

Класс 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);
   }
}
  1. Проект быстрого запуска Firebase на github

Он использует 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);
}

person rpattabi    schedule 19.10.2016    source источник
comment
Интересно. Раньше не замечал этого. Я посмотрю вокруг и отвечу.   -  person AL.    schedule 19.10.2016


Ответы (1)


Как вы уже знаете, FirebaseInstanceId, вероятно, является одноэлементным классом, из которого вы получаете свой регистрационный токен. Поэтому я думаю, что метод subscribeToTopic(), поскольку передается только имя темы, вы можете предположить, что он уже вызывает экземпляр самого FirebaseInstanceId или затем просто отправляет запрос на серверы FCM с соответствующим токеном регистрации и темой, которую он следует подписаться на.

Короче говоря, я не думаю, что вам необходимо расширять FirebaseInstanceIdService для вызова subscribeToTopic(), однако я думаю, что это важно, потому что (, как описано в docs) это:

Базовый класс для обработки событий обновления токена идентификатора экземпляра Firebase.


По другим вопросам.

Я хочу управлять подпиской на темы из клиента (приложение для Android). В настоящее время я занимаюсь этим на мероприятии onCreate(). Мне интересно, правильный ли способ - подписаться / отказаться от подписки на InstanceIdService::onTokenRefresh() или в любое удобное время (при нажатии кнопки и т. Д.)?

Я думаю, что делать это в onCreate() - это нормально. Если вы видите мой ответ здесь, @FrankvanPuffelen упомянул:

подписка на темы при запуске приложения - это нормально.

Однако я думаю, что также хорошо добавить вызов subscribeToTopic() в onTokenRefresh(), чтобы как только для экземпляра приложения был предоставлен новый токен, вы немедленно подписали его соответствующим образом.

Обратите внимание. Я думаю, что поведение, о котором я думаю, заключается в том, что, когда токен регистрации становится недействительным, его подписка также теряется, и что добавление subscribeToTopic() в onRefreshToken() немедленно повторно подпишет их для вас (, конечно, это по-прежнему зависит от вашей реализации, на какую тему вы хотите подписаться).

person AL.    schedule 19.10.2016
comment
Спасибо за ссылку на подтверждение от парня из firebase. Однако у меня есть принципиальный вопрос. Если подписка при запуске приложения / запуске активности допустима, тогда зачем нужна подписка через onRefreshToken (). Если ответ - продлить подписку при обновлении токена, то подписка только через onRefreshToken () будет достаточной и более правильной, не так ли? - person rpattabi; 19.10.2016
comment
Не обязательно. onRefreshToken() вызывается только для особых причин, поэтому это не всегда гарантия того, что subscribeToTopic() будет вызван. Вы можете просто подумать об этом в этом сценарии: вызов subscribeToTopic() при запуске приложения гарантирует, что ваш текущий регистрационный токен будет подписан. Добавление вызова в onTokenRefresh() гарантирует, что, если срок действия токена истечет, вы сразу же повторно подпишетесь на него, поэтому вам не нужно перезапускать приложение только для подписки. - person AL.; 19.10.2016