使用 FCM 和 Flutter 通过设备发送通知

时间:2021-04-30 06:12:52

标签: flutter dart push-notification firebase-cloud-messaging

目前我正在尝试向多个设备发送通知。我已经阅读了有关如何 send notification to device group 的文档,他们提到我需要使用 registration_ids: [...] 而不是 to: token。而且我还在某处读到他们提到的 notification_key 可以将通知发送到其他设备。所以,我一直在寻找钥匙。但是,经过几天的浏览,我发现 here 表示 notification_key 已经过时了。所以,我想问一下你们有没有人知道如何在不使用控制台的情况下向多台设备发送通知。

这是我发送推送通知的代码段:

try {
  await http.post(
    Uri.parse('https://fcm.googleapis.com/fcm/send'),
    // Uri.parse('https://fcm.googleapis.com/fcm/notification'),

    headers: <String, String>{
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'key=$serverKey',
      'project_id':'....',
    },
    body: jsonEncode(
      <String, dynamic>{
        'notification': <String, dynamic>{
          'body': 'this is a body2',
          'title': 'this is a title'
        },
        'priority': 'high',
        'data': <String, dynamic>{
          'click_action':
          'FLUTTER_NOTIFICATION_CLICK',
          'id': '1',
          'status': 'done'
        },
        'registration_ids': ['fbN9aYoORhihksrTo7j5D2:APA91b......', 'fArqpgKrTJ0fL8SUKddy2F:APA91bFWf1cnVMS8.......'],
        // 'to': _token,
      },
    ),
  );
} catch (e) {
  print("error push notification");
}

如果我使用 to 而不是 registration_ids,它工作正常,但据我所知,如果我只想为一台设备发送通知,则使用它。

我已经在这个问题上坚持了三天,但仍然没有找到任何解决方案。他们中的大多数人都在使用控制台。你的帮助真的会让我开心。提前致谢!

1 个答案:

答案 0 :(得分:0)

我找到了一个解决方案和它的工作!

 var serverKey =
    'AAAAUb...';
QuerySnapshot ref =
    await FirebaseFirestore.instance.collection('users').get();


try {
  ref.docs.forEach((snapshot) async {
    http.Response response = await http.post(
      Uri.parse('https://fcm.googleapis.com/fcm/send'),
      headers: <String, String>{
        'Content-Type': 'application/json',
        'Authorization': 'key=$serverKey',
      },
      body: jsonEncode(
        <String, dynamic>{
          'notification': <String, dynamic>{
            'body': 'this is a body',
            'title': 'this is a title'
          },
          'priority': 'high',
          'data': <String, dynamic>{
            'click_action': 'FLUTTER_NOTIFICATION_CLICK',
            'id': '1',
            'status': 'done'
          },
          'to': snapshot.data() ['tokenID'],
        },
      ),
    );
  });
} catch (e) {
  print("error push notification");
}