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.