Firebase FCM iOS静默推送通知

27

我在iOS上遇到了静默通知的问题。

当我的应用程序在后台时,我无法收到FCM发送的静默通知。但是,如果我尝试直接发送到APNS,通知会成功接收。

这是发送给FCM的JSON:

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

}

这是直接发送到APNS的JSON:

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

我已经尝试删除“priority”键,因为我看到有人说如果已经设置了“content_available”,就不应该设置优先级。但是这并没有起作用。

  1. 我已在XCode > 能力中启用了“推送通知”。
  2. 我在XCode > 能力中的后台模式中选中了“远程通知”。
  3. 当应用程序在前台时,FCM通知运行良好,有时候在后台也能运行。
5个回答

36

移除 "notification" 键值对并添加 "content_available": true

这将如下所示:

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

这应该使它成为一个静默的APNS,您需要使用相应的APNS委托方法处理。

您需要通过委托来处理此问题。请参考Firebase文档以获取详细信息:https://firebase.google.com/docs/cloud-messaging/concept-options


5
我找到了一个解决方法。在“通知”字段中,“声音”设置为空值,即使应用程序在后台运行,也可以收到静默通知。
{ 
    "to" : "...",
    "priority": "high",
    "notification": {
        "sound": ""
    },
    "data" : {
      ....
    }
}

我猜测苹果不允许高优先级的通知静默推送,而 "notification": {"sound": ""} 这个设置会欺骗APNS认为这个通知并非静默推送。


3
一旦设置通知对象后,它就变成了普通的推送通知,而不是静默推送通知。 - Dinesh Raja
1
如何通过 FCM 消息控制台发送静默通知? - Moxarth

2
如果您正在使用云函数,我发现很多信息,甚至是在官方文档中,都已经过时或与typescript接口不同。以下方法最终适用于我:不要设置"alert: "",只需将其省略即可,因为它是可选项。对于自定义属性,您可以添加到message.apns.payload。 fcmToken应该是用户设备上的令牌。
  const message: TokenMessage = {
    token: fcmToken,
    apns: {
      headers: {
        "apns-priority": "5",
      },
      payload: {
        aps: {
          contentAvailable: true,
        },
        my_custom_parameter: true,
      },
    },
  };

  admin
    .messaging()
    .send(message)
    .then(() => {
      // do something.
    })
    .catch((error) => {
      functions.logger.error(
        "Error sending push notification: " + error.toString()
      );
      // Do something.
    });
};

2

我正在使用Node.js开发Firebase静默推送通知。当我尝试以下代码时,它可以正常工作。但是,当我添加了 "priority": "high" 和 "content_available": true 时,就会出现以下错误。

以下代码可以正常工作

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);
});

在消息对象中添加优先级content_available时出现错误。
{ 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' }

1
是的,只需不在上述消息对象中传递prioritycontent_available即可。 - Priy Ranjan
那么如何控制它们的值呢?我在哪里可以更改优先级和content_available的值? - Shubham1164

-2
请按照服务器端文档的说明进行设置,为JSON做好准备。我之前遇到过类似的问题,通过查阅该文档解决了问题。
    {
  "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 且 body、title 为空时,任务完成。


7
但我不希望用户在通知中心收到通知。我只希望收到一个静默通知,在“didReceiveRemoteNotification”方法中执行一些代码。这就是“静默通知”的含义。 - vbgd
@vladiulianbogdan 有什么进展吗? - Shanu Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接