android, как FCM узнает, когда и кому должен быть отправлен токен

#android #firebase-cloud-messaging

#Android #firebase-cloud-messaging

Вопрос:

Для тестирования FCM ему нужно только создать FirebaseMessagingService и запустить приложение, токен будет передан ему через его onNewToken (строковый токен). (обязательно нужно создать проект с помощью консоли FCM и загрузить google-service.json).

Вопрос в том, как FCM узнает, что приложение только начинает запускаться, и FCM должен отправить ему токен (как)?

тестовый проект имеет только MainActivity:

 class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}
  

и услуга:

 public class MyFirebaseMessagingService extends FirebaseMessagingService {

  @SuppressLint("LongLogTag")
  @Override
  public void onNewToken(String token) {
    Log.d(TAG, "Refreshed token: "   token);
  }

  @SuppressLint("LongLogTag")
  @Override
  public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.d(TAG, "From: "   remoteMessage.getFrom());

    //...
  }
}
  

плюс добавлены Google-сервисы.json получен из консоли проекта FCM. и в соответствующем build.gradle добавлен плагин apply, следуя инструкции сайта Google FCM:

 apply plugin: 'com.google.gms.google-services'
  
 dependencies {
        classpath 'com.google.gms:google-services:4.3.3'
  

и в манифесте:

         <service android:name="com.demo.mytestfcmnotificationdemo.MyFirebaseMessagingService">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>

  

Ответ №1:

На самом деле это работает наоборот: когда ваше приложение запускается, оно вызывает службы FCM и запрашивает у них, что токен, который у него есть, все еще действителен. Если он больше не действителен, он получает новый токен, а затем вызывает этот onNewToken обработчик.

Таким образом, FCM не выполняет активное сканирование токенов, которые нуждаются в обновлении, а ожидает, пока устройство свяжется и проверит статус своего токена.

Комментарии:

1. спасибо @Frank! но в моем тестовом проекте нет кода для инициирования вызова FCM, у него есть только служба, созданная FCM (вот в чем вопрос, который у меня есть)? Я обновлю свой вопрос с помощью кода проекта.

2. Когда вы включаете FCM в приложение, службы FCM запрашивают токен. Для этого вам не нужно включать какой-либо пользовательский код.

3. Я думаю, что это та часть, которую я не понимаю. Я регистрирую свое приложение в FCM в их консоли проекта, и в моем приложении есть служба, ожидающая запуска. Как FCM узнает, что мое приложение только запущено, и отправляет в него токен? (После того, как я добавил имя пакета приложения в проект FCM в его консоли, он начинает вращать значок ожидания и говорит что-то вроде ожидания запуска приложения. После запуска моего приложения счетчик останавливается, и мое приложение получает токен). У меня нет кода в приложении, чтобы сделать какой-либо звонок в FCM.

4. Как сказано в моем ответе: FCM не отправляет токен, код FCM в вашем приложении запрашивает его при запуске. Это делается самим FCM SDK, когда вы включаете его в свое приложение, так что это не написанный вами код.

5. спасибо @Frank!, я думаю, это тот самый apply plugin: 'com.google.gms.google-services' .