Firebase FCM token - Когда отправлять на сервер?

Итак, у меня есть приложение, которое сначала запускает вас через несколько приветствующих слайдов, а затем переводит вас на страницу входа/регистрации, а затем в MainActivity.

Я только что реализовал FCM, а службы сгенерировали token до, какой-либо из этих страниц был просмотрен пользователем. Как я могу сделать это так, чтобы служба выполняла после, я получаю MainActivity?

Проблема заключается в том, что я пытаюсь отправить токен, как только он обновляется до MySQL DB для соответствующей учетной записи пользователя, но поскольку пользователь еще не выполнил вход, то есть null и мое сообщение к серверу не удается. Какой хороший способ это сделать? Я думал о сохранении токена в SharedPreferences и отправке его на сервер после входа пользователя в систему, но который создает множество осложнений, когда токен обновляется в какой-то более поздний момент?!

Возможное решение:

Я не уверен, что полностью понимаю, как работают 2 службы, но скажу в onTokenRefresh Я просто сохраняю токен в SharedPreferences, а в MainActivity получаю значение от SP, а затем отправляю его на сервер, В этом случае, когда токен обновляется, новое значение снова снова войдет в SharedPreferences. Но мне все равно нужно проверить, будет ли это новое значение в SP, а затем повторно загрузить его на сервер. Это сбивает с толку!

Ответ 1

Да, токен FCM генерируется автоматически. Но постарайтесь увидеть это под другим углом.

Вот как я справился с этим.

Пусть FCM генерирует токен, как только начнется ваше приложение. OnTokenRefresh вызывается, и вы просто сохраняете его в своих настройках как:

@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);

    sendRegistrationToServer(refreshedToken);
}

private void sendRegistrationToServer(String token) {
    // Add custom implementation, as needed.
    SharedPreferenceUtils.getInstance(this).setValue(getString(R.string.firebase_cloud_messaging_token), token);

   // To implement: Only if user is registered, i.e. UserId is available in preference, update token on server.
   int userId = SharedPreferenceUtils.getInstance(this).getIntValue(getString(R.string.user_id), 0);
   if(userId != 0){
       // Implement code to update registration token to server
   }
}

Надеюсь, вы поняли, кстати. Спросите, нужно ли вам больше разминирования.

Ответ 2

Обратите внимание, что вы всегда можете получить токен с помощью:

FirebaseInstanceID.getInstance().getToken();

Это вернет null, если токен еще не создан или токен, если он был сгенерирован. В вашем случае очень вероятно, что токен будет сгенерирован к моменту входа пользователя. Таким образом, вы должны иметь возможность отправить его на сервер приложений, как только пользователь выполнит вход. Если он недоступен, вы отправит его в обратном вызове onTokenRefresh, о котором упоминал Chintan Soni.

Ответ 3

Мы обрабатывали его следующим образом:

  • Наш сервер создает/обновляет значение токена по идентификатору пользователя (первичный ключ)
  • Использовать 2 SharedPreferences
    • Строка - токен Строка
    • Boolean (обновлено) - обновляется ли токен на сервере или нет.

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