当我使用Firebase FCM时为什么无法删除推送通知?

时间:2018-01-02 01:24:15

标签: firebase push-notification apple-push-notifications firebase-cloud-messaging

const options = {
    priority: 'high',
    collapseKey: user_id
};
const deviceTokensPromise = db.ref('/users-fcm-tokens/' + user_id).once('value');
deviceTokensPromise.then(tokensSnapshot => {
    if (!tokensSnapshot.hasChildren()) {
        return console.log('There are no device tokens to send to.');
    }
    const tokens = Object.keys(tokensSnapshot.val());
    console.log(tokens);
    console.log(payload);
     return admin.messaging().sendToDevice(tokens, payload, options).then(response => {
         console.log(response);
         return removeInvalidFCMTokens(tokensSnapshot, response);
     });
});

我的选项中有一个折叠键字段。

运行此代码时,iPhone会收到多个通知,这些通知全部相互叠加。我想将最近的通知替换为以前的通知。

4 个答案:

答案 0 :(得分:3)

@Timex您可以通过same notification id传递具有相同collapse_id的所有通知。为此,您需要实现自己的SendNotification method

答案 1 :(得分:3)

查看"交付选项" Firebase's FCM Messages documentation中的部分。

  

"可折叠" Android上通过FCM size inspector支持消息行为,iOS上通过collapse_key支持,以及通过apns-collapse-id通过JavaScript / Web支持。

直观地,您可能希望Topic设置可能会传入您正在使用的apns-collapse-id方法中的options参数。然而,这种情况并非如此。而是尝试将其修补到sendToMessage对象中,如下所示:

payload

这遵循上面链接的文档中提供的const patchedPayload = Object.assign({}, payload, { apns: { headers: { 'apns-collapse-id': user_id } } }); 格式。

一旦您构建了此修补后的有效负载,请不要忘记将payload更新为sendToDevice(tokens, payload, options)

希望这对你有用!

答案 2 :(得分:2)

对于iOS:

使用apns-collapse-id,请参阅docs

  

如果使用可折叠消息,请记住FCM在任何给定时间每个注册令牌只允许FCM连接服务器使用最多四个不同的折叠键。您不得超过此数字,否则可能会导致不可预测的后果。

     

<强>可折叠:

     

使用方案

     

当有较新的消息呈现与客户端应用程序无关的较旧的相关消息时,FCM会替换旧消息。例如:用于从服务器启动数据同步的消息,或过时的通知消息。

     

如何发送

     

在邮件请求中设置适当的参数:

     
      Android上的
  • collapseKey
  •   iOS上的
  • apns-collapse-id
  •   网络
  • 主题
  •   传统协议(所有平台)中的
  • collapse_key
  •   

请参阅article中的apns-collapse-id的实施:

# Script to send push notifications for each song in a Phish Setlist via an updateable Push Notification.
# Place a config.yml in the same directory as the script and your push notification PEM file.  
#
# Config Format:

# push_token: XXXXXXXXXXXXXX
# phish_api_key: XXXXXXXXXXXXXX
# push_mode: XXXXXXXXXXXXXX # development or production

require 'apnotic'
require 'phish_dot_net_client'
require 'awesome_print'
require 'yaml'

show_date = ARGV[0]

if show_date 

    script_config = YAML.load(File.read(File.expand_path('../config.yml', __FILE__)))

    PhishDotNetClient.apikey = script_config["phish_api_key"]

    the_show = PhishDotNetClient.shows_setlists_get :showdate => show_date

    push_body = ""

    if script_config["push_mode"] == "development"
        connection = Apnotic::Connection.new(cert_path: "pushcert.pem", url: "https://api.development.push.apple.com:443")
    else
        connection = Apnotic::Connection.new(cert_path: "pushcert.pem")
    end

    token = script_config["push_token"] 

    notification       = Apnotic::Notification.new(token)

    notification.apns_id = SecureRandom.uuid

    notification.apns_collapse_id = "Phish " + the_show[0]["showdate"] + ": "

    notification.mutable_content = true

    the_show[0]["setlistdata"].sets.each do |set_data|
        set_name = set_data.name + ": "
        set_data.songs.each do |song|
            song_str = set_name + song.title
            push_body = push_body + set_name + song.title + "\n"
            set_name = ""
            push_content = {'title' => song_str, 'body' => push_body} 
            puts push_content

            notification.alert = push_content

            response = connection.push(notification)

            # read the response
            puts ""
            puts response.ok?      # => true
            puts response.status   # => '200'
            puts response.headers  # => {":status"=>"200", "apns-id"=>"XXXX"}
            puts response.body     # => ""
            puts ""

            sleep(5)

        end

    end

    connection.close
else
    puts "Usage ruby send_push.rb SHOWDATE(Format:YYYY-MM-DD)"
end

对于Android:

notification payload中使用tag变量。

"notification":{
  "title":"Huawei",
  "body":"21 Notification received", 
  "sound":"default",
  "badge":4,
  "tag":"1",
  "click_action":"Your_Activity"
   "icon":"Push_Icon" 
}

答案 3 :(得分:0)

我建议使用 send 中最新的 firebase-admin 函数,用法描述为 here