FCM:使用Java Server设置TTL(“ time_to_live”或lifespan)属性(Google文档错误/不清楚) - java

我已经搜索了几个小时,却找不到答案(关于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文件

我能找到的唯一例子是来自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:可选,number:此参数指定在以下情况下消息应在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)

设置消息的生存时间(以毫秒为单位)。

参考方案

混淆文档的一个很好的例子。

您应该使用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();

春天的多属性文件 - java

我在spring中加载属性文件: <context:property-placeholder location="classpath:foo.properties"/> 但是,如果我尝试在另一个上下文文件中加载另一个文件,则会出现错误。 java大神给出的解决方案 如果您需要覆盖属性,则可以执行以下操作:<context…

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

java.net.URI.create异常 - java

java.net.URI.create("http://adserver.adtech.de/adlink|3.0") 抛出java.net.URISyntaxException: Illegal character in path at index 32: http://adserver.adtech.de/adlink|3.0 虽然n…

使用DateTimeFormatterBuilder解析非UTC日期 - java

我正在尝试解析从Bitbucket event payload收到的以下日期字符串:2017-09-19T10:39:36+1000 当输入日期的偏移量为+0000时,它可以工作,但+1000不能。这是一个稍微不标准的日期字符串(从JDK的角度来看),因为偏移量中没有冒号。因此,我制作了一个自定义的DateTimeFormatter,当偏移量为+0000时可…

在Map中,如果我们使用现有键进行修改,则不会获得ConcurrentModificationException - java

我有以下代码,我希望从情况2的情况下抛出ConcurrentModificationException,但它运行成功。据我所知,如果我对地图中的单个键执行相同的操作,则不会抛出异常,因为here但是当我重现这种具有两个案例的多个密钥的场景时,通过新密钥修改。通过现有密钥进行修改。情况1: Map<String,String> mp = new H…