Firebase Cloud Messaging не вызывает FirebaseInstanceId
Я только что обновил GCM до FCM в соответствии с этим руководством здесь. На сайте говорится, что моя служба, которая расширяет FirebaseInstanceIdService, будет вызываться, как только будет создан токен. По какой-то причине моя служба никогда не вызывается и onTokenRefresh
никогда не выполняется.
Мои услуги регистрируются следующим образом, согласно руководству:
<service android:name=".fcm.FcmService">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service android:name=".fcm.InstanceIdService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCEID_EVENT"/>
</intent-filter>
</service>
Мой сервис:
public class InstanceIdService extends FirebaseInstanceIdService {
private static final String TAG = "InstanceIdService";
@Override
public void onTokenRefresh() {
String token = FirebaseInstanceId.getInstance().getToken();
Log.e(TAG, "Got token: " + token);
}
}
LogCat ничего не говорит о отсутствующих файлах конфигурации, а также о журналах FirebaseApp и записи в журнале, в которых упоминается токен, но мой сервис никогда не вызывается.
Нужно ли мне начинать эту службу где-то в моей деятельности?
Я делаю что-то неправильно? Может ли кто-нибудь вести меня в правильном направлении?
EDIT: с помощью Log.e("TOKEN", "Token: " + FirebaseInstanceId.getInstance().getToken());
правильно печатает мой токен, так что это означает, что он был сгенерирован успешно. Служба по-прежнему не называется...
ИЗМЕНИТЬ 2: Изменение INSTANCEID_EVENT на INSTANCE_ID_EVENT устранило проблему, хотя мне пришлось переустановить приложение. Поскольку я уже выпустил бета-версию, содержащую новый FCM, мои бета-тестеры не смогут подписаться на темы, чтобы выявлять входящие сообщения. Итак, как мне это решить?
Ответы
Ответ 1
Спасибо Endanke за то, что вы поняли это со мной. Похоже, что документация Firebase несовместима. Одна страница говорит, что ваш фильтр намерений в вашем файле манифеста должен быть INSTANCE_ID_EVENT
, а другой говорит INSTANCEID_EVENT
.
Вы должны использовать INSTANCE_ID_EVENT
, и после внесения изменений вам нужно будет полностью удалить и переустановить приложение для внесения изменений.
Ответ 2
FCM следует использовать в качестве замены GCM. В вашем случае похоже, что у вас есть услуги как для FCM, так и для GCM в вашем манифесте. Попробуйте удалить gcm.GcmService и используйте только тот, который расширяет FirebaseInstanceId.
Ответ 3
После тонны проб и ошибок в моей проблеме появились инструменты: node= "replace" в моем теге приложения... удаление его решило проблему для меня
Ответ 4
У меня была такая же проблема, и, удалив и переустановив приложение на устройстве onTokenRefresh()
, получил один раз. Поэтому я предполагаю, что он изменился с GCM, где его часто вызывали, чтобы просто вызвать один раз, когда на самом деле нет токена.
Ответ 5
У меня разные варианты сборки в моем проекте, и у меня есть следующая проблема:
От: https://firebase.google.com/docs/android/setup#prerequisites
Примечание. Если у вас несколько вариантов сборки с разными именами пакетов, каждое приложение должно быть добавлено в ваш проект в консоли Firebase.
Ответ 6
просто измените INSTANCE_ID_EVENT на INSTANCEID_EVENT.it работал у меня
Ответ 7
Также проверьте дату своего телефона! У меня когда-то была разница в 5-7 дней! Фиксирование дня и повторная установка приложения исправили это!
Ответ 8
Убедитесь, что ваш файл Firebase "MyFirebaseInstanceIDService.java" находится непосредственно под деревом имен пакетов "com.company"
Не помещайте их в отдельный подпакет, например "com.company.services". Это связано с тем, что ваш google-services.json будет искать файлы непосредственно в каталоге "com.company".
Добавьте в тег приложения манифеста следующее метатег (если есть)
<service
android:name=".MyFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
Вы получите свой TOKEN в общедоступном void onTokenRefresh() method
PS: Загрузите и замените последнюю версию google-services.json из консоли проекта.
Ответ 9
Что требуется "облачным сообщениям Firebase":
- Внедрить производный класс (MyFirebaseInstanceIdService) из
FirebaseInstanceIdService.
- Внедрение переопределения onTokenRefresh для обработки обновления на
токен для устройства.
- В ссылке AndroidManifest.xml класс 'производный' с префиксом
с ".".
MyFirebaseInstanceIdService - это "предлагаемое" имя. Я лично предпочитаю префикс таких производных классов аббревиатурой или именем, которое я использую во всем приложении.
Ответ 10
onTokenRefresh()
будет вызывать только один раз. Когда ваше приложение будет установлено в первый раз, если вы хотите получить доступ к токену из другой активности, вы должны вызвать этот метод:
FirebaseInstanceId.getInstanceId().getToken();