flutter notification is not coming in ios when app is on kill state but when we open the app notification is coming
Asked Answered
S

2

1

Hello i have an issue in flutter IOS notification , when app is on background or kill state notification is showing only when we click to open the app otherWise notification is not showing in IOS device !

Suki answered 14/7, 2022 at 11:3 Comment(0)
T
1

Please try this

class name FCM

import 'dart:async';
    
    import 'package:firebase_core/firebase_core.dart';
    import 'package:firebase_messaging/firebase_messaging.dart';
    
    Future<void> onBackgroundMessage(RemoteMessage message) async {
      await Firebase.initializeApp();
    
      if (message.data.containsKey('data')) {
        // Handle data message
        final data = message.data['data'];
      }
    
      if (message.data.containsKey('notification')) {
        // Handle notification message
        final notification = message.data['notification'];
      }
      // Or do other work.
    }
    
    class FCM {
      final _firebaseMessaging = FirebaseMessaging.instance;
    
      final streamCtlr = StreamController<String>.broadcast();
      final titleCtlr = StreamController<String>.broadcast();
      final bodyCtlr = StreamController<String>.broadcast();
    
      setNotifications() {
        FirebaseMessaging.onBackgroundMessage(onBackgroundMessage);
        FirebaseMessaging.onMessage.listen(
              (message) async {
            if (message.data.containsKey('data')) {
              // Handle data message
              streamCtlr.sink.add(message.data['data']);
            }
            if (message.data.containsKey('notification')) {
              // Handle notification message
              streamCtlr.sink.add(message.data['notification']);
            }
            // Or do other work.
            titleCtlr.sink.add(message.notification!.title!);
            bodyCtlr.sink.add(message.notification!.body!);
          },
        );
        // With this token you can test it easily on your phone
        final token =
        _firebaseMessaging.getToken().then((value) => print('Token: $value'));
      }
    
      dispose() {
        streamCtlr.close();
        bodyCtlr.close();
        titleCtlr.close();
      }
    }

And Main Class

    void main() async {
      await init();
      runApp(const MyApp1());
    }
    
    Future init() async {
      WidgetsFlutterBinding.ensureInitialized();
      await Firebase.initializeApp();
    }
    
    class MyApp extends StatelessWidget {
      const MyApp({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return const MaterialApp(
          home: HomePage(),
        );
      }
    }
    
    class HomePage extends StatefulWidget {
      const HomePage({Key? key}) : super(key: key);
    
      @override
      State<HomePage> createState() => _HomePageState();
    }
    
    class _HomePageState extends State<HomePage> {
      String notificationTitle = 'No Title';
      String notificationBody = 'No Body';
      String notificationData = 'No Data';
    
      @override
      void initState() {
        final firebaseMessaging = FCM();
        firebaseMessaging.setNotifications();
    
        firebaseMessaging.streamCtlr.stream.listen(_changeData);
        firebaseMessaging.bodyCtlr.stream.listen(_changeBody);
        firebaseMessaging.titleCtlr.stream.listen(_changeTitle);
    
        super.initState();
      }
    
      _changeData(String msg) => setState(() => notificationData = msg);
      _changeBody(String msg) => setState(() => notificationBody = msg);
      _changeTitle(String msg) => setState(() => notificationTitle = msg);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          body: Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Text(
                  notificationTitle,
                  style: Theme.of(context).textTheme.headline4,
                ),
                Text(
                  notificationBody,
                  style: Theme.of(context).textTheme.headline6,
                ),
                Text(
                  notificationData,
                  style: Theme.of(context).textTheme.headline6,
                ),
              ],
            ),
          ),
        );
      }
    }
Trainbearer answered 3/8, 2022 at 12:19 Comment(5)
Is this worked on IOS ??Suki
Not working i tried this code broSuki
Need to add some configuration in info.Plist Xcode . Please check onceTrainbearer
Already Added in my Info.plist all functionalitySuki
Were you able to make it work in any case from the backend/flutter or anything?Husch
B
0

I have got the same problem.

The problem is that your function cannot receive event when killed.

To prevent this you need to use the @pragma('vm:entry-point') annotation.

Background messages:

Apple platforms and Android: When using Flutter version 3.3.0 or higher, the message handler must be annotated with @pragma('vm:entry-point') right above the function declaration (otherwise it may be removed during tree shaking for release mode).

So in your code:

In the main function:

void main() {
  [...]
  await Firebase.initializeApp();
  FirebaseMessaging.onBackgroundMessage(notificationHandler);
  [...]
}

In a top level function:

@pragma('vm:entry-point')
Future<void> notificationHandler(RemoteMessage message) async {
  await AwesomeNotifications().createNotification(content: content);
}

Be careful:

Be sure to not rely on "data" notification object, because it's a silent notification with low interest and iOS and android may not display your notification.

You should not rely on data only messages to be delivered. They should only be used to support your application's non-critical functionality, e.g. pre-fetching data so the next time the user opens your app the data is ready to be displayed and if the message never gets delivered then your app still functions and fetches data on open. (cf: https://firebase.flutter.dev/docs/messaging/usage/#low-priority-messages)

Beaston answered 24/9, 2023 at 18:43 Comment(0)

© 2022 - 2025 — McMap. All rights reserved.