Я больше не могу получать сообщение 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"
),
);