Уведомление FCM - несколько устройств - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь создать группу устройств для случая, когда у пользователя есть несколько устройств.Я сделал карту с токенами устройства.Теперь мне интересно, могу ли я использовать облачные функции для генерации токена группы устройств:

enter image description here

Затем прослушайте изменения в 'app_list' пользователясопоставить и запустить что-то подобное в облачных функциях:

exports.appListAlterado = functions.firestore.document(`usuarios/{idUsuario}`).onUpdate(async (change: any, context: any) => {

    const newValue = change.after.data().app_list;
    console.log("newValue", newValue);
    const regist_ids = [];

    for (const idToken of Object.keys(newValue)) {
        const appToken = newValue[idToken];
        console.log("idToken", idToken);
        console.log("appToken", appToken);
        regist_ids.push(appToken);
    }
    
    console.log("length", regist_ids.length);
    console.log("regist_ids", regist_ids);

});

Я пытался сгенерировать токен группы устройств непосредственно из приложения для Android, но в своих тестах я каждый раз генерировал разные ключи уведомлений (возможно, я что-то делал не так).

Получить ключ уведомления:

public String recuperarChave(String senderId, String userId) throws IOException, JSONException {
        Uri.Builder uriBuilded = new Uri.Builder();
        uriBuilded.scheme("https").appendQueryParameter("notification_key_name", userId)
                .encodedAuthority("fcm.googleapis.com/fcm/notification")
                .build();
        String buildUrl =  uriBuilded.build().toString();
        URL url = new URL( buildUrl);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setDoOutput(false);
        // HTTP request header
        con.setRequestProperty("Authorization", "key=Authorization_Key");
        con.setRequestProperty("project_id", senderId);
        con.setRequestProperty("Content-Type", "application/json");
        con.setRequestProperty("Accent", "application/json");
        con.setRequestMethod("GET");
        con.connect();
        // Read the response into a string
        InputStream is = con.getInputStream();
        String responseString = new Scanner(is, "UTF-8").useDelimiter("\\A").next();
        is.close();
        // Parse the JSON string and return the notification key
        JSONObject response = new JSONObject(responseString);
        return response.getString("notification_key");
    }

Создание группы устройств:

public String criarGrupo(String senderId, String userId, String registrationId)
            throws IOException, JSONException {
        URL url = new URL("https://fcm.googleapis.com/fcm/notification");
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setDoOutput(true);
        // HTTP request header
        con.setRequestProperty("Authorization", "key=Authorization_Key");
        con.setRequestProperty("project_id", senderId);
        con.setRequestProperty("Content-Type", "application/json");
        con.setRequestProperty("Accept", "application/json");
        con.setRequestMethod("POST");
        con.connect();
        // HTTP request
        JSONObject data = new JSONObject();
        data.put("operation", "create");
        data.put("notification_key_name", userId);
        data.put("registration_ids", new JSONArray(Collections.singletonList(registrationId)));
        // Stream
        OutputStream os = con.getOutputStream();
        os.write(data.toString().getBytes(Charset.forName("UTF-8")));
        os.close();
        // Read the response into a string
        InputStream is = con.getInputStream();
        String responseString = new Scanner(is, "UTF-8").useDelimiter("\\A").next();
        is.close();
        // Parse the JSON string and return the notification key
        JSONObject response = new JSONObject(responseString);
        return response.getString("notification_key");
    }

Я также подумал о том, чтобы просто сохранить карту с токенами устройства и выполнить итерации по ним для отправки уведомлений.Но мне интересно, будет ли это хорошей практикой.

Так что мои варианты:

1 - Используйте функции облака для прослушиванияИзменения в базе данных, получение списка сохраненных токенов и управление созданием группы устройств, добавление устройства и удаление устройства. (В таком случае, как это будет сделано?).

2 - Попробуйтеуправлять группой устройств из клиентского приложения. (В документах это не рекомендуется).

3 - Выполните итерацию списка токенов и отправьте сообщение для каждого. (В этом случаеэто будет итерация из списка пользователей и каждого пользователя, итерация в списке / карте токенов пользователя.

4 - Может быть, в последнем снимке я мог бы использовать темы.например, / themes / userId и отписаться, когда пользователь выйдет из системы. (В таком случае мне интересно, было бы неплохо иметь столько тем, сколько у меня пользователей. А в случае, если у меня есть более конкретные темы, это будетплохая практика или создаст какие-то проблемы в будущем).

Интересно, что за воляБуду лучшим подходом для моего случая.

Надеюсь, мой вопрос не сложен для понимания.

Спасибо!

1 Ответ

0 голосов
/ 19 февраля 2019

Я рекомендую решение № 3. Но вам нужно реструктурировать свою базу данных в реальном времени, чтобы она была такой:

fcm_tokens
  - userid
        -device_token1 : fcm token
        -device_token2 : fcm token

Поэтому, когда вам нужно отправить fcm одному из ваших пользователей, вам просто нужнонайти userId пользователя и выполнить итерацию по узлу fcm_tokens\userid\

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