firebase_messaging 6.0.15

  • Readme
  • Changelog
  • Example
  • Installing
  • 100

Firebase Cloud Messaging for Flutter #

pub package

Flutter插件,可使用Firebase Cloud Messaging(FCM)API .

使用此插件,您的Flutter应用程序可以在Android和iOS上接收和处理推送通知以及数据消息. 阅读Firebase的关于FCM消息,以了解有关通知消息和数据消息之间差异的更多信息.

有关其他Firebase产品的Flutter插件,请参阅README.md .

Usage #

要使用此插件,添加firebase_messaging您pubspec.yaml文件相关 .

Getting Started #

使用Firebase Cloud Messaging检出示例应用程序的example目录.

Android Integration #

要将插件集成到应用程序的Android部分,请执行以下步骤:

  1. 使用Firebase控制台将Android应用添加到您的项目中:跟随助手,下载生成的google-services.json文件,并将其放在android/app .

  2. 将类路径添加到[project]/android/build.gradle文件中.

dependencies {
  // Example existing classpath
  classpath 'com.android.tools.build:gradle:3.5.3'
  // Add the google services classpath
  classpath 'com.google.gms:google-services:4.3.2'
}
  1. 将apply插件添加到[project]/android/app/build.gradle文件中.
// ADD THIS AT THE BOTTOM
apply plugin: 'com.google.gms.google-services'

注意:如果本节未完成,您将收到如下错误:

java.lang.IllegalStateException:
Default FirebaseApp is not initialized in this process [package name].
Make sure to call FirebaseApp.initializeApp(Context) first.

注意:在Android上调试时,请使用具有Google Play服务的设备或AVD. 否则,您将无法进行身份验证.

  1. (可选的,但建议)如果想在你的应用程序被通知(经由onResumeonLaunch ,见下文)时对系统中的通知用户点击托盘包括以下intent-filter的内<activity>您的标签android/app/src/main/AndroidManifest.xml
  <intent-filter>
      <action android:name="FLUTTER_NOTIFICATION_CLICK" />
      <category android:name="android.intent.category.DEFAULT" />
  </intent-filter>

Optionally handle background messages

旨在快速执行后台消息处理. 不要执行长时间运行的任务,因为Android系统可能不允许这些任务完成. 有关更多信息,请参见后台执行限制 .

默认情况下,不启用后台消息传递. 要在后台处理消息:

  1. 在通常位于<app-name>/android/app/build.gradle应用程序级别build.gradle文件中添加com.google.firebase:firebase-messaging依赖<app-name>/android/app/build.gradle .

    dependencies {
      // ...
    
      implementation 'com.google.firebase:firebase-messaging:<latest_version>'
    }
    

    注意:您可以在此处找到该插件的最新版本(" Cloud Messaging") .

  2. 在与MainActivity.java相同的目录中,将Application.java类添加到您的应用程序中. 通常可以在<app-name>/android/app/src/main/java/<app-organization-path>/ .

    package io.flutter.plugins.firebasemessagingexample;
    
    import io.flutter.app.FlutterApplication;
    import io.flutter.plugin.common.PluginRegistry;
    import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
    import io.flutter.plugins.GeneratedPluginRegistrant;
    import io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService;
    
    public class Application extends FlutterApplication implements PluginRegistrantCallback {
      @Override
      public void onCreate() {
        super.onCreate();
        FlutterFirebaseMessagingService.setPluginRegistrant(this);
      }
    
      @Override
      public void registerWith(PluginRegistry registry) {
        GeneratedPluginRegistrant.registerWith(registry);
      }
    }
    
  3. Application.java ,确保更改package io.flutter.plugins.firebasemessagingexample; 您的包裹的标识符. 包的标识符应类似于com.domain.myapplication .

    package com.domain.myapplication;
    
  4. AndroidManifest.xml设置应用程序的name属性. 通常可以在<app-name>/android/app/src/main/ .

    <application android:name=".Application" ...>
    
  5. 定义一个TOP-LEVELSTATIC函数来处理后台消息

    Future<dynamic> myBackgroundMessageHandler(Map<String, dynamic> message) {
      if (message.containsKey('data')) {
        // Handle data message
        final dynamic data = message['data'];
      }
    
      if (message.containsKey('notification')) {
        // Handle notification message
        final dynamic notification = message['notification'];
      }
    
      // Or do other work.
    }
    

    注意: datanotification协议与RemoteMessage定义的字段一致 .

  6. 调用configure时设置onBackgroundMessage处理程序

    _firebaseMessaging.configure(
          onMessage: (Map<String, dynamic> message) async {
            print("onMessage: $message");
            _showItemDialog(message);
          },
          onBackgroundMessage: myBackgroundMessageHandler,
          onLaunch: (Map<String, dynamic> message) async {
            print("onLaunch: $message");
            _navigateToItemDetail(message);
          },
          onResume: (Map<String, dynamic> message) async {
            print("onResume: $message");
            _navigateToItemDetail(message);
          },
        );
    

    注意: configure应该在应用程序生命周期的早期被调用,以便可以尽早接收消息. 参见示例应用程序进行演示.

iOS Integration #

要将插件集成到应用程序的iOS部分,请执行以下步骤:

  1. 遵循Firebase文档中的本指南 ,生成Apple接收推送通知所需的证书. 您可以跳过标题为"创建配置文件"的部分.

  2. 使用Firebase控制台将iOS应用添加到您的项目中:跟随助手,下载生成的GoogleService-Info.plist文件,使用Xcode打开ios/Runner.xcworkspace ,然后在Xcode中将该文件放入ios/Runner . 不要遵循Firebase助手中名为"添加Firebase SDK"和"添加初始化代码"的步骤.

  3. 在Xcode中,在"项目浏览器"中选择" Runner器". 在"功能"选项卡中,打开" Push Notifications和" Background Modes ,然后在" Background Modes下启用" Background fetch和" Remote notifications ".

  4. 按照Firebase文档的"上载您的APNs证书 "部分中的步骤进行操作.

  5. 如果您需要禁用FCM iOS SDK完成的方法转换(例如,以便可以将此插件与其他通知插件一起使用),则将以下内容添加到应用程序的Info.plist文件中.

<key>FirebaseAppDelegateProxyEnabled</key>
<false/>

之后, (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions到iOS项目的AppDelegate.m / AppDelegate.swift中的(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法.

Objective-C:

if (@available(iOS 10.0, *)) {
  [UNUserNotificationCenter currentNotificationCenter].delegate = (id<UNUserNotificationCenterDelegate>) self;
}

Swift:

if #available(iOS 10.0, *) {
  UNUserNotificationCenter.current().delegate = self as? UNUserNotificationCenterDelegate
}

Dart/Flutter Integration #

从Dart代码中,您需要导入插件并实例化它:

import 'package:firebase_messaging/firebase_messaging.dart';

final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();

接下来,您可能应该请求接收推送通知的权限. 为此,请调用_firebaseMessaging.requestNotificationPermissions() . 这将打开一个权限对话框,供用户在iOS上进行确认. Android上无人操作. 最后但并非最不重要的一点是,通过_firebaseMessaging.configure()注册onMessageonResumeonLaunch回调以侦听传入的消息(有关更多信息,请参见下表).

Receiving Messages #

消息会通过在安装过程中使用插件配置的onMessageonLaunchonResume回调发送到Flutter应用. 以下是在支持的平台上传递不同消息类型的方式:

前景中的应用后台应用应用终止
Android上的通知onMessage 通知已传递到系统托盘. 当用户单击它以打开应用程序时,如果设置了click_action: FLUTTER_NOTIFICATION_CLICKonResume会触发(请参见下文). 通知已传递到系统托盘. 当用户点击它来打开应用程序onLaunch火灾如果click_action: FLUTTER_NOTIFICATION_CLICK设置(见下文).
iOS通知onMessage 通知已传递到系统托盘. 当用户单击它以打开应用程序时, onResume触发. 通知已传递到系统托盘. 当用户单击它打开应用程序时, onLaunch会触发.
Android上的数据消息onMessage当应用程序停留在后台时, onMessage .插件不支持,消息丢失
iOS上的数据消息onMessage消息由FCM存储,并在应用程序回到前台时通过onMessage传递到应用程序.消息由FCM存储,并在应用程序回到前台时通过onMessage传递到应用程序.

附加阅读:Firebase的关于FCM消息 .

Notification messages with additional data #

通过将其他数据添加到通知的"data"字段中,可以在通知消息中包含其他数据.

在Android,该消息包含的附加字段data包含数据. 在iOS上,数据直接附加到消息中,并且省略了额外的data -field字段.

要在两个平台上接收数据:

Future<void> _handleNotification (Map<dynamic, dynamic> message, bool dialog) async {
    var data = message['data'] ?? message;
    String expectedAttribute = data['expectedAttribute'];
    /// [...]
}

Sending Messages #

有关将消息发送到您的应用程序的所有详细信息,请参阅Firebase有关FCM的文档 . 在向Android设备发送通知消息时,您需要确保将消息的click_action属性设置为FLUTTER_NOTIFICATION_CLICK . 否则,当用户在系统任务栏中单击该插件时,该插件将无法将通知传递给您的应用程序.

出于测试目的,发送通知的最简单方法是通过Firebase控制台 . 在定位Android设备时,请确保将click_action: FLUTTER_NOTIFICATION_CLICK为"自定义数据"键值对(在"高级选项"下). Firebase控制台不支持发送数据消息.

或者,可以从终端发送通知或数据消息:

DATA='{"notification": {"body": "this is a body","title": "this is a title"}, "priority": "high", "data": {"click_action": "FLUTTER_NOTIFICATION_CLICK", "id": "1", "status": "done"}, "to": "<FCM TOKEN>"}'
curl https://fcm.googleapis.com/fcm/send -H "Content-Type:application/json" -X POST -d "$DATA" -H "Authorization: key=<FCM SERVER KEY>"

删除DATAnotification属性以发送数据消息.

您还可以使用http包在Flutter中对此进行测试:

// Replace with server token from firebase console settings.
final String serverToken = '<Server-Token>';
final FirebaseMessaging firebaseMessaging = FirebaseMessaging();

Future<Map<String, dynamic>> sendAndRetrieveMessage() async {
  await firebaseMessaging.requestNotificationPermissions(
    const IosNotificationSettings(sound: true, badge: true, alert: true, provisional: false),
  );

  await http.post(
    'https://fcm.googleapis.com/fcm/send',
     headers: <String, String>{
       'Content-Type': 'application/json',
       'Authorization': 'key=$serverToken',
     },
     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': await firebaseMessaging.getToken(),
     },
    ),
  );

  final Completer<Map<String, dynamic>> completer =
     Completer<Map<String, dynamic>>();

  firebaseMessaging.configure(
    onMessage: (Map<String, dynamic> message) async {
      completer.complete(message);
    },
  );

  return completer.future;
}

Issues and feedback #

请在我们的问题跟踪器中提交Flutterfire特定的问题,错误或功能请求.

并非Flutterfire特有的插件问题可以在Flutter问题跟踪器中提出 .

要对此插件做出更改,请查看我们的贡献指南 ,并发送请求请求 .

6.0.15 #

  • 修复-在每个FcmDartService#start调用上注册pluginRegistrantCallback .

6.0.14 #

  • 修复了丢失的UserAgent.h编译失败的问题.

6.0.13 #

  • 实现UNUserNotificationCenterDelegate方法,以在禁用方法切换时允许插件工作.
  • 现在,仅当禁用方法切换时,应用程序才需要更新其iOS项目的AppDelegate .
  • 需要与其他通知插件一起使用firebase_messaging应用程序需要将以下内容添加到其iOS项目的Info.plist文件中:
     <key>FirebaseAppDelegateProxyEnabled</key> <false/> 

6.0.12 #

  • 替换Android上已弃用的getFlutterEngine调用.

6.0.11 #

  • 使学究的dev_dependency明确.

6.0.10 #

  • 更新自述文件以说明如何通过新的v2嵌入正确实现Android后台消息处理.

6.0.9 #

  • 将Android Gradle插件依赖项更新为3.5.3,更新文档和示例.
  • 在文档和示例中将google-services Android gradle插件更新为4.3.2.

6.0.8 #

  • 支持iOS版本> = 12的临时通知.

6.0.7 #

  • 从pubspec.yaml中删除不推荐使用的author:字段
  • 将插件迁移到pubspec平台清单.
  • 将Flutter的最低版本提高到1.10.0.

6.0.6 #

  • 更新了适用于Android的自述文件说明.

6.0.5 #

  • 在iOS上为UserNotifications添加导入.

6.0.4 #

  • 支持Android v2嵌入.

6.0.3 #

  • 修复在iOS> = 10上未流onIosSettingsRegistered错误.

6.0.2 #

  • 修复了由可用性检查引起的构建警告.

6.0.1 #

  • onBackgroundMessage参数不是顶级或静态函数时, FirebaseMessaging.configure将引发ArgumentError .

6.0.0 #

  • 使用UNUserNotificationCenterUNUserNotificationCenter 10的iOS版本上接收消息.

  • 突破性变革 For iOS versions >= 10, this will cause any other plugin that specifies a UNUserNotificationCenterDelegate to [UNUserNotificationCenter currentNotificationCenter] to stop receiving notifications. To have this plugin work with plugins that specify their own UNUserNotificationCenterDelegate, you can remove the line

    [UNUserNotificationCenter currentNotificationCenter].delegate = // plugin specified delegate
    

    并将此行添加到您的iOS项目AppDelegate.m

    if (@available(iOS 10.0, *)) {
      [UNUserNotificationCenter currentNotificationCenter].delegate = (id<UNUserNotificationCenterDelegate>) self;
    }
    

5.1.9 #

  • 修复严格的编译错误.

5.1.8 #

  • 更新了README说明,以与其他Flutterfire插件保持一致.

5.1.7 #

  • 删除AndroidX警告.

5.1.6 #

  • 修正在Android上编译时的警告.

5.1.5 #

  • 在Android上启用后台消息处理.

5.1.4 #

  • 更新文档以反映新的存储库位置.
  • 更新单元测试以调用TestWidgetsFlutterBinding.ensureInitialized .

5.1.3 #

  • 在文档和示例中将google-services Android gradle插件更新为4.3.0.

5.1.2 #

  • Updates to README and example with explanations of differences in data format.

5.1.1 #

  • 使用更详细的集成说明更新自述文件.

5.1.0 #

  • subscribeToTopicunsubscribeFromTopic的返回类型更改为Future<void> .

5.0.6 #

  • 其他集成测试.

5.0.5 #

  • 在Android上,修复使用最新的Flutter引擎调用deleteInstanceID时崩溃的问题.

5.0.4 #

  • 向Firebase报告使用情况时,自动使用pubspec.yaml中的版本.

5.0.3 #

  • 更新Dart代码以符合当前的Dart格式化程序.

5.0.2 #

  • 将缺少的模板类型参数添加到invokeMethod调用中.
  • 将Flutter的最低版本提高到1.5.0.
  • 必要时,将invokeMethod替换为invokeMapMethod.

5.0.1+1 #

  • 使用shouldEstablishDirectChannel在iOS上启用对onMessage支持.

5.0.1 #

  • 如果无法在Android上启动时检索令牌,请修复启动日志中的错误.

5.0.0 #

  • 将Android依赖项更新为最新版本.

4.0.0+4 #

  • 删除过时的use_frameworks! 指令.

4.0.0+3 #

  • 更新iOS配置文档.

4.0.0+2 #

  • 修复示例应用程序的浮动操作按钮由于重大更改而停止工作的问题.

4.0.0+1 #

  • 现在,有关默认应用程序自动配置的日志消息不再那么混乱.

4.0.0 #

  • 用于onMessage的打破更改更新消息结构以匹配onLaunch和onResume

3.0.1 #

  • 在构建时记录有关先前AndroidX迁移的更详细的警告.

3.0.0 #

  • 零钱 . 从已弃用的原始Android支持库迁移到AndroidX. 这不应该导致任何功能上的变化,但是如果使用原始插件的Android应用程序也必须迁移 ,因此它们也必须进行迁移 .

    这最初是在2.2.0更新中错误地推送的.

2.2.0+1 #

  • 恢复最新的2.2.0更新 . 已知2.2.0已损坏,应该增加主版本号而不是次版本号. 然而,对于已经迁移的任何人来说,此还原本身都是无效的. 已将其应用迁移到AndroidX的任何人都应立即更新为3.0.0 . 那是2.2.0的正确版本的新推送.

2.2.0 #

  • 不好 这是一个重大更改,在次要版本升级中错误地发布了该更改,这是永远不会发生的. 由2.2.0+1恢复.

  • 零钱 . 从已弃用的原始Android支持库迁移到AndroidX. 这不应该导致任何功能上的变化,但是如果使用原始插件的Android应用程序也必须迁移 ,因此它们也必须进行迁移 .

2.1.0 #

  • 添加对deleteInstanceID(),autoInitEnabled()和setAutoInitEnabled()的支持.

2.0.3 #

  • 在插件的dart部分中删除getToken()的本地缓存. 现在,getToken()在iOS和Android实现中直接调用其对应对象. 这样就可以获取其值,而无需调用configure()或不必等待新的令牌刷新.

2.0.2 #

  • 在iOS上检查通知类型时,请使用布尔值.

2.0.1 #

  • 将Android依赖项更新到最新版本.

2.0.0 #

  • 更新了Android,以将Remote Message的标题和正文发送到Dart.

1.0.5 #

  • 碰撞测试和模拟版本以获取Dart 2支持.

1.0.4 #

  • 碰撞Android和Firebase依赖版本.

1.0.3 #

  • 将iOS令牌挂钩从" didRefreshRegistrationToken"更新为" didReceiveRegistrationToken"

1.0.2 #

  • 更新了Gradle工具以匹配Android Studio 3.2.2.

1.0.1 #

  • 修复了适用于Android的问题,该问题是当操作系统终止"活动"时(或者启用了"不保留活动"切换功能时),不会触发onLaunch事件

1.0.0 #

  • 碰撞到发行版本

0.2.5 #

  • 修复了Dart 2类型错误.

0.2.4 #

  • Google Play服务依赖项已更新至版本15.0.0.

0.2.3 #

  • 更新的软件包频道名称

0.2.2 #

  • Cocoapods 1.5.0的简化podspec,避免了应用档案中的链接问题.

0.2.1 #

  • 修复了Dart 2类型错误.

0.2.0 #

  • 零钱 . 设置SDK约束以匹配Flutter beta版本.

0.1.4 #

  • 修复了示例项目中的Dart 2类型错误.

0.1.3 #

  • 已在Swift项目中启用.

0.2.2 #

  • 修复了重新安装应用程序时未在iOS上正确注册APNS的问题.

0.1.1 #

  • 将Android项目模板简化并升级到Android SDK 27.
  • 更新了程序包描述.

0.1.0 #

  • 零钱 . 升级到Gradle 4.1和Android Studio Gradle插件3.0.1. 较早的Flutter项目也需要升级其Gradle设置才能使用此版本的插件. 说明可以在这里找到.
  • 放松了对[11.4.0,12.0 [

0.0.8 #

  • 为iOS类型添加了FLT前缀
  • 将GMS依赖关系更改为11.4+

0.0.7 #

在FirebaseMessagingPlugin.m中:

  • 将逻辑从" tokenRefreshNotification"移动到" didRefreshRegistrationToken"
  • 删除了" tokenRefreshNotification"以及观察者注册
  • 删除了" connectToFcm"方法和相关调用
  • 删除了不必要的FIRMessaging断开连接

0.0.6 #

  • 将GMS依赖项更改为11. +

0.0.5+2 #

  • 修复了" click_action"的自述文件示例

0.0.5+1 #

  • 将作者姓名与回购的其余部分对齐.

0.0.5 #

  • 更新到Firebase SDK,以始终使用最新的修补程序版本进行11.0.x构建

0.0.4 #

  • 更新到Firebase SDK版本11.0.1

0.0.3 #

  • 更新了README.md
  • 将buildToolsVersion连接到25.0.3

0.0.2+2 #

  • 更新了README.md

0.0.2+1 #

0.0.2 #

  • 更新到最新的插件API

0.0.2.2 #

  • 降级的gradle依赖关系(例如应用程序)使Flutter flutter run愉快

0.0.1+1 #

  • 使用安装说明更新了自述文件
  • 添加了CHANGELOG

0.0.1 #

  • 初始发行

example/lib/main.dart

// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'dart:async';

import 'package:firebase_messaging/firebase_messaging.dart';
import 'package:flutter/material.dart';

final Map<String, Item> _items = <String, Item>{};
Item _itemForMessage(Map<String, dynamic> message) {
  final dynamic data = message['data'] ?? message;
  final String itemId = data['id'];
  final Item item = _items.putIfAbsent(itemId, () => Item(itemId: itemId))
    ..status = data['status'];
  return item;
}

class Item {
  Item({this.itemId});
  final String itemId;

  StreamController<Item> _controller = StreamController<Item>.broadcast();
  Stream<Item> get onChanged => _controller.stream;

  String _status;
  String get status => _status;
  set status(String value) {
    _status = value;
    _controller.add(this);
  }

  static final Map<String, Route<void>> routes = <String, Route<void>>{};
  Route<void> get route {
    final String routeName = '/detail/$itemId';
    return routes.putIfAbsent(
      routeName,
      () => MaterialPageRoute<void>(
        settings: RouteSettings(name: routeName),
        builder: (BuildContext context) => DetailPage(itemId),
      ),
    );
  }
}

class DetailPage extends StatefulWidget {
  DetailPage(this.itemId);
  final String itemId;
  @override
  _DetailPageState createState() => _DetailPageState();
}

class _DetailPageState extends State<DetailPage> {
  Item _item;
  StreamSubscription<Item> _subscription;

  @override
  void initState() {
    super.initState();
    _item = _items[widget.itemId];
    _subscription = _item.onChanged.listen((Item item) {
      if (!mounted) {
        _subscription.cancel();
      } else {
        setState(() {
          _item = item;
        });
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("Item ${_item.itemId}"),
      ),
      body: Material(
        child: Center(child: Text("Item status: ${_item.status}")),
      ),
    );
  }
}

class PushMessagingExample extends StatefulWidget {
  @override
  _PushMessagingExampleState createState() => _PushMessagingExampleState();
}

class _PushMessagingExampleState extends State<PushMessagingExample> {
  String _homeScreenText = "Waiting for token...";
  bool _topicButtonsDisabled = false;

  final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
  final TextEditingController _topicController =
      TextEditingController(text: 'topic');

  Widget _buildDialog(BuildContext context, Item item) {
    return AlertDialog(
      content: Text("Item ${item.itemId} has been updated"),
      actions: <Widget>[
        FlatButton(
          child: const Text('CLOSE'),
          onPressed: () {
            Navigator.pop(context, false);
          },
        ),
        FlatButton(
          child: const Text('SHOW'),
          onPressed: () {
            Navigator.pop(context, true);
          },
        ),
      ],
    );
  }

  void _showItemDialog(Map<String, dynamic> message) {
    showDialog<bool>(
      context: context,
      builder: (_) => _buildDialog(context, _itemForMessage(message)),
    ).then((bool shouldNavigate) {
      if (shouldNavigate == true) {
        _navigateToItemDetail(message);
      }
    });
  }

  void _navigateToItemDetail(Map<String, dynamic> message) {
    final Item item = _itemForMessage(message);
    // Clear away dialogs
    Navigator.popUntil(context, (Route<dynamic> route) => route is PageRoute);
    if (!item.route.isCurrent) {
      Navigator.push(context, item.route);
    }
  }

  @override
  void initState() {
    super.initState();
    _firebaseMessaging.configure(
      onMessage: (Map<String, dynamic> message) async {
        print("onMessage: $message");
        _showItemDialog(message);
      },
      onLaunch: (Map<String, dynamic> message) async {
        print("onLaunch: $message");
        _navigateToItemDetail(message);
      },
      onResume: (Map<String, dynamic> message) async {
        print("onResume: $message");
        _navigateToItemDetail(message);
      },
    );
    _firebaseMessaging.requestNotificationPermissions(
        const IosNotificationSettings(
            sound: true, badge: true, alert: true, provisional: true));
    _firebaseMessaging.onIosSettingsRegistered
        .listen((IosNotificationSettings settings) {
      print("Settings registered: $settings");
    });
    _firebaseMessaging.getToken().then((String token) {
      assert(token != null);
      setState(() {
        _homeScreenText = "Push Messaging token: $token";
      });
      print(_homeScreenText);
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        appBar: AppBar(
          title: const Text('Push Messaging Demo'),
        ),
        // For testing -- simulate a message being received
        floatingActionButton: FloatingActionButton(
          onPressed: () => _showItemDialog(<String, dynamic>{
            "data": <String, String>{
              "id": "2",
              "status": "out of stock",
            },
          }),
          tooltip: 'Simulate Message',
          child: const Icon(Icons.message),
        ),
        body: Material(
          child: Column(
            children: <Widget>[
              Center(
                child: Text(_homeScreenText),
              ),
              Row(children: <Widget>[
                Expanded(
                  child: TextField(
                      controller: _topicController,
                      onChanged: (String v) {
                        setState(() {
                          _topicButtonsDisabled = v.isEmpty;
                        });
                      }),
                ),
                FlatButton(
                  child: const Text("subscribe"),
                  onPressed: _topicButtonsDisabled
                      ? null
                      : () {
                          _firebaseMessaging
                              .subscribeToTopic(_topicController.text);
                          _clearTopicText();
                        },
                ),
                FlatButton(
                  child: const Text("unsubscribe"),
                  onPressed: _topicButtonsDisabled
                      ? null
                      : () {
                          _firebaseMessaging
                              .unsubscribeFromTopic(_topicController.text);
                          _clearTopicText();
                        },
                ),
              ])
            ],
          ),
        ));
  }

  void _clearTopicText() {
    setState(() {
      _topicController.text = "";
      _topicButtonsDisabled = true;
    });
  }
}

void main() {
  runApp(
    MaterialApp(
      home: PushMessagingExample(),
    ),
  );
}

Use this package as a library

1. Depend on it

将此添加到包的pubspec.yaml文件中:


dependencies:
  firebase_messaging: ^6.0.15

2. Install it

您可以从命令行安装软件包:

使用Flutter:


$ flutter pub get

另外,您的编辑器可能支持flutter pub get . 查看您的编辑器文档以了解更多信息.

3. Import it

现在,在Dart代码中,您可以使用:


import 'package:firebase_messaging/firebase_messaging.dart';
  
Popularity:
描述该程序包相对于其他程序包的受欢迎程度. [更多]
100
Health:
从静态分析得出的代码运行状况. [更多]
100
Maintenance:
反映出软件包的整洁和最新状态. [更多]
100
Overall:
以上的加权分数. [更多]
100
了解有关得分的更多信息.

我们在2020年5月23日分析了此软件包,并在下面提供了得分,详细信息和建议. using: 分析已完成,状态使用以下命令 :

  • 飞镖:2.8.1
  • 直到:0.13.8-dev
  • Flutter: 1.17.0

Dependencies

Package Constraint Resolved Available
直接依赖
Dart SDK > = 2.0.0-dev.28.0 <3.0.0
flutter 0.0.0
meta ^1.0.4 1.1.8
platform ^2.0.0 2.2.1
传递依存关系
collection 1.14.12
sky_engine 0.0.99
typed_data 1.1.6
vector_math 2.0.8
开发依赖
e2e ^0.2.1
firebase_core ^0.4.0
flutter_driver
flutter_test
mockito ^3.0.0
pedantic ^1.8.0
test ^1.3.0

by  ICOPY.SITE