我已经搜索了几个小时,找不到答案(有关其他问题,许多未解决的问题(。
我当前的代码
/**
* 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的正确方法是什么。
我的问题
我想知道我应该如何使用Google似乎使用的setAndroidConfig
方法将30小时的寿命施加到我的消息中。
我的服务器已在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文档
我唯一能找到的示例是来自Google本身。这是一个示例:
@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
零件吗?它使我感到困惑。他们的文档说(强调是我的(:
time_to_to_live :可选,number :此参数指定多长时间(secc量症(,如果将消息保留在FCM存储中,如果 设备离线。支持生命的最大时间是4周, 默认值为4周。有关更多信息,请参阅设置 a的寿命 消息。
他们告诉我们阅读的链接说:
在Android和Web/JavaScript上,您可以指定的最大寿命 一个消息。该值必须是0到2,419,200秒的持续时间 (28天(,它对应于最长时间 FCM存储并尝试传递该消息。没有的要求 将此字段默认值包含在四个星期的最长时间。
他们显然希望这东西在秒中。然而,他们的测试显示毫秒的使用情况!在JavaScript中找到这么多示例是令人沮丧的,而在其文档中几乎没有任何示例!
中的Java中没有什么!本身也可以找到此矛盾文档:
public AndroidConfig.Builder setTtl (long ttl)
以毫秒为单位设置消息的时间持续时间。
一个让文档混淆的好情况。
您应该使用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();