Nano Hash - криптовалюты, майнинг, программирование

Firebase дважды отправляет push-уведомление

Я написал очень простое приложение для Android для тестирования push-уведомлений Firebase, и я дважды получаю одно уведомление.

это служба манифеста:

<service
        android:name="com.google.firebase.messaging.FirebaseMessagingService">
        <intent-filter>
            <action android:name="com.google.firebase.MESSAGING_EVENT"/>
        </intent-filter>
    </service>
    <service
        android:name="com.google.firebase.iid.FirebaseInstanceIdService">
        <intent-filter>
            <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
        </intent-filter>
    </service>

это приложение gradle:

    compile 'com.google.android.gms:play-services:9.0.0'
    compile 'com.google.firebase:firebase-core:9.0.0'
    compile 'com.google.firebase:firebase-messaging:9.0.0'
}
apply plugin: 'com.google.gms.google-services'

и вот градация уровня проекта:

classpath 'com.google.gms:google-services:3.0.0'

  • Не могли бы вы дать нам код части, где обрабатывается обмен сообщениями? Ошибка может быть из этой части. 03.07.2016
  • @isnotmenow это весь код, относящийся к firebase, кроме google-services.json. 03.07.2016
  • в вашем коде Android должна быть служба принимающего класса, что-то вроде MyFirebaseMessagingService.java. 03.07.2016
  • @isnotmenow Вы можете видеть, что я использую базовый класс вместо My*.java 03.07.2016
  • Мне жаль. Оказывается, вы используете FirebaseMessagingService.java. Взгляните на этот класс. 03.07.2016
  • Вы должны быть уверены, что устройство не регистрируется более одного раза. Однажды у меня была эта ошибка, удаление дубликатов решило проблему для меня. 03.07.2016
  • @Omolara Думаю, ты прав, я зарегистрировался дважды, но как этого избежать? 04.07.2016
  • @SiavashA Вы можете сохранить логическое значение или значение, которое позволит вам узнать, когда устройство успешно зарегистрировано. Затем вы проверяете это значение перед началом новой регистрации. 04.07.2016
  • @SiavashAbdoli Я также получаю похожие множественные уведомления, но через некоторое время. Не 2 уведомления одновременно. Есть идеи? 31.10.2018
  • @SachinPrasad Я не знаю, может быть, сервер снова отправит его после одного сбоя, и это вызовет дублирование. 02.11.2018

Ответы:


1

Похоже, вы используете com.google.android.gms:play-services:9.0.0 (включая play-services-gcm) и com.google.firebase:firebase-messaging:9.0.0

FCM из firebase-massaging автоматически регистрирует токен идентификатора экземпляра (идентификатор устройства), поэтому, если у вас есть логика, которая регистрирует токен в вашем приложении, вероятно, вы регистрируетесь дважды. Это может быть связано с тем, что вы получаете несколько уведомлений. В более общем плане именно по этой причине вам не следует использовать FCM и GCM в одном приложении. Поэтому, если вы собираетесь использовать FCM, вам следует удалить GCM из своего приложения.

Кроме того, использование play-services включает в себя все API-интерфейсы play-services-x, такие как play-services-gcm, play-services-drive и т. д. Поэтому всегда используйте разделенные библиотеки, такие как play-services-x, а не только play-services.

04.07.2016
  • Если устройство дважды зарегистрировано в рабочем приложении . Пожалуйста, предложите решение для этого? 27.02.2018
  • Вам также необходимо убедиться, что вы очистили свою сборку, чтобы удалить все классы, связанные с GCM. Это сработало для меня -nougat/49177709#49177709" title="получение уведомлений fcm несколько раз на нуге"> stackoverflow.com/questions/48785262/ 08.03.2018

  • 2

    Для меня это был сторонний SDK, который использовал GCM, в то время как наше приложение использовало FCM. Регистрация в обеих службах даст вам два уведомления.

    (Также я звонил super.onMessageReceived(remoteMessage) в свой FirebaseMessagingService, вызывая появление третьего уведомления: p

    13.09.2016
  • Кажется, один сторонний SDK использует GCM, и я не знаю, что это такое: D, как это найти? 25.09.2016
  • Используйте логику. Большинству библиотек не нужен GCM. Большие (платные) сервисы с админ-панелями или со встроенным чатом. Его могут использовать такие вещи, как Parse, Intercom, платежные сервисы и т. д. 26.09.2016
  • Также: проверьте этот вопрос: stackoverflow.com/ вопросы/21645071/ 26.09.2016
  • Для меня это был AndroidJobs, который использует GCM для планирования уведомлений на старых устройствах. 28.09.2017
  • Спасибо за это (также...) - именно поэтому я видел два :-) 18.06.2019

  • 3

    Принятый ответ не сработал для меня. Ниже то, что сработало:

    Я использовал data-messages вместо display-messages, так что даже если приложение находится на переднем плане или в фоновом режиме, появится единственное уведомление.

    Заменять

    {
          "to": "/topics/journal",
          "notification": {
            "title" : "title",
            "text": "data!",
            "icon": "ic_notification"
           }
    }
    

    С участием

    {
      "to": "/topics/dev_journal",
       "data": {
           "text":"text",
           "title":"",
           "line1":"Journal",
           "line2":"刊物"
       }
    } 
    

    Ссылка: Как обрабатывать уведомление, когда приложение в фоновом режиме в firebase

    07.09.2016
  • ДА! Второй пример запускает функцию onbackgroundmessage. Подробнее здесь: github.com/firebase/quickstart- js/проблемы/71 12.06.2018

  • 4

    У меня была такая же проблема, когда приложение было в фоновом режиме или закрыто (и отправляло как уведомление, так и данные). Вызвано запросом старых разрешений GCM в AndroidManifest.xml

    Взгляните на https://stackoverflow.com/a/44435980/1533285.

    08.06.2017

    5

    мне пришлось удалить

    <receiver android:name="com.google.android.gms.gcm.GcmReceiver" 
    android:exported="true" android:permission="com.google.android.c2dm.permission.SEND"> 
      <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <category android:name="${applicationId}" /> 
      </intent-filter> 
    </receiver>
    

    из AndroidManifest.xml

    Это сработало для меня, спасибо

    08.09.2019

    6

    используйте в сборке файла gradle компиляцию 'com.google.firebase:firebase-core:10.2.1', скомпилируйте 'com.google.firebase:firebase-messaging:10.2.1' и используйте handleIntent() в приемнике.

    22.06.2017
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..