g123k / flutter_app_badger

Support to update the app badge on the launcher (both for Android and iOS)
https://pub.dev/packages/flutter_app_badger
Apache License 2.0
307 stars 172 forks source link

flutter_app_badger cannot update badge on iOS when onBackground #76

Open raymondk25 opened 1 year ago

raymondk25 commented 1 year ago

I have implemented firebase messaging and I am using this one for notification. My goal is that when receiving a notification sent from firebase in the background or with the app closed, the counter is incremented as the notifications arrive.

My code looks like this :

Future<void> main() async {
  FirebaseMessaging.onBackgroundMessage(_firebaseMessagingBackgroundHandler);
  runApp(child: const MyApp()));
}

@pragma('vm:entry-point')
Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage remoteMessage) async {
  await Firebase.initializeApp();
  FlutterAppBadger.updateBadgeCount(1);
}

background or terminated not triggering for me no matter what, only foreground can incremented the badge counter.

chiennv23 commented 1 year ago

Have you fixed it? can you show me some code for me pls, I have a problem like you. Thanks!

KM9668 commented 1 year ago

@raymondk25 @chiennv23 Did you find a way to fix this problem ?

chiennv23 commented 1 year ago

@KM9668 yes im done, iam using firebase message and push badge in notification json like this: "notification" : { "body" : "Body of Your Notification", "title": "Title of Your Notification", "badge":"22" }, "data" : { "click_action":"FLUTTER_NOTIFICATION_CLICK", "body" : "Body of Your Notification in Data", "title": "Title of Your Notification in Title", "url" : "LOGIN_SCREEN", "key_2" : "Value for key_2" }

IOS automatic update badge on background. hope u do it!

raymondk25 commented 1 year ago

@chiennv23 Thanks a lot!

QPAYRE commented 1 year ago

@KM9668 yes im done, iam using firebase message and push badge in notification json like this: "notification" : { "body" : "Body of Your Notification", "title": "Title of Your Notification", "badge":"22" }, "data" : { "click_action":"FLUTTER_NOTIFICATION_CLICK", "body" : "Body of Your Notification in Data", "title": "Title of Your Notification in Title", "url" : "LOGIN_SCREEN", "key_2" : "Value for key_2" }

IOS automatic update badge on background. hope u do it!

Hey @chiennv23 could you add more explanation on what you do exactly ? 🙂

rohanddave commented 1 year ago

HI @raymondk25 this seems to be an issue with your background handler not firing instead of the library.

Try adding content-available: true for iOS and priority: high for android as a part of your FCM message from your server.

const message: Message = {
            notification: {
                title: "Test notification",
                body: 'test content',
            },
            data: {
               // notification data here
            },
            token: deviceToken,
            android: {
                priority: 'high',
            },
            apns: {
                payload: {
                    aps: {
                        contentAvailable: true,
                    },
                },
            },
        }
ProFive commented 1 year ago

@rohanddave I tried to set contentAvailable: true on iOS, but the app was still not updated when the app was closed. Do you have another solution to fix it?

rohanddave commented 1 year ago

@ProFive you need to ensure your background handler function is a static or top level function since flutter runs on an Isolate in the background. Additionally, I would check XCode to ensure Background Processing, Background Fetch and Remote Notifications are selected under Background Modes. Also, check if you have Push Notifications enabled in XCode too

ProFive commented 1 year ago

Hi @rohanddave

Main.dart @pragma('vm:entry-point') Future<void> _firebaseMessagingBackgroundHandler(RemoteMessage message) async { // If you're going to use other Firebase services in the background, such as Firestore, // make sure you callinitializeAppbefore using other Firebase services. await Firebase.initializeApp(); // print('A background message just showed up : $message'); int count = (SpUtil.getInt(PREF_APP_BADGER, defValue: 0) ?? 0) + 1; // print("A background message PREF_APP_BADGER count:$count"); FlutterAppBadger.updateBadgeCount(count); SpUtil.putInt(PREF_APP_BADGER, count); } Xcode: I checked Background fetch Remote notification Background processing

AppDelegate @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { if #available(iOS 10.0, *) { UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate } GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }

rohanddave commented 11 months ago

Hi @ProFive can you try putting FirebaseMessaging.onBackgroundMessage(handleBackgroundNotification); in your app's initState method where handleBackgroundNotification is a top level function i.e. not nested inside any class

maharramg commented 9 months ago

@ProFive Did you manage to solve the issue?