2016-07-12 2 views
12

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

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

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

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

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

+0

http://engineering.letsnurture.com/firebase-cloud-messaging/ –

ответ

8

Да, токен 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 
    } 
} 

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

+0

Так что я мог бы то же самое, но также и в моем MainActivity при первом запуске отправлять токен на сервер, потому что единственный способ использовать приложение - зарегистрироваться и при первом запуске службы нет никакого идентификатора пользователя, поэтому он не будет отправлен на сервер. Думаю, это мое решение. Разве вы не отправляете его на сервер при первом получении токена? Или вы просто делаете это позже, но не включаете код? – iBobb

5

Мы справились, как это:

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

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

+1

есть ли способ получить токен, просто используя электронную почту пользователя (все на стороне сервера)? – Andrea

11

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

FirebaseInstanceID.getInstance().getToken(); 

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