简体   繁体   中英

Firebase FCM silent push notifications for iOS

I have a problem with silent notifications on iOS.

When my application is in background, I don't receive silent notification sent by FCM. But if I try to send directly to APNS, the notification is successfully received.

This is the JSON sent to FCM:

{ 
"to" : "<token>",
"priority": "high",
"content_available": true,
"data" : {
  "<key>" : "<string>",
  "<key2>" : "<string>"
}

}

This is the JSON sent directly to APNS:

{
  "aps": {
    "content-available": 1
  },
  "<key>": "<string>",
  "<key>": "<string>"
}

I have already tried to remove the "priority" key because I saw someone saying that I shouldn't set the priority if the "content_available" is already set. It didn't work.

  1. I have "Push Notifications" enabled in XCode > Capabilities.
  2. I have "Remote notifications" checked in Background Modes in XCode > Capabilities.
  3. The FCM notifications are working fine when app is in foreground and sometimes when the app is in background.

Remove "notification" key value pair and add "content_available": true

It will look like this

{ 
    "to" : "...",
    "priority": "high",
    "content_available": true,
    "data" : {
      ....
    }
}

This should make it a silent APNS and you need to handle with corresponding APNS delegate method.

You will need to handle this through delegates Refer this firebase documentation for details: https://firebase.google.com/docs/cloud-messaging/concept-options

I found an workaround. I put an empty value for "sound" in "notification" field and the silent notifications are delivered even when the application is in background.

{ 
    "to" : "...",
    "priority": "high",
    "notification": {
        "sound": ""
    },
    "data" : {
      ....
    }
}

My hunch is that Apple does not allow silent notifications with a 'high' priority and somehow "notification": {"sound": ""} tricks the APNS that this notification is not a silent one.

I was working on Firebase silent push notification using nodejs. When I tried below code its was working fine. When I was adding "priority": "high" and "content_available": true it was giving below error.

Worked below code

const admin = require('firebase-admin');
const serviceAccount ="...."; //service account path
admin.initializeApp({
  credential: admin.credential.cert(serviceAccount)
});

let  fcmToken = "...."; // Your token
let message ={
    "token": fcmToken,
    "data": {
        "updateApi": "activity"
    }
} 

admin.messaging().send(message)
  .then((response) =>{
    console.log('Successfully sent notification:', response);
})
  .catch((error) =>{
    console.log('Error while sending notification:', error);
});

Error when I added the priority and content_available in message object

{ code: 'messaging/invalid-argument',
     message: 'Invalid JSON payload received. Unknown name "priority" at \'message\': Cannot find field.\nInvalid JSON payload received. Unknown name "content_available" at \'message\': Cannot find field.' },
  codePrefix: 'messaging' }

Please follow the documentation for server side and make setup for json as explained over the document. I have faced similiar problem earlier and solved the issue going this doc.

    {
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
  "priority" : "high",
  "content_available": true,
  "notification" : {
    "body" : "",
    "title" : "",
    "icon" : "new"
  },
  "data" : {
    "volume" : "3.21.15",
    "contents" : "http://www.news-magazine.com/world-week/21659772"
  }
}

content_available = true and body, title empty does the task.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM