I want to reset the notification badge number whenever the app is opened. This works perfectly fine calling
application.applicationIconBadgeNumber = 0
UNUserNotificationCenter.current().removeAllDeliveredNotifications()
However, when I one ore more new notifications come in, the icon badge number again goes to 42 no matter how many notifications come in.
Does anyone know how to fix this?
You can follow one of the following for achieving this,
You can store notifications received in your database and when user opens app, you can get the count of unread notifications and update the count.
If you are targeting single users then, you can get the delivery of Push notifications using https://stackoverflow.com/a/50044201/5084797 and then when the notification is opened you can pass notification Open event to server. So the next time the server sends push notification, they can just check for the difference in Deliver and Open and send that count in badge. If user has cleared all notifications from Notification centre without opening them. In that case as soon as App opens you need to update that at server, Else you might be getting wrong count from server.
Related
My app is receiving APNs sent from server to Apple backend. Naturally a user may not open the app once a notification arrives to user's device. In meantime my server may push more notifications. They all contain some user data that is important when a notification is processed. So how to deal with it? iOS won't bundle and give me a batch, will it?
Here are ways how I am going to tackle it, none of which is simple.
Server keeps track of not seen data and upon arriving a new request always sends a batch of all new notifications, reflecting the count as badge count.
Client is opened by taping on notification popup. In this case it has all needed data in didReceiveRemoteNotification.
OR
Client ignores notification popup and opens app (possibly later) by tapping on app icon. In this case didReceiveRemoteNotification is not called and thus app has to fetch all needed data from server.
OR
Server never sends any user data and client always checks for new stuff every time it starts or fetches data in didReceiveRemoteNotification.
Anything else? Something simpler I am missing?
Number 4 is the right approach. There is no guarantee that any of your app code will run when an APN is received, except on iOS7. So when your app starts, it has to check with your servers for any new information that it should display.
It's simplest to code this to alway ask your servers for the latest information to display, rather than rely on the information in the APN. Use the information in the APN only to determine which new information to navigate to, so that the app displays whatever the user tapped on.
This has changed with iOS7, where you can use the remote-notification background mode to be launched whenever a push message arrives. See https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIApplicationDelegate/application:didReceiveRemoteNotification:fetchCompletionHandler:
I am having the case when i am getting multiple notifications and when i select any one of them it opens up my app and does according my code.Then when i check other notifications are disappeared from the tray. Is this the usual case with notifications that opening one will remove others too or I am missing something?
I also have the question about bedge icons for multiple notifications also it is always shows 1 on the app icon. on opening of any of notification i set it to 0(zero). Does this bedge manage by server? If so how server will identify that this device is sent this many number of notifications?
As bedge are always shows 1, if i set bedge count as
int bedge = [UIApplication sharedApplication].applicationIconBadgeNumber;
bedge--;
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:bedge];
It goes to negative numbers.
you're not missing anything its usual case just because by clicking on any noti your app is getting open so all were disappear because all are related to the same application that's why once you open your app from any noti other were disappears.
About APNS:
Once your app is registered to APNS you will receive the device token. That device icon your are passing to third party server and if third party want to send the notification to the device then it will contact to APNS and ask to push the notification.
About Badges:
The badges will handled by OS. That means whenever third party pushing the notifications to the device then OS is automatically increase the count.Once you open the any notification in device notification bar or lock screen it will directly navigate to the application. Because your app ID is registered to APNS and it automatically sets the count to 0.
Is it possible to tell user what were about recently received push notifications ? I mean, if user clicks cancel when push was received, there is a badge on the icon of my application, but that's all. I think this is not user friendly and such notifications have no sense. When user opens an application, he knows that there is something new in it, but don't know exactly what. Do I need to make some requests to my web server to have information about my last pushes or I'm missing something and there is another way ?
From the implementations of push notifications I've worked with so far, you'll need to make a call to your server when the app actually starts up in order for the app to know what the new information is. I don't believe there's any way to store received push notifications unless your app is opened and handling them in the app delegate. Otherwise if push notification is closed it's discarded.
In all the apps I've worked with that utilized push notifications there was a place in the app where all the recent notifications were displayed after a call to the server was made to get the whole list.
I have implemented all recommended methods in AppDelegate to get working Remote Notifications service.
I can accept them while running, while launching and while turned off.
But there is an issue, since I can't work with many received notifications while in background. I can work only with latest notification.
What is recommended manual to do that? How can I got all notifications received while in background? Is it only solvable via manual call to my service provider (sender of apns data)?
With all the projects I've worked on there hasn't been a way to locally store this information if the push notification is dismissed. In all those cases we used a small file on the server that the app would connect to and pull when it became active again. There was also some place in the app where the user could see all their notifications which, again, were stored on the server for quick retrieval.
With the way I understand push notifications to be setup, if the notification is dismissed the system discards it. It'll perform anything it's supposed to do (such as update the badge number and play the correct sound) but any additional information specific to that notification is lost.
Not sure if this helps, but if you just want to know how many notifications you have missed while you were in background. You can create a variable which contains notification number and store this in the app every time you handle notification. When you come out of background and receive a new notification you can subtract the new number with the stored number to find out the number of missed notifications. I don't think there is a way where iOS can give you complete data associated with all the notification device have received while the app was in background.
The best solution is to keep a list of sent notifications with all relevant data on your server, so the app can access that data when it launches. Sending multiple notifications with data that is not stored on the server can be risky, because the application only receives the notification when the user opens the app from that notification, so if they tap on one notification, the app will only every receive that one.
If you have them all in a list on your server, the app can simply go and pull that list down, and process it, making sure no data is lost.
So imagine this scenario:
10.00: your app pushes a message "Hello"
10.01: your app pushes a badge update with no message out the same device
What happens is that the message dissappears. So if the user didn't see it, it's gone. Is there a way to send a badge notification without clearing any previous messages? I know you can send the message again, but I don't want to spam users who may have already ready the message.
I don't want to have a discussion about the why, simply if it's possible?
Unfortunately, it is not possible. We recommend including badge updates with your alerts, to set it at the same time, but there's no way to just update the badge without "overwriting" the alert.
At the same time, however, any message from any other application will also overwrite your earlier alert.
If you include a sound in your APNS payload, the phone will either play the sound or vibrate, so you could at least give the user feedback that a message has been received if you end up needing to do this.