Я больше не могу получать сообщение FCM в фоновом приложении

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

Итак, я попытался выполнить тест с quickstart-android project, чтобы увидеть, как он работает лучше.

И ответ - нет!

Я не сомневаюсь, что проект quickstart-android хорошо настроен для использования возможностей FCM...

Я отправил следующее сообщение от Advanced REST Client, я успешно использовал его для тестирования опубликованного приложения.

{
  "to" : "dLN4paNl3uw:APA91bH0lpkEMxGp...._7EdxkB2cRbPKFxT2Ti3OPw-7fCSwXCSfGG",
  "data": {
    "id": 19,
    "title": "Title test",
    "msg": "Text of the test",
    "code": 2,
  },
  "delay_while_idle" : false,
  "priority" : "high",
  "content_available" : true
}

Я могу сказать, что когда и каждый раз, когда я отправляю сообщение, когда приложение находится в фоновом режиме, я получаю следующее отображение в logcat

07-22 12:54:21.400 14316-14316/? W/GCM-DMM: broadcast intent callback: result=CANCELLED forIntent { act=com.google.android.c2dm.intent.RECEIVE flg=0x10000000 pkg=com.google.firebase.quickstart.fcm (has extras) }

Итак, сообщение хорошо воспринято устройством, но не передано в onMessageReceive().

Я видел много сообщений о такой проблеме, но ответы всегда неопределенны, поскольку мы можем сказать, что это работает для некоторых и не работает для некоторых других. Поэтому я хотел бы знать, если кто-то недавно нашел более точное объяснение этой проблемы, потому что я задаюсь вопросом, не может ли это произойти из среды разработки, поскольку я пытался создать более старый рабочий проект с недавно обновленными инструментами Studio, sdk, build и Я сталкиваюсь с той же проблемой, сообщения GCM/FCM больше не принимаются вновь созданным приложением.

ИЗМЕНИТЬ

После дополнительных исследований я увидел в logcat, что мое приложение закрыто, когда я вытаскиваю его из списка последних приложений. Это, безусловно, объясняет, что он не сможет обрабатывать сообщение, полученное устройством.

07-23 23:12:29.002 671-31254/? I/ActivityManager: Killing 17453:com.google.firebase.quickstart.fcm/u0a297 (adj 9): remove task
07-23 23:12:29.016 14316-14524/? D/GCM: Removing messenger 0:com.google.firebase.quickstart.fcm
07-23 23:12:29.017 671-2998/? I/WindowState: WIN DEATH: Window{2a27cf7 u0 com.google.firebase.quickstart.fcm/com.google.firebase.quickstart.fcm.MainActivity}
07-23 23:12:30.148 671-4851/? I/ActivityManager: Force stopping com.google.firebase.quickstart.fcm appid=10297 user=0: from pid 18289

Я также пробовал рабочий проект, созданный несколько недель назад, на основе GCM 8.4.0, sdk 23, java 1.7, который работал, и я получаю ту же проблему; Приложение закрыто.

Это наблюдается на двух разных устройствах, которые я успешно использовал для тестирования моего рабочего проекта: nexus 7 LTE 6.0.1 и GT-9295 5.0.1
Единственная разница, которую я вижу сейчас, - это версия Android Studio/gradle. Рабочий проект был построен с 1.5.2, и теперь я использую 2.1.2, я больше не могу создавать какое-либо рабочее приложение.
Я получаю эту проблему на двух разных компьютерах, и на одном из них я переустановил все!

Ответ 1

У FCM есть два типа уведомления: "Без звука" и "Без звука": -

Бесшумное уведомление: - Вы всегда получаете обратный вызов в методе onMessageReceived

Безмолвное уведомление. - Когда приложение находится на переднем плане, вы получили обратный вызов в методе onMessageReceived, но когда приложение находится в фоновом режиме, FCM генерирует уведомление по умолчанию в панели уведомлений.

Уведомление только с частью данных рассматривается как молчаливое уведомление в FCM.

Когда вы создаете уведомление с сервера, вы передаете объект JSON примерно так: -

{
  "notification":{
    "title":"Test Notification",
    "body":"Notification is delivered!",
    "sound":"call",
    "icon": "ic_app_icon"
  },
  "data":{
    "someData":"Great"
  },
  "to": "app_token",
  "priority":"high"
}

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

{
  "data":{
    "someData":"Great"
  },
  "to": "app_token",
  "priority":"high"
}

Как вы можете, это та же структура, что и без объекта уведомления в полезной нагрузке.

Ответ 2

Это совершенно невероятно

Я переустановил пакет Android Studio 1.5 141.2422023, sdk 23.0.3, java jdk1.7.0_79 и восстановил приложение для быстрого запуска Firebase для быстрого запуска и Android, и результат удивительный

У меня больше нет сообщения Force stopping, когда я помещаю приложение в фоновом режиме:

07-24 12:00:10.409 671-3321/? I/ActivityManager: Killing 11067:com.google.firebase.quickstart.fcm/u0a297 (adj 9): remove task
07-24 12:00:10.425 671-31254/? D/GraphicsStats: Buffer count: 4
07-24 12:00:10.425 671-31254/? I/WindowState: WIN DEATH: Window{996cbf7 u0 com.google.firebase.quickstart.fcm/com.google.firebase.quickstart.fcm.MainActivity}

И приложение правильно принимает и обрабатывает сообщение полезной нагрузки

Я также успешно перестроил приложение под Studio 1.5.2 с помощью sdk 24, buildtools 24.0.0 и java 1.8.0_92

Скажите, пожалуйста, если что-то критическое для изменения в приложении при переходе с Studio 1.5 на Studio 2.1.2!

Ответ 3

Я также вижу эту ошибку, также используя Android Studio 2.1, и узнал об этом:

Когда вы выйдете из Android Studio, он прекратит приложение (отлаживается) и поместит его в какое-то "остановленное" состояние.

Это не то же самое, что отмахиваться от повторений, если я это делаю, тогда мои сообщения GCM проходят через штраф.

Но этот цикл - отладка с AS, прекращение AS, приложение убивается - приводит к сбою обмена сообщениями GCM с помощью result=CANCELLED forIntent

Ответ 4

Надеюсь, вы добавите этот тип данных в свой веб-API.

$fields = array(
    'to'                        => $reg_id ,
    'priority'                  => "high",
    'notification'              => array( "title"=>"Food Shop", "body" => $message , "click_action"=> "OPEN_ACTIVITY_1"),
    'data' => array(
            "noti_title"=>"Food Shop One",
            "noti_body"=> "some body"
          ),
);