如何向话题发送通知

5
我需要一段代码,可以在特定主题上从一个设备向多个设备发送通知,并显示在已订阅该主题的设备上。我将使用Firestore存储数据和令牌,并使用Firebase消息传递通知。
5个回答

9

以下是我的代码,用于发送特定主题的通知

希望这对新开发者有所帮助。

import 'package:http/http.dart' as http;

Future<void> sendNotification(subject,title) async{

final postUrl = 'https://fcm.googleapis.com/fcm/send';

String toParams = "/topics/"+'yourTopicName';

final data = {
"notification": {"body":subject, "title":title},
"priority": "high",
"data": {
"click_action": "FLUTTER_NOTIFICATION_CLICK",
"id": "1",
"status": "done",
"sound": 'default',
"screen": "yourTopicName",
},
"to": "${toParams}"};

final headers = {
'content-type': 'application/json',
'Authorization': 'key=key'

};

final response = await http.post(postUrl,
body: json.encode(data),
encoding: Encoding.getByName('utf-8'),
headers: headers);

if (response.statusCode == 200) {
// on success do 
print("true");
} else {
// on failure do 
print("false");

}
}

通过以下方式订阅

FirebaseMessaging _firebaseMessaging =  FirebaseMessaging();
_firebaseMessaging.subscribeToTopic("yourTopicName");

1
Firebaser在此 调用 FCM REST API 需要在您的代码中指定 FCM *服务器**密钥。正如其名称所示,此密钥应仅在服务器端代码或其他受信任的环境中使用。原因是拥有 FCM 服务器密钥的任何人都可以向您所有用户发送任何消息。通过将此密钥包含在您的应用程序中,恶意用户可以找到它,并使您的用户面临风险。请参见我的答案和 https://dev59.com/Y1oT5IYBdhLWcg3w8jFm#37993724 获取更好的解决方案。 - Frank van Puffelen

5
发送消息 设备需要调用 Firebase 云消息传递 API 并指定 FCM 服务器密钥。正如其名称所示,此密钥应仅在受信任的环境中使用,例如您的开发机器、您控制的服务器或类似 Cloud Functions 的环境。这是必需的原因是,拥有您的 FCM 服务器密钥的任何人都可以向您的应用程序所有用户发送消息。
最简单的入门方法是运行一个 curl 命令或类似于此的命令,调用 旧版 FCM REST API。在此处查看一个示例:如何在不使用 Firebase 控制台的情况下发送 Firebase 云消息通知? 要发送到主题,请确保 to 值为类似于 "/topics/your_topic" 的内容。
对于更高级的生产级别,您可能需要引入服务器或使用 Cloud Functions。然后,发送消息将成为一个多步过程,如下所示:
  1. 想要发送消息的客户端,将该消息写入数据库或调用API。
  2. 此写操作会触发您的服务器或云函数,该服务器或云函数验证请求(确定该用户有权发送此消息)。
  3. 然后,服务器端代码 调用Firebase Admin API将消息发送到主题

关于此示例,请参阅functions-samples存储库中的文件夹

另请参见:


3

1
根据firebase_messaging自述文件页面的最后一节,您无法使用flutter firebase_messaging库发送云消息,请参阅发送消息
要订阅用户到主题:
FirebaseMessaging _firebaseMessaging =  FirebaseMessaging();
_firebaseMessaging.subscribeToTopic("MyTopic");

这将会订阅该设备到主题“MyTopic”中。
您也可以通过以下方式取消订阅:
_firebaseMessaging.unsubscribeFromTopic("MyTopic");

我想知道如果用户卸载并重新安装应用程序会发生什么,他将失去所有已订阅的主题吗?还是需要再次订阅它们?谢谢! - Jorge Vieira
请查看此链接:https://firebase.google.com/docs/cloud-messaging/android/client#sample-register。当用户订阅时,这意味着他的注册令牌(唯一与应用实例相关联的标识符)将与主题相关联。在文档中,您会看到如果应用被卸载并重新安装,则该注册令牌将更改。 - Ahmed AL-Yousif
那么如果令牌改变,我就必须重新注册这些人,对吗? - Jorge Vieira
1
是的,你需要这样做。就好像他们已经登录并删除了应用程序一样,当他们重新下载应用程序时,他们必须再次登录。 - Ahmed AL-Yousif

0
在 Main.dart 文件中添加主题名称。
void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp(options: DefaultFirebaseOptions.currentPlatform);
  FirebaseMessaging fcmMessage = FirebaseMessaging.instance;
  await fcmMessage.subscribeToTopic('testNotification');
  runApp(const MyApp());
}

添加HTTP POST请求

final data = {
      'to': '/topics/testNotification',
      'notification': {
        'body':'Simple Notification',
        'title': 'Test Notification',
        
      }
    };
    String url = 'https://fcm.googleapis.com/fcm/send';
    try {
      final result = await http.post(
        Uri.parse(url),
        body: jsonEncode(data),
        headers: {
          'Content-type': 'application/json',
          'Authorization':
              'key=AAAAm5+++++++++++++++Authorization Token+++++++++++++'
        },
      );
      print(jsonDecode(result.body));
      return jsonDecode(result.body);
    } catch (e) {
      print(e);
      return {'error': e};
    }


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接