我已经搜索了几个小时,却找不到答案(关于SO的许多未回答的问题,等等)。
/**
* Use when the server has determined how many Alerts are situated inside
* a single Monitored Zone of a user.
*
* Documentation:
* https://firebase.google.com/docs/cloud-messaging/admin/send-messages
*
* @param registrationToken tokens of the devices the notif is sent to
* @param mzName name of the Monitored Zone (can be its ID)
* @param nbrAlertes number of alerts detected inside the MZ
*/
public static void sendMzLiveAlertNotif(ArrayList<String> registrationToken,
String mzName, int nbrAlertes) {
if(registrationToken.size() == 0 || nbrAlertes == 0 || mzName.isEmpty())
return;
registrationToken.forEach(token -> {
// See documentation on defining a message payload.
Message message = Message.builder()
.putData("title", NotifType.NEW_LIVE_ALERT.getTitle())
.putData("body", "\"" + mzName + "\" contient " + nbrAlertes + " alertes.")
.putData("tag", mzName)
.putData("nbrAlerts", nbrAlertes+"")
.setToken(token)
.build();
try {
// Send a message to the device.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);
} catch (Exception e) {
e.printStackTrace();
}
});
}
这非常有效,直到我想为通知添加有效期。我仍在尝试找出使用Java的正确方法。
我想知道我应该如何对消息施加30小时的使用寿命(以及为什么使用Google似乎使用的setAndroidConfig
方法在没有我的情况下仍然有效)。
我的服务器以Java
编码,并且通知被推送到Android
应用程序。
我最初的想法是去:
Message message = Message.builder()
.putData("title", NotifType.NEW_LIVE_ALERT.getTitle())
.putData("body", "\"" + mzName + "\" contient " + nbrAlertes + " alertes.")
.putData("tag", mzName)
.putData("nbrAlerts", nbrAlertes+"")
.setToken(token)
.setAndroidConfig(AndroidConfig.builder()
.setTtl(3600 * 30) // 30 hours ?
.build())
.build();
...但是在了解Google如何将AndroidConfig
用于整个过程之后,我想知道是否也应该这样做。
我能找到的唯一例子是来自Google本身。这是an example:
@Test
public void testAndroidMessageWithoutNotification() throws IOException {
Message message = Message.builder()
.setAndroidConfig(AndroidConfig.builder()
.setCollapseKey("test-key")
.setPriority(Priority.HIGH)
.setTtl(10)
.setRestrictedPackageName("test-pkg-name")
.putData("k1", "v1")
.putAllData(ImmutableMap.of("k2", "v2", "k3", "v3"))
.build())
.setTopic("test-topic")
.build();
Map<String, Object> data = ImmutableMap.<String, Object>of(
"collapse_key", "test-key",
"priority", "high",
"ttl", "0.010000000s", // 10 ms = 10,000,000 ns
"restricted_package_name", "test-pkg-name",
"data", ImmutableMap.of("k1", "v1", "k2", "v2", "k3", "v3")
);
assertJsonEquals(ImmutableMap.of("topic", "test-topic", "android", data), message);
}
您看到.setTtl(10)
和"ttl", "0.010000000s", // 10 ms = 10,000,000 ns
部分吗?这让我感到困惑。 Their documentation说(强调是我的):
time_to_live :可选,数字:此参数指定在以下情况下,消息应在FCM存储中保留多长时间(秒)。 设备离线。支持的最长生存时间为4周,并且 默认值为4周。有关更多信息,请参见Setting the lifespan of a message。
他们告诉我们阅读的链接说:
在Android和Web / JavaScript上,您可以指定最大使用寿命 一个消息。该值的持续时间必须为0到2,419,200秒 (28天),它对应于 FCM存储并尝试传递消息。没有的要求 包含此字段的默认期限为最长四个星期。
他们显然希望事情在秒之内。但是他们的测试显示使用毫秒吗?在JavaScript中找不到如此多的示例,而在其文档中却几乎找不到Java的示例,这真令人沮丧!
就其本身而言,也可以发现以下矛盾之处:矛盾 documentation:
public AndroidConfig.Builder setTtl (long ttl)
设置消息的生存时间(以毫秒为单位)。
答案 0 :(得分:0)
混淆文档的好例子。
您应该使用ms
,所以30个小时后您会得到类似这样的信息:
Message message = Message.builder()
.putData("title", NotifType.NEW_USER_ALERT.getTitle())
.putData("body", "\"" + mzName + "\" contient " + nbrAlertes + " alertes.")
.putData("tag", mzName)
.putData("nbrAlerts", nbrAlertes+"")
.setToken(token)
.setAndroidConfig(AndroidConfig.builder()
.setTtl(30*3600*1000) // 30 hours
.build())
.build();