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

时间:2019-05-01 05:50:33

标签: java android firebase firebase-cloud-messaging

我已经搜索了几个小时,却找不到答案(关于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 可选,数字:此参数指定在以下情况下,消息应在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)

     

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

1 个答案:

答案 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();