Как я могу получить доступ к деталям сообщений Firebase Cloud, отправленных с использованием API FCM? - PullRequest
0 голосов
/ 16 ноября 2018

Я создал прототип лямбда-функции, которая может отправлять автоматические push-уведомления, запрашивая мою базу данных на основе правил, хранящихся в Firebase.Эта функция должна запускаться каждый день.С помощью этой функции ниже я вызываю объект Messaging

private void sentAutomatedMessages(List<String> tokens, CardAbandonmentRule rule) {

    for (String token : tokens) {

        //Create Messaging object for every user that fits in this user
        Messaging msgHandler = new Messaging(rule.getTitle(), rule.getMessage(), token);
        try {
            msgHandler.handleSingleDevicePush();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Определение класса и методы отправки push-уведомлений =>

public class Messaging {

private static final String PROJECT_ID = "<project_id>";
private static final String BASE_URL = "https://fcm.googleapis.com";
private static final String FCM_SEND_ENDPOINT = "/v1/projects/" + PROJECT_ID + "/messages:send";

private static final String MESSAGING_SCOPE = "https://www.googleapis.com/auth/firebase.messaging";
private static final String[] SCOPES = {MESSAGING_SCOPE};

private String title;
private String message;
private String token;

public Messaging(String title, String message, String token) {
    this.title = title;
    this.message = message;
    this.token = token; // <FCM_token>
}

/**
 * Retrieve a valid access token that can be use to authorize requests to the FCM REST
 * API.
 *
 * @return Access token.
 * @throws IOException
 */
private static String getAccessToken() throws IOException {
    GoogleCredential googleCredential = GoogleCredential
            .fromStream(new FileInputStream("<firebase_private_key.json>"))
            .createScoped(Arrays.asList(SCOPES));
    googleCredential.refreshToken();

    return googleCredential.getAccessToken();
}

/**
 * Create HttpURLConnection that can be used for both retrieving and publishing.
 *
 * @return Base HttpURLConnection.
 * @throws IOException
 */
private static HttpURLConnection getConnection() throws IOException {
    // [START use_access_token]
    URL url = new URL(BASE_URL + FCM_SEND_ENDPOINT);
    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
    String accessToken = getAccessToken();
    System.out.println(accessToken);
    httpURLConnection.setRequestProperty("Authorization", "Bearer " + accessToken);
    httpURLConnection.setRequestProperty("Content-Type", "application/json; UTF-8");
    return httpURLConnection;
    // [END use_access_token]
}

/**
 * Construct the body of a notification message request.
 *
 * @return JSON of notification message.
 */
private JsonObject buildNotificationMessage() {
    JsonObject jNotification = new JsonObject();
    jNotification.addProperty("title", this.title);
    jNotification.addProperty("body", this.message);

    JsonObject jMessage = new JsonObject();
    jMessage.add("notification", jNotification);
    jMessage.addProperty("token", this.token);


    JsonObject jFcm = new JsonObject();
    jFcm.add("message", jMessage);

    return jFcm;
}

/**
 * Send request to FCM message using HTTP.
 *
 * @param fcmMessage Body of the HTTP request.
 * @throws IOException
 */
private static void sendtoSingleDevice(JsonObject fcmMessage) throws IOException {
    HttpURLConnection connection = getConnection();
    connection.setDoOutput(true);
    DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
    outputStream.writeBytes(fcmMessage.toString());
    outputStream.flush();
    outputStream.close();

    int responseCode = connection.getResponseCode();
    if (responseCode == 200) {
        String response = inputstreamToString(connection.getInputStream());
        System.out.println("Message sent to Firebase for delivery, response:");
        System.out.println(response);
    } else {
        System.out.println("Unable to send message to Firebase:");
        String response = inputstreamToString(connection.getErrorStream());
        System.out.println(response);
    }
}

/**
 * Public method to send Push Notification
 *
 * @throws IOException
 */
public void handleSingleDevicePush() throws IOException {
    JsonObject notificationMessage = buildNotificationMessage();
    sendtoSingleDevice(notificationMessage);
}

После запуска buildNotificationMessage(),объект сформирован как пример ниже.

// Example Notification Message to send over HTTP
{
  "message": {
    "notification": {
      "title": "title",
      "body": "body"
    },
    "token": "<FCM_token>"
  }
}

Ответ =>

{  "name": "projects/<project_id>/messages/1542324302450893"}

Мне нужно разработать панель управления для отображения списка отправленных сообщений, скорости открытия и аналитики .Однако мне нужны некоторые рекомендации.

1 - Что я могу сделать с этим name, полученным в ответ от FCM REST API ?Я не видел ничего в документации для получения деталей сообщений.

2 - есть ли лучший способ для отправки массовых сообщений для несколькихуникальный токен FCM ?Я вижу кое-что о группах устройств , но Firebase говорит, что это для другой цели.

Обычно под «группой» понимается набор различных устройств, принадлежащих одному пользователю.

Спасибо

1 Ответ

0 голосов
/ 27 ноября 2018

После того, как я связался со службой поддержки Firebase, они рекомендуют мне использовать BigQuery от Google, чтобы просмотреть наборы данных для функции обмена сообщениями в Firebase.

После включения интеграции BigQuery в настройках Firebase вам просто нужно перейти на консоль BigQuery.

Запрос, подобный приведенному ниже, даст вам детали для данного сообщения.

SELECT *
FROM `<project_name>.firebase_messaging.data`
WHERE
   _PARTITIONTIME = TIMESTAMP('<date as YYYY-MM-DD>')
   AND message_id = '<your message id>'
   AND instance_id = '<your instance id>'
ORDER BY event_timestamp;

Ссылка, чтобы увидеть больше примеров и прочитать об интеграции BigQuery для FCM => Понимание доставки сообщения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...