Я пытаюсь создать группу устройств для случая, когда у пользователя есть несколько устройств.Я сделал карту с токенами устройства.Теперь мне интересно, могу ли я использовать облачные функции для генерации токена группы устройств:
Затем прослушайте изменения в '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 и отписаться, когда пользователь выйдет из системы. (В таком случае мне интересно, было бы неплохо иметь столько тем, сколько у меня пользователей. А в случае, если у меня есть более конкретные темы, это будетплохая практика или создаст какие-то проблемы в будущем).
Интересно, что за воляБуду лучшим подходом для моего случая.
Надеюсь, мой вопрос не сложен для понимания.
Спасибо!