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()); правильно печатает мой токен, так что это означает, что он был сгенерирован успешно. Служба до сих пор не вызвана...

EDIT 2: Изменение INSTANCEID_EVENT на INSTANCE_ID_EVENT Исправлена проблема, хотя мне пришлось переустановить приложение. Поскольку я уже выпустил бета-версию, содержащую новый FCM, мои бета-тестеры не смогут подписаться на темы для просмотра входящих сообщений. Так как мне это решить?

10 ответов


спасибо Endanke для выяснить это со мной. Похоже, что документация Firebase непоследовательна. одна страница говорит, что ваш фильтр намерений в вашем файле манифеста должен быть INSTANCE_ID_EVENT и другое говорит INSTANCEID_EVENT.

вы должны использовать INSTANCE_ID_EVENT, и как только вы внесете изменения, вам нужно будет полностью удалить и переустановить приложение для внесения изменений.


FCM должно быть использовано как замена к GCM. В вашем случае похоже, что в вашем манифесте есть службы как для FCM, так и для GCM. Попробуйте удалить gcm.GcmService, и используйте только тот, который расширяет FirebaseInstanceId.


после тонны проб и ошибок у моей проблемы были инструменты: node= "replace" в моем теге приложения...удаление его решило проблему для меня


У меня была та же проблема и путем удаления и переустановки приложения на устройстве onTokenRefresh() позвонили один раз. Поэтому я думаю, что он изменился с GCM, где его часто вызывали, чтобы просто вызвать один раз, когда на самом деле нет токена.


У меня разные варианты сборки в моем проекте, и у меня есть следующая проблема:

From:https://firebase.google.com/docs/android/setup#prerequisites

Примечание: Если у вас есть несколько вариантов сборки с разными именами пакетов, каждое приложение должно быть добавлено в проект в консоли Firebase.


просто измените INSTANCE_ID_EVENT на INSTANCEID_EVENT .это сработало для меня


кроме того, проверьте дату на вашем телефоне! У меня однажды была разница в 5-7 дней! Фиксация дня и переустановка приложения исправили это!


убедитесь, что ваша Firebase "MyFirebaseInstanceIDService.java "файл находится непосредственно под деревом имен пакетов" com.компания"

не помещайте их в отдельный подпакет, например " com.компания.заслуги." Это потому, что ваши google-сервисы.json будет искать файлы непосредственно под " com.компания " справочник.

добавьте следующее в тег приложения манифеста под метатегом (если есть)

<service
    android:name=".MyFirebaseInstanceIDService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service> 

вы получите свой токен на public void метод onTokenRefresh ()

PS: Загрузите и замените последние Google-сервисы.json из консоли проекта.


Что "Firebase Cloud Messaging" хочет:

  • реализовать производный класс (MyFirebaseInstanceIdService) от FirebaseInstanceIdService.
  • выполнить переопределение onTokenRefresh для обработки обновления токен для устройства.
  • в AndroidManifest.xml-ссылка на "производный" класс с префиксом с ".".

MyFirebaseInstanceIdService - это 'предложил' имя. Я лично предпочитаю префикс таких производных классов с аббревиатурой или именем, которое я использую во всем приложении.


onTokenRefresh() вызовет только один раз.когда ваше приложение устанавливается в первый раз, если вы хотите получить доступ к токену из другого действия, вы должны вызвать этот метод:

FirebaseInstanceId.getInstanceId().getToken();