How to send a silent Push Notification payload - ios

I just want to know how I can determine what action to do on a silent push:
This is the aps that I sent to the client:
"aps": {
"content-available": 1
}
My problem now is when I add type: "Order_Update" to determine that the silent push is for the Order Update to display an alert notification.

There are a few options for it! Let's take a small ride to understand all the different payloads and their usage.
Simple Payload
Displayed in Notification Center : Yes
Wakes app to perform background task : No
{
"aps" : {
"alert" : "You received simple notification!",
"badge" : 1,
"sound" : "default"
}
}
Payload With Custom Notification Sound
Displayed in Notification Center : Yes
Wakes app to perform background task : No
Step 1 : Add custom notification sound file (.wav or .aiff extensions only. e.g. notification.wav) in your app bundle.
Step 2 : Configure your payload as shown below to play your custom sound
{
"aps" : {
"alert" : "It's a custom notification sound!",
"badge" : 1,
"sound" : "notification.wav"
}
}
Notification With Custom Payload
Displayed in Notification Center : Yes
Wakes app to perform background task : No
{
"aps" : {
"alert" : "It's a notification with custom payload!",
"badge" : 1,
"content-available" : 0
},
"data" :{
"title" : "Game Request",
"body" : "Bob wants to play poker",
"action-loc-key" : "PLAY"
},
}
Here the data dictionary holds custom information whatever you want. It will also display as normal notification with the alert message "It's a notification with custom payload!".
Normal Silent Notification
It will not a show an alert as a notification bar; it will only notify your app that there is some new data available, prompting the app to fetch new content.
Displayed in Notification center : No
Awake app to perform background task : Yes
{
"content-available" : 1
}
Silent Notification With Custom Payload
Here comes the magic to show a notification alert as well awake your app in background for a task! (Note: only if it's running in background and has not been killed explicitly by the user.)
Just add the extra parameter "content-available" : 1 in your payload.
Displayed in Notification Center : Yes
Wakes app to perform background task : Yes
{
"aps" : {
"alert" : "Notification with custom payload!",
"badge" : 1,
"content-available" : 1
},
"data" :{
"title" : "Game Request",
"body" : "Bob wants to play poker",
"action-loc-key" : "PLAY"
}
}
Use any of these payloads according to your app requirements. For background app refresh refer to Apple's documentation. I hope this gives you all the necessary information. Happy coding :)

As i understand, you want extra data inside payload, so you can identify what push notification type is,or what action need to be handled.
For that edit your payload as:
$body = array(
'content-available' => 1,
'sound' => ''
);
$payload = array();
$payload['aps'] = $body;
$payload['action'] = 'order_update';
Then in your iOS Code:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
NSString *action = userInfo["action"];
if([userInfo[#"aps"][#"content-available"] intValue]== 1 && [action isEqualToString:#"order_update") //order update notification
{
//handle Your Action here
return;
}
}
Hope this solves your problem!

Please also check apns-push-type (Required for watchOS 6 and later; recommended for macOS, iOS, tvOS, and iPadOS) The value of this header must accurately reflect the contents of your notification’s payload. If there is a mismatch, or if the header is missing on required systems, APNs may return an error, delay the delivery of the notification, or drop it altogether.
https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns

Related

How to debug background notifications in iOS?

I am trying to debug background push notifications on iOS, and more specifically to set breakpoints into code that should handle a notification to configure internationalized content using custom logic.
I set a breakpoints in my AppDelegate's userNotificationCenter(_:willPresent:withCompletionHandler:) and userNotificationCenter(_:didReceive:withCompletionHandler:).
And I also created a notification service extension and added a breakpoint to its didReceive(_:withContentHandler:) because I want to mutate the content of my notification.
When I send the following payload and my app is in the foreground, the breakpoint in userNotificationCenter(_:willPresent:withCompletionHandler:) gets a hit and everything is fine:
{
"aps" : {
"badge" : 1012,
"category" : "GENERIC_MESSAGE",
"mutable-content" : 1
},
"translations" : [
{
"LanguageCode" : "fr",
"Title" : "Aimant détaché",
"Body" : "L'aimant du capteur 002F51AB, associé à l'outil HT-1225 Hitachi Tas, a été détaché."
},
{
"LanguageCode" : "en",
"Body" : "The magnet of the tag 002F51AB, link to tool HT-1225 Hitachi Tas, was detached.",
"Title" : "Magnet detached"
},
{
"LanguageCode" : "nl",
"Body" : "De magneet van de tag 002F51AB, gelinkt aan het gereedschap HT-1225 Hitachi Tas, is losgekoppeld.",
"Title" : "Magneet losgekoppeld"
}
],
"messageId" : "90073ebb-ce51-ea11-a94c-000d3a213771"
}
But if the application is in the background and I send the exact same notification, I don't get a hit on userNotificationCenter(_:didReceive:withCompletionHandler:). Same thing when I run the notification service extension, I don't get a hit in didReceive(_:withContentHandler:)
Am I forgetting something? Is it because my notification payload doesn't have an aps alert field?
I figured it out: when I add an alert field to my push notification, even with a dummy string, then it get forwarded to my Notification Service. Otherwise it doesn't.

FCM Push Notification "content" entry

I'm using FCM to publish push notifications to my users, which is working great so far.
Currently I'm trying to implement a Notification Content Extension to deliver customized push notification and previews, which is working great with local notifications, following this post.
As far I know, I have to set the category entry and my notification category identifier in the push notification, in order to tell iOS, which notification UI it is supposed to use.
The problem is, when I send the following message to FCM, with the category entry set, FCM erases the entry or changes it to gcm.notification.category, depending where I place the category entry (aps / data, etc.)
This way iOS never shows my custom UI / extension. Unfortunately I was not able to find any help in the FCM documentation.
Send (POST: https://fcm.googleapis.com/fcm/send):
{
"notification": {
"title": "Good Morning",
"body": "Wake up Jack!",
"badge" : 1,
"sound" : "horn.aiff",
"category" : "Cheers" <-- Is going to be deleted / changed
},
"data" : {
"time" : "2018-01-19 23:00:00",
...
},
"mutable_content" : true,
"priority" : "high",
"registration_ids" : [
"abcdefg123456"
]
}
Received:
{
aps = {
alert = {
body = "Wake up Jack!";
title = "Good Morning";
};
badge = 1;
"mutable-content" = 1;
};
"gcm.message_id" = "0:1516392279506894%dc84760ddc84760d";
"gcm.notification.category" = "Cheers"; <-- not working
}
The category APNS parameter FCM counterpart is click_action.
When adding in a custom parameter (using the data message payload), it is handled differently for iOS and is often included outside of the aps payload (like in the sample you provided).

Push notifications disappear instantly

Is there any reason why a push notification would appear on the lock screen and then instantly disappear? I am using the didReceiveRemoteNotification block to save data in the notification.
Is it possible that your completionHandler code is setting the number of notifications to 0 ? That would make it disappear.
Either you put the number of notifications to 0 in your code like
UIApplication.sharedApplication().applicationIconBadgeNumber = 0
Or in you Notification payload, you have a the badge property set to 0
{
"aps" : {
"alert" : "You got your emails.",
"badge" : 0,
"sound" : "bingbong.aiff"
},
}

Push notification sound is not working

I am using Push Notifications in my app.when notifications comes,i am not getting the notification sound of the notification and also in iPad settings i switched-on all the notification buttons in iPad even though the notification sound is not coming.
{
alert = "Testing commands#2014-12-01T12:16:26",
sound = "default"
}
I am getting the sound file like this.But the notification sound is not coming.
I am new to the PushNotification concept.Can anyone please help to solve this...
you should use JSON format to send your notifications encapsulated in aps dictionary like:
{
"aps" : {
"alert" : "Your message.",
"badge" : 0,
"sound" : "default"
}
}
for complete reference:
https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Chapters/ApplePushService.html

How we can fetch push notification in background

I am receiving push notification in that payload message i am receiving one URL with message as push notification. but i dont want to show URL to user i want to show only message to user. is it possible from ios side.
If your are using url as a separate key in aps then its possible you can display alert only as a message, otherwise any message can't be modify message in background.
"aps": {
"alert": "alert!",
"sound": "default",
"URL" : "your url"
}
yes, its possible but it also depend on how you have created your payload but its simple as you create your payload with your link and message, receive at your delegate
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)pushChatObject {
// get the message value and NSLog is or set to UIAlert or in NSString
(pushChatObject)[#"Message"];
}
You can, but you shouldn't, because
Delivery of notifications is a “best effort”, not guaranteed. It is
not intended to deliver data to your app, only to notify the user that
there is new data available.
(c) Apple
Specify the notification message as
{
"aps": {
"alert": "alert!",
"sound": "default"
},
"URL": "http://apple.com"
}
When you receive the notification in the app just check for your param in the notification dictionary:
// Place this method to AppDelegate.m
- (void)application:(UIApplication *)application didReceiveRemoteNotification:
(NSDictionary *)notification {
if ([notification objectForKey:#"URL"]) {
NSString *url = [[notification objectForKey:#"URL"] stringValue];
}
}
Check this section of Apple's Local and Push Notification Programming Guide for more info
I think in this case you can use Child properties of the alert property, you use 1 argument as a alert and another argument as a url, like:
"aps": {
"alert" : {
"loc-key" : "ALERT",
"loc-args" : [ "Your alert message", "Your url"]
},
"sound": "default"
}
When the device receives the notification, it uses "ALERT" as a key to look up the associated string value in the Localizable.strings file in the .lproj directory for the current language. Assuming the current localization has an Localizable.strings entry such as this: "ALERT" = "%#";
And later on you can get your url using aps NSDictionary.

Resources