Службы уведомлений

Я пытаюсь получать уведомления Android с помощью firebase. Я определил следующие услуги. Но сервис MyFirebaseInstanceIDService запускается при запуске приложения впервые. В то время у меня даже нет базы данных для пользователя. Я хочу сохранить токен firebase для пользователя, но сначала я хочу сделать запись для пользователя при первом действии и запустить службы при втором действии. ТАК, что я могу хранить токен пользователя.

Файл манифеста Android

<service
    android:name = "in.anamika.anamika.notifications.MyFirebaseMessagingService"
    android:permission = "com.google.android.c2dm.permission.SEND">
    <intent-filter>
        <action android:name = "com.google.firebase.MESSAGING_EVENT" />
        <action android:name = "com.google.android.c2dm.intent.RECEIVE" />
    </intent-filter>
</service>
<service android:name = "in.anamika.anamika.notifications.MyFirebaseInstanceIDService">
    <intent-filter>
        <action android:name = "com.google.firebase.INSTANCE_ID_EVENT" />
    </intent-filter>
</service>

Вы можете сохранить токен в sharedPreference до создания БД, а затем сохранить его в БД.

Nainal 04.07.2018 14:12

вы используете базу данных firebase?

Umar Hussain 05.07.2018 20:13
7
2
504
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

поместите этот код в свою пусковую установку / основное действие:

String refreshedToken = FirebaseInstanceId.getInstance().getToken();
Log.d("", "Refreshed token: " + refreshedToken);

это даст вам токен, чем перейдите на эту страницу ниже -

https://console.firebase.google.com/project/_/notification и create new notification->choose single device->paste - токен, который был зарегистрирован в вашем проекте студии Android-> проверьте, получили ли вы уведомление

Начиная с версии "17.0.1" SDK Cloud Messaging, FirebaseInstanceId.getInstance().getToken() устарел и заменен getInstanceId(). Он возвращает Task<InstanceIdResult>, к которому вы можете прикрепить слушателя, как показано в этом отвечать

Rosário Pereira Fernandes 02.07.2018 09:54

На самом деле, приведенное выше решение не решает мою проблему. Если я получаю токен каждый раз при работе с пусковой установкой и отправляю токен в БД, это было бы неэффективно. Могу ли я добавить какой-нибудь слушатель в свою активность запуска, например onTokenRefresh ()? Я хочу, чтобы впервые я мог отправить токен в БД из определенной активности. И после этого из самого сервиса, то есть OnTokenRefresh

tarun14110 02.07.2018 10:39

ЕСЛИ пользователь не вошел в систему изначально. Я не могу поместить его токен в базу данных. Итак, если пользователь не вошел в систему, я хочу подождать, пока он войдет, и после входа в систему мне нужен слушатель, например onTokenRefresh.

tarun14110 02.07.2018 10:46
Ответ принят как подходящий

Исходя из того, как я понял ваш вопрос, я вижу более одного решения, а именно:

  1. Первоначально вы можете сохранить токен в общем предпочтении, как упомянул Наинал. А позже, когда пользователь успешно входит в систему и создается база данных, вы можете сохранить ее в таблице.

Обновленный API возвращает Задача, на котором вы можете добавить прослушиватель onSuccess и который будет вызываться, когда вы успешно получите токен.

    FirebaseInstanceId.getInstance().getInstanceId().addOnSuccessListener(yourActivity,  
    new OnSuccessListener<InstanceIdResult>() {                    
                @Override
                public void onSuccess(InstanceIdResult instanceIdResult) {
                      String deviceToken = instanceIdResult.getToken();
                      // Do whatever you want with your token now
                      // i.e. store it on SharedPreferences or DB
                      // or directly send it to server 
                }
});
  1. Это будет довольно долго, но вы можете отправить собственное широковещательное сообщение из onTokenRefresh () или onNewToken (), установить интерфейс обратного вызова в широковещательный приемник из активности и получить этот вызов в Activity, переопределив метод обратного вызова.

Примечание: FirebaseInstanceIdService устарел, вместо этого мы можем переопределить onNewToken (), чтобы получить новый / обновленный токен только в FirebaseMessagingService. вы можете проверить ссылку это.

ПРИМЕЧАНИЕ: Решение основано на классах FirebaseInstanceIdService и FirebaseMessagingService. Но он будет работать с более новым обновлением Firebase Android SDK.

Вот сценарий решения вашей проблемы:

  1. В вашем обратном вызове обновления токена сначала проверьте, аутентификация присутствует. Если он присутствует, просто напишите токен на свой База данных Firebase. Также сохраните логическое значение для общих настроек в true, если токен сохранен в db, иначе установите значение false. Это решает проблема в том, что у вас нет доступа к базе данных, но вы получаете токен.

  2. Затем создайте задачу Async в отдельном классе, которая просто вызывает FirebaseUser для запуска FirebaseInstanceId.getInstance().getToken(); в строю.

  3. Затем в процессе входа в систему после успешной аутентификации firebase вызовите выше асинхронной задачи, которая вызовет обратный вызов onTokenRefresh. Сейчас поскольку присутствует аутентификация пользователя, ваша запись в базу данных будет успешной (также установка общего префикса token_sent_to_db = true).

  4. Теперь вы запускаете действие, в котором вы проверяете аутентификацию пользователя для переход к соответствующему действию добавить проверку, если общий параметр token_sent_to_db = ложь; снова вызовите асинхронную задачу. Это гарантирует, что если какие-то шаги, описанные выше, пропустят сохранение токена в db, мы сможем отправьте токен еще раз.

  5. Наконец, токен для FCM не изменится, пока вы не заставите его изменить или если приложения не будут установлены. Таким образом, токен получит только записывается в db только один раз.

P.S: Также убедитесь, что после выхода пользователя из системы у вас истекает срок действия токена FCM, иначе ваш сервер будет продолжать отправлять уведомление вышедшему из системы пользователю. FirebaseInstanceId.getInstance (). DeleteInstanceId ();

Другие вопросы по теме