Как отключить облачные сообщения для каждого устройства / пользователя во флаттере? - PullRequest
0 голосов
/ 11 января 2020

Для приложения-флаттера я использую Firebase Cloud Messaging и облачные функции, чтобы отправлять уведомления pu sh пользователям, используя их токены регистрации FCM. В приложении есть страница настроек, где пользователи должны иметь возможность отключать определенные уведомления pu sh. Уведомления задаются пользователем c, поэтому topi c для подписки или отказа от подписки не будет работать, но уведомления могут быть классифицированы по определенным категориям.

Например, в приложении чата, когда пользователь A отправляет сообщение пользователю B, что уведомление pu sh может находиться в категории «сообщений чата», в то время как пользователь A также может удалить чат с пользователем B и это уведомление pu sh может относиться к категории «удаленных чатов».

Как я могу сделать так, чтобы пользователь B мог отключить уведомления для «удаленных чатов», в то же время получая уведомления для «сообщений чата»? Можно ли использовать условие с topi c и регистрационным токеном пользователя тем или иным способом? Любые идеи с благодарностью!

1 Ответ

0 голосов
/ 13 января 2020

Благодаря большому толчку в правильном направлении от Дуга я смог понять это! Разместите мой код ниже, чтобы помочь кому-либо сделать тот же шаг в правильном направлении.

Итак, на странице настроек моего приложения-флаттера пользователь может включать и отключать уведомления для нескольких категорий. Предпочтения пользователя затем сохраняются в указанном пользователем документе c в моей коллекции Cloud Firestore users. Ниже приведен код для примера SwitchListTile, который я использовал на странице настроек.

SwitchListTile(
   title: Text('Admin notifications'),
   subtitle: Text('Maintenance and general notes'),
   onChanged: (value) {
     setState(() {
       adminNotifications = value;
       Firestore.instance
       .collection('users')
       .document(loggedInUser.uid)
       .updateData({
       'adminNotifications': value,
       });
    });
    save('adminNotifications', value);
  },
  value: adminNotifications,
),

В своей облачной функции я добавил ссылку на документ в коллекцию users и чек, чтобы увидеть если значение поля adminNotifications равно true. Если это так, уведомление отправляется, в противном случае уведомление не отправляется пользователю. Ниже я добавил функцию облака. Обратите внимание, что облачная функция выводит «вложенных обещаний» предупреждений, но пока работает! Я все еще начинающий Флаттер, поэтому я был очень рад, что это сработало. Еще раз большое спасибо Дагу!

exports.userNotifications = functions.firestore.document('notifications/{any}').onCreate((change, context) => {
    const userFcm = change.data().fcmToken;
    const title = change.data().title;
    const body = change.data().body;
    const forUser = change.data().for;
    const notificationContent = {
    notification: {
        title: title,
        body: body,
        badge: '1',
        click_action: 'FLUTTER_NOTIFICATION_CLICK',
        }
    };
    var usersRef = db.collection('users');
    var queryRef = usersRef.where('login', '==', forUser).limit(1).get()
    .then(snapshot => {
        snapshot.forEach(doc => {
            const adminNotifications = doc.data().adminNotifications;
            console.log(adminNotifications);

            if(swapNotifications === true){
                return admin.messaging().sendToDevice(userFcm, notificationContent)
                    .then(() => {
                    console.log('notification sent')
                    return
                    })
                    .catch(error =>{
                        console.log('error in sending notification', error)
                    })
                } else {
                    console.log('message not send due to swapNotification preferences')
                }
    return console.log('reading user data success');
    })
    .catch(err => {
        console.log('error in retrieving user data:', err)
    })
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...