Flutter应用-无法添加后台通知处理

时间:2019-10-25 11:09:31

标签: flutter push-notification

我有一个这样的Notification路由器类:

  static FirebaseMessaging get fbMessaging {
    if (_firebaseMessaging == null) _firebaseMessaging = FirebaseMessaging();
    return _firebaseMessaging;
  }

  static Map<String, NotificationCallback> _onNewsletterCallbackList = {};
  static Map<String, NotificationCallback> _onMessageCallbackList = {};
  static Map<String, NotificationCallback> _onDiaryUpdatedCallbackList = {};
  static Map<String, NotificationCallback> _onUpgradeNeededCallbackList = {};

  static String subjectItemId(Map data) {
    return data['id'];
  }


  static void configure() {
    if (_configured) return;
    fbMessaging.configure(
      onResume: _resumeRouter,
      onLaunch: _launchRouter,
      onMessage: _notificationRouter,
//      onBackgroundMessage: _backgroundMessage,
    );
    _configured = true;
  }

//-- SNIP ALL THE ROUTING FUNCTIONS --

onMessage在应用程序位于前台时起作用。 _notificationRouter是此类的静态方法。

_backgroundMessage是一个“全局”函数(在任何类之外),它现在只打印通知。

Future<dynamic> _backgroundMessage(Map<String, dynamic> message) async {
  print('NR: Enter: _backgroundMessage');
  print(message);
}

如果我取消注释以设置onbackgroundmessage的行,则该应用程序会关闭并显示异常。

D/AndroidRuntime(18376): Shutting down VM
E/AndroidRuntime(18376): FATAL EXCEPTION: main
E/AndroidRuntime(18376): Process: com.sample.dev, PID: 18376
E/AndroidRuntime(18376): java.lang.RuntimeException: Unable to create service io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService: java.lang.RuntimeException: PluginRegistrantCallback is not set.
E/AndroidRuntime(18376):    at android.app.ActivityThread.handleCreateService(ActivityThread.java:3544)
E/AndroidRuntime(18376):    at android.app.ActivityThread.access$1300(ActivityThread.java:199)
E/AndroidRuntime(18376):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1666)
E/AndroidRuntime(18376):    at android.os.Handler.dispatchMessage(Handler.java:106)
E/AndroidRuntime(18376):    at android.os.Looper.loop(Looper.java:193)
E/AndroidRuntime(18376):    at android.app.ActivityThread.main(ActivityThread.java:6669)
E/AndroidRuntime(18376):    at java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(18376):    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
E/AndroidRuntime(18376):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
E/AndroidRuntime(18376): Caused by: java.lang.RuntimeException: PluginRegistrantCallback is not set.
E/AndroidRuntime(18376):    at io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService.startBackgroundIsolate(FlutterFirebaseMessagingService.java:157)
E/AndroidRuntime(18376):    at io.flutter.plugins.firebasemessaging.FlutterFirebaseMessagingService.onCreate(FlutterFirebaseMessagingService.java:77)
E/AndroidRuntime(18376):    at android.app.ActivityThread.handleCreateService(ActivityThread.java:3532)
E/AndroidRuntime(18376):    ... 8 more

一旦发生这种情况,请注释掉该行,直到我执行“清除数据”(删除应用程序存储)后,该应用程序才能再次启动。然后,如果我取消注释该行以将该函数重新挂起,则应用程序状态似乎再次损坏。

我发现很难解决如何设置AndroidManifest.xml文件的问题,因为我首先为每个“风味”创建了一个不同的文件,但又有多个“ click_action”值。

为了简化问题,我现在从清单中注释掉了额外的单击操作:

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="FLUTTER_NOTIFICATION_CLICK" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>

<!--            <intent-filter>-->
<!--                <action android:name="ECHO_CLICK" />-->
<!--                <category android:name="android.intent.category.DEFAULT" />-->
<!--            </intent-filter>-->

<!--            <intent-filter>-->
<!--                <action android:name="child" />-->
<!--                <category android:name="android.intent.category.DEFAULT" />-->
<!--            </intent-filter>-->
<!--            <intent-filter>-->
<!--                <action android:name="school" />-->
<!--                <category android:name="android.intent.category.DEFAULT" />-->
<!--            </intent-filter>-->
<!--            <intent-filter>-->
<!--                <action android:name="staff" />-->
<!--                <category android:name="android.intent.category.DEFAULT" />-->
<!--            </intent-filter>-->
<!--            <intent-filter>-->
<!--                <action android:name="deals" />-->
<!--                <category android:name="android.intent.category.DEFAULT" />-->
<!--            </intent-filter>-->

            <meta-data
                android:name="com.google.firebase.messaging.default_notification_channel_id"
                android:value="@string/default_notification_channel_id" />
            <meta-data
                android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"
                android:value="true" />

在Strings res中,我在所有口味中都定义了相同的字符串:     我的应用程式     频道编号

此值“频道ID”是否需要与某处相关联?

出于绝望,我已经将click_action添加到了数据和通知有效负载部分,即现在它已经被复制了。关于SE的许多答案都说它必须位于数据部分,但规范https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support说它必须位于Notification部分的字段

如何正确设置后台推送通知。如果我能使他们的工作量降至最低,我希望进行一些更改:

a)使用InheritedWidget来维护希望被告知各种类型的通知的页面/回调的列表,以及 b)通过使用Streams将通知传递给那些消息流,进一步改善这一点,但是目前,“ Router”类仅维护函数映射,并且为接收到的通知类型调用所有功能。

这适用于Foreground运行通知,因此问题在于如何针对后台通知进行操作。

0 个答案:

没有答案