При разработке push-уведомлений, которые работают в фоновом режиме(по типу уведомлений от инстаграм, телеграм, вк), в своем приложении у меня возникли сложности с их работой в фоновом и закрытом режиме. Для их написания использовал плагин от FireBase ( Cloud Messaging ).
При отправке Notification message уведомления приходят при работе приложения в фоном режиме, в случае когда приложения закрыто уведомления не приходят вообще. Я попробовал перехватить ответы с сервера использовав прослушиватели onResume и onLaunch, но первый срабатывал лишь в случае перехода в приложение через уведомление, второй срабатывал лишь при первом запуске приложения.
При отправке Data message прослушиватели onResume и onLaunch, вообще не срабатывали.
В общем основная проблема в том, что я не понимаю как отловить ответ с сервера о приходе нового сообщение и обработать его в при фоновой и закрытой работе приложения. Буду рад если вы также укажите ссылки на хоть какую-нибудь реализацию.
Тело запроса при notification Message:
Тело запроса при data Message:
Мой манифест:
Код обработчика уведомлений:
class NotificationProvider {
static NotificationProvider _instance;
static final FirebaseMessaging _messaging = FirebaseMessaging();
static String _fcmToken;
static Function callback;
static Notification _parseNotification(Map<String,dynamic> message){
Notification data;
if (Platform.isAndroid){
data = Notification.fromJson(message,isIos: false);
}
else if (Platform.isIOS){
data = Notification.fromJson(message,isIos: true);
}
return data;
}
static Future<dynamic> _onLaunchMessageHandler( Map<String,dynamic> message){
final notification = _parseNotification(message);
if (notification != null){
callback.call(notification.header?.title ?? '');
}
}
static Future<dynamic> _onMessageMessageHandler( Map<String,dynamic> message){
final notification = _parseNotification(message);
if (notification != null){
callback.call(notification.header?.title ?? '');
}
}
static Future<dynamic> _onResumeMessageHandler( Map<String,dynamic> message){
final notification = _parseNotification(message);
if (notification != null){
callback.call(notification.header?.title ?? '');
}
}
factory NotificationProvider(){
return _instance ??= NotificationProvider._init();
}
NotificationProvider._init(){
_messaging.configure(
onMessage: _onMessageMessageHandler,
onResume: _onResumeMessageHandler,
onLaunch: _onLaunchMessageHandler,
);
if(Platform.isIOS){
_messaging.requestNotificationPermissions();
}
_messaging.getToken().then((token) => _fcmToken = token);
}
Future<String> fcmToken() async {
return _fcmToken ??= await _messaging.getToken();
}
}