Ответ 1
@Timex вы можете передать same notification id
для всех уведомлений с тем же collapse_id
. Для этого вам нужно реализовать свой собственный SendNotification method
.
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 получает несколько уведомлений, все друг на друга. Я бы хотел, чтобы последнее уведомление заменило предыдущие.
@Timex вы можете передать same notification id
для всех уведомлений с тем же collapse_id
. Для этого вам нужно реализовать свой собственный SendNotification method
.
Используйте 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
Используйте переменную tag
в полезной нагрузке уведомлений.
"notification":{
"title":"Huawei",
"body":"21 Notification received",
"sound":"default",
"badge":4,
"tag":"1",
"click_action":"Your_Activity"
"icon":"Push_Icon"
}
Ознакомьтесь с разделом "Параметры поставки" в Документация сообщений 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)
.
Надеюсь, это сработает для вас!