在 flutter 中向特定用户 firebase 发送通知

2023-11-23

当一个用户按下按钮时,如何向另一个用户发送通知?有人可以给我看一个代码片段吗?

我意识到这个问题之前曾被问过,但是,由于有“几个答案”,所以它被关闭了。提供的类似链接并未解释在中发送通知flutter.


我已经弄清楚如何使用应用程序内功能将通知发送到另一台设备。

首先,您需要导入必要的包:

firebase_消息传递
flutter_local_notifications

注意:您还将使用http package

另请注意:要将通知发送到另一个设备,您必须知道该设备的设备令牌。我更喜欢获取令牌并将其保存在 Firestore 或实时数据库中。这是获取设备令牌的代码。

String? mtoken = " ";

void getToken() async {
    await FirebaseMessaging.instance.getToken().then((token) {
      setState(() {
        mtoken = token;
      });
    });
  }

该令牌将保存在 mtoken 中,您现在可以使用它作为后续步骤的令牌。

发送通知的代码

Enable FIrebase Cloud Functions in your Firebase project, this must use the Firbebase Blaze Plan.

In my functions文件夹,我将这段代码添加到index.js

 /* eslint-disable */
const functions = require("firebase-functions");
const admin = require("firebase-admin");

admin.initializeApp();

exports.sendNotification = functions.https.onCall(async (data, context) => {
  await admin.messaging().sendMulticast({
  tokens: data.tokens,
  notification: {
    title: data.title,
    body: data.body,
    imageUrl: data.imageUrl,
  },
});

确保部署您的 Firebase 云功能。如果你看到这个,你就会知道它是否有效。

enter image description here

您可以使用以下代码在 Flutter 应用程序中调用此函数

Future<void> sendNotification(
  tokens,
  String title,
  String body,
  String imageUrl,
) async {
  FirebaseFunctions functions =
      FirebaseFunctions.instanceFor(region: 'us-central1');

  try {
    final HttpsCallable callable = functions.httpsCallable('sendNotification');
    final response = await callable.call({
      'tokens': tokens,
      'title': title,
      'body': body,
      'imageUrl': imageUrl,
    });

    print('Message sent: ${response.data}');
  } catch (e) {
    print('Error sending message: $e');
  }
}

接收通知的代码

下一步是请求向您的应用程序发送推送通知的权限。

  void requestPermission() async {
    FirebaseMessaging messaging = FirebaseMessaging.instance;

    NotificationSettings settings = await messaging.requestPermission(
      alert: true,
      announcement: false,
      badge: true,
      carPlay: false,
      criticalAlert: false,
      provisional: false,
      sound: true,
    );

    if (settings.authorizationStatus == AuthorizationStatus.authorized) {
      print('User granted permission');
    } else if (settings.authorizationStatus ==
        AuthorizationStatus.provisional) {
      print('User granted provisional permission');
    } else {
      print('User declined or has not accepted permission');
    }
  }

(如果您在控制台中收到“用户拒绝或未接受权限”,请尝试退出您的应用程序,在主屏幕中找到该图标,按住应用程序图标,点击“应用程序信息”,点击“通知”,然后开启“所有[应用程序名称]通知”。

您还需要两个函数来加载 Firebase Cloud Messaging 通知,以及一个函数来监听通知。

加载 Firebase 云消息通知的代码:

 void loadFCM() async {
    if (!kIsWeb) {
      channel = const AndroidNotificationChannel(
        'high_importance_channel', // id
        'High Importance Notifications', // title
        importance: Importance.high,
        enableVibration: true,
      );

      flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();

      /// Create an Android Notification Channel.
      ///
      /// We use this channel in the `AndroidManifest.xml` file to override the
      /// default FCM channel to enable heads up notifications.
      await flutterLocalNotificationsPlugin
          .resolvePlatformSpecificImplementation<
              AndroidFlutterLocalNotificationsPlugin>()
          ?.createNotificationChannel(channel);

      /// Update the iOS foreground notification presentation options to allow
      /// heads up notifications.
      await FirebaseMessaging.instance
          .setForegroundNotificationPresentationOptions(
        alert: true,
        badge: true,
        sound: true,
      );
    }
  } 

此函数用于侦听 Firebase Cloud Messaging 通知。

void listenFCM() async {
    FirebaseMessaging.onMessage.listen((RemoteMessage message) {
      RemoteNotification? notification = message.notification;
      AndroidNotification? android = message.notification?.android;
      if (notification != null && android != null && !kIsWeb) {
        flutterLocalNotificationsPlugin.show(
          notification.hashCode,
          notification.title,
          notification.body,
          NotificationDetails(
            android: AndroidNotificationDetails(
              channel.id,
              channel.name,
              // TODO add a proper drawable resource to android, for now using
              //      one that already exists in example app.
              icon: 'launch_background',
            ),
          ),
        );
      }
    });
  }

初始化页面时,您将需要运行 loadFCM、listenFCM 和 requestPermission。

  void initState() {
    super.initState();
    requestPermission();
    loadFCM();
    listenFCM();
  }

过时的方法

此代码已弃用,并且由于在应用程序中使用 API 密钥而包含安全问题,可以对其进行反向工程以使用 API 密钥作为应用程序发送通知。仅将此用于测试,因为您不需要 Firebase Cloud Functions 来执行此操作。

下一步是找到你的Firebase Cloud MessagingAPI 密钥。只需转到您的 Firebase 项目 > 项目设置 > 云消息传递,然后将 API 密钥复制到下面即可完成Cloud Messaging API (Legacy).

当您拥有 Firebase Cloud Messaging API 密钥时,这是在给定通知标题、正文和要发送到的设备令牌的情况下显示通知的代码。

  void sendPushMessage(String body, String title, String token) async {
    try {
      await http.post(
        Uri.parse('https://fcm.googleapis.com/fcm/send'),
        headers: <String, String>{
          'Content-Type': 'application/json',
          'Authorization':
              'key=REPLACETHISWITHYOURAPIKEY',
        },
        body: jsonEncode(
          <String, dynamic>{
            'notification': <String, dynamic>{
              'body': body,
              'title': title,
            },
            'priority': 'high',
            'data': <String, dynamic>{
              'click_action': 'FLUTTER_NOTIFICATION_CLICK',
              'id': '1',
              'status': 'done'
            },
            "to": token,
          },
        ),
      );
      print('done');
    } catch (e) {
      print("error push notification");
    }
  }

现在你可以像这样调用这个函数:

sendPushMessage('Notification Body', 'Notification Title', 'REPLACEWITHDEVICETOKEN');

我希望这有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 flutter 中向特定用户 firebase 发送通知 的相关文章

  • Recyclerview 动态部分不使用任何第三个库

    我想将标头添加到 recyclerview 我正在尝试使用来实现它 Override public int getItemViewType int position depends on your problem if position 0
  • 如何使用 Google Maps for Android V2 处理地图移动结束?

    我想在地图中心更改后立即对地址进行地理编码 如何使用新的 Android 版 Google 地图 V2 处理地图移动 我说的是用户用手指拖动地图的情况 查看新的地图 API Override public void onMapReady G
  • Dart 2.2 之后如何设置文字

    直到 2 2 才支持设置文字 如何在 Dart 2 2 之后设置文字 请随意发表评论 谢谢 class item t String name int weight int value main const List
  • 自定义首选项中的android首选项水平分隔线?

    我创建了自己的自定义首选项对象来扩展首选项 我创建它们只是因为这些自定义数据类型没有首选项 一切正常 但我的自定义首选项没有相同的外观 因为它们缺少系统首选项对象具有的水平分隔线 我已经查找了创建水平分隔线的代码 但我找不到它是在哪里完成的
  • Bitmap.getPixels() 中的 IllegalArgumentException

    我想将数据从位图复制到int using getPixels 这是我当前的代码 int pixels new int myBitmap getHeight myBitmap getWidth myBitmap getPixels pixel
  • OnUpgrade SQFLITE:未处理的异常:DatabaseException(表 UsernameTable 没有名为 RememberMe 的列(Sqlite 代码 1):

    未处理的异常 DatabaseException 表 UsernameTable 没有 名为 RememberMe 的列 Sqlite 代码 1 编译时 INSERT OR 替换为 UsernameTable 用户名 rememberMe
  • Dialog.setTitle 不显示标题

    我正在尝试向我的对话框添加自定义标题 但是每当我运行我的应用程序时 它都不会显示标题 我创建对话框的代码是 final Dialog passwordDialog new Dialog this passwordDialog setCont
  • 当它的父级是 ConstraintLayout 时设计 CardView 吗?

    我在编辑包含Relativelayout的Cardview内的RelativeLayout时搞砸了 ConstraintLayout会将相对布局的wrap content更改为0并添加工具 layout editor absoluteX 1
  • 在 android 中建立与 MySQL 的池连接

    我需要从我的 Android 应用程序访问 MySQL 数据库 现在所有的工作都通过 DriverManager getConnection url 等等 但我必须从多个线程访问数据库 所以我必须使用连接池 问题1 是 com mysql
  • Android 中如何通过彩信发送图片?

    我正在开发多媒体应用程序 我正在通过相机捕获一张图像 并希望将该图像和文本发送到其他号码 但我不知道如何通过彩信发送图像 MMS 只是一个 http post 请求 您应该使用执行请求额外的网络功能 final ConnectivityMa
  • Flutter 中有预填充数据库使用的示例吗?

    Flutter 中有预填充数据库使用的示例吗 我不需要 CRUD 示例 此时我只需要从数据库读取数据即可 我是 Flutter 新手 所以一步一步的教程会很好 您可以将您的应用程序与预填充的 sqlite 数据库捆绑在一起assets文件夹
  • Android 2.3 模拟器在更新位置时崩溃

    我正在使用 Eclipse 编写和调试 Android 应用程序 我需要做的事情之一是更新设备的位置 因此我尝试使用模拟器控制窗口中的位置控制面板 在 手动 选项卡上 我选择 十进制 输入有效的纬度和经度 然后单击 发送 不幸的是 接下来发
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • Dagger 2 没有生成我的组件类

    我正在使用 Dagger 2 创建我的依赖注入 几个小时前它还在工作 但现在不再生成组件 这是我创建组件的地方 public class App extends Application CacheComponent mCacheCompon
  • Android Studio 缓慢的增量构建

    我已经完成了许多步骤来完善我们的构建系统 those https stackoverflow com questions 16775197 building and running app via gradle and android st
  • 插件“Android Bundle Support”不兼容

    大家好 自从上次更新以来 当我启动 android studio 时 我遇到了一个非常奇怪的错误 我有这个错误 插件错误 插件 Android Bundle Support 不兼容 直到构建 AI 195 SNAPSHOT 我在网上找不到任
  • 如何使用 AccessibilityService 在 Android 中模拟按键

    我正在编写一个辅助服务 我一直在尝试在应用程序上进行一些自动搜索 我使用accessibilityservice action paste来填充EditText 然后我需要模拟软键盘上的按键 但我不知道如何做 你们能帮我一下吗 你可以尝试A
  • 错误:(23, 13) 无法解决:com.google.android.gms:play-services:11.2.0“安装存储库和同步项目”不起作用

    我正在尝试在我的 Android 应用程序中获取位置并更新到服务器 这是我的 Gradle 代码 我在这里包含了compile com google android gms play services 11 2 0 这条线是从文档中 htt
  • 我的应用程序中的后退按钮出现问题[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想在手机关闭时清除共享首选项值 你
  • 无效字符错误:“fred”

    我确信他一定是一个新手问题 简单来说 我想定义我的第一个 Polymer dart 组件 只是我一直在同一个减速带上踢脚趾 为了使事情变得非常简单 我将其简化为一个非常简单的示例 我做了一个简单的rename示例 跑表 来自 Dart 组件

随机推荐

  • 检查 PowerShell 中每行的第一个字符是否有特定值

    我正在读取包含特定格式数字的文本文件 我想弄清楚该行的第一个字符是 6 还是 4 并将整行存储在数组中以供以后使用 因此 如果该行以 6 开头 则将整行添加到 SixArray 中 如果该行以 4 开头 则将整行添加到 fourArray
  • 核心运动错误102是什么意思?

    我使用 Core Motion 的传感器融合来获取北向运动更新 motionManager startDeviceMotionUpdatesUsingReferenceFrame CMAttitudeReferenceFrameXTrueN
  • 如何将 openssl 添加到 swift 项目

    我正在学习如何向我的 iOS OSX 项目添加应用内购买收据验证 有一个很好的概述hereWWDC14 有关于这个主题的精彩视频 示例代码很多 但每个人都跳过一步 如何导入 openSSL 标头 swift 编译器抱怨没有这样的模块 imp
  • 在一个 SQL 查询中合并两个表并使日期值唯一

    我有以下两个表 您也可以在 SQL fiddle 中找到它们here CREATE TABLE Inbound Inbound Date DATE Product TEXT InboundType TEXT Quantity VARCHAR
  • 对于每个 int x: x+1 > x .... 这总是正确的吗?

    我刚刚开始在学校学习 C 我正在努力掌握基本概念 我们的作业有一个问题 对于每一个int x x 1 gt x 判断正确与否 正确则给出推理 错误则给出反例 我很困惑 因为我们被告知 int 类型是 32 位 这基本上意味着整数是二进制格式
  • iOS 8.3 Xcode 6.3.1 中未调用核心位置委托方法

    我试图使用 Xcode 6 3 1 中的核心位置框架获取用户的当前位置 我做了以下事情 Added 核心位置框架 under Target gt General gt 链接的框架和库 My 视图控制器 h文件如下图所示 import
  • 使用ajax通过POST向php传递多个参数

    我正在尝试使用 AJAX 通过 POST 方法将多个参数传递到我的 PHP 文件 以便我可以对 MySQL 数据库进行查询 HTML 文件 div class dropdown dropdown dark div
  • 使用 Devise after_sign_in_path_for 重定向循环

    我有一个菜鸟问题 我想要设计重定向到用户访问的最后一个页面 所以我做了以下 def after sign in path for resource request referer end 效果很好 除非用户实际上通过原始表单登录 这会导致重
  • 在 C++ 中,通过引用扩展范围是否安全?

    在 C 中 通过引用扩展范围是否安全 在代码中 我的意思是 MyCLass function badIdea MyClass obj1 return obj1 通过引用扩展范围是不安全的 C 中的对象没有引用计数 当 obj1 超出范围时
  • XFL - ./bin/*.dat 文件是什么?

    未压缩的 Adob e Flash XFL 格式仍保留大量压缩内容 有人知道这些二进制 dat 文件的规范吗 dat 文件存储各种类型的媒体内容 到目前为止我能说的是 图像存储为 JPEG 没有附加信息 这意味着只需重命名 dat 就足以获
  • 创建自定义上传进度条

    我见过所有的上传进度条插件 小部件等 它们都很糟糕 它们要么体积太大 有太多无用的代码 要么不起作用 我想知道在哪里可以阅读如何显示简单的上传进度指示器 大多数浏览器下面都有一个状态进度条 但在与客户打交道时仅使用它不太专业 浏览器是如何做
  • Android手写识别[关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我需要分析android手写识别SDK 谁能告诉我市场上有哪些 SDK 我发现了MyScript来自 VisionObjects 但我找不到 SDK 的任何下载链接 因为我需要测试以
  • 将数字格式设置为固定宽度,并带有前导零[重复]

    这个问题在这里已经有答案了 下面的代码 a lt seq 1 101 25 b lt paste name 1 length a sep 产生这个输出 name 1 name 26 name 51 name 76 name 101 我希望所
  • 使用参数包将 lambda 转换为 std::function

    SO 有几个问题与将 lambda 转换为std functions 但我还没有看到使用参数包作为参数列表的 这在我的 g 版本 7 1 1 4 上似乎被破坏了 并且可能只是不受支持 那么这是合法的 c 17 按照标准 吗 如果没有 为什么
  • 可扩展的内存分配器体验

    我目前正在评估一些可扩展的内存分配器 即 nedmalloc 和 ptmalloc 两者都构建在 dlmalloc 之上 作为默认 malloc new 的替代品 因为在多线程环境中出现了严重的争用 他们公开的表现似乎不错 但我想看看其他真
  • 如何在 Heroku 云上部署 Scrapy 蜘蛛

    我在 scrapy 中开发了一些蜘蛛 我想在 Heroku 云上测试它们 有人知道如何在 Heroku 云上部署 Scrapy 蜘蛛吗 是的 在 Heroku 上部署和运行 Scrapy 蜘蛛相当简单 以下是使用真实 Scrapy 项目作为
  • Wix Bootstrapper MSI-Package 日志记录,如何?

    我有一个安装了的引导程序MSI 包 我怎样才能至少记录 msi 软件包安装 详细记录 我在哪里可以设置日志文件路径 因为我无法记录我猜的所有内容 不 我don t want a cmd 解决方案 我需要实现这个进入我的设置 找到了 LogP
  • Maven:属性标签中pom.xml中的if语句

    如果设置了环境变量 我想设置一个属性 我在谷歌上搜索了很多 我发现的只是类似于下面的代码 但我不断收到错误 致命 不可解析的 POM Y Maven parent pom pom xml TEXT 后面必须紧跟 END TAG 而不是 ST
  • “new int(100)”有什么作用?

    可能的重复 这是变量还是函数 我错误地使用了类似的东西 int arr new int 100 它通过了编译 但我知道这是错误的 它应该是 int arr new int 100 当我写错了 编译器会认为是什么 第一行分配一个int并将其初
  • 在 flutter 中向特定用户 firebase 发送通知

    当一个用户按下按钮时 如何向另一个用户发送通知 有人可以给我看一个代码片段吗 我意识到这个问题之前曾被问过 但是 由于有 几个答案 所以它被关闭了 提供的类似链接并未解释在中发送通知flutter 我已经弄清楚如何使用应用程序内功能将通知发