Почему я не могу свернуть мои push-уведомления, когда я использую Firebase FCM?

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 получает несколько уведомлений, все друг на друга. Я бы хотел, чтобы последнее уведомление заменило предыдущие.

Ответ 1

@Timex вы можете передать same notification id для всех уведомлений с тем же collapse_id. Для этого вам нужно реализовать свой собственный SendNotification method.

Ответ 2

Для iOS:

Используйте apns-collapse-id, чтобы увидеть docs.

если вы используете сбрасываемые сообщения, помните, что FCM разрешает использовать только четыре разных ключа развала, которые будут использоваться сервером соединения FCM для каждого регистрационного токена в любой момент времени. Вы не должны превышать это число или это может привести к непредсказуемым последствиям.

Складная:

Использовать сценарий

При появлении более нового сообщения, в котором более старое связанное сообщение не имеет отношения к клиентскому приложению, FCM заменяет более старое сообщение. Например: сообщения, используемые для инициирования синхронизации данных с сервера или устаревшие уведомления.

Как отправить

Задайте соответствующий параметр в запросе вашего сообщения:

  • collapseKey на Android
  • apns-collapse-id на iOS
  • Тема в Интернете
  • collapse_key в устаревших протоколах (все платформы)

См. реализацию 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:

Используйте переменную tag в полезной нагрузке уведомлений.

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

Ответ 3

Ознакомьтесь с разделом "Параметры поставки" в Документация сообщений Firebase FCM.

"разборчивое" поведение сообщений поддерживается на Android через FCM collapse_key, на iOS через 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) до sendToDevice(tokens, patchedPayload, options).

Надеюсь, это сработает для вас!