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();