我有一个这样的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运行通知,因此问题在于如何针对后台通知进行操作。