android - 单击 FCM 通知时,Flutter Notification 挂起的意图被取消
问题描述
firebase_messaging
当我在应用程序处于后台时收到通知时,当我单击它时,会在控制台中记录此错误,Notification pending intent canceled
而不是打开应用程序。什么也没有发生
请注意,我正在使用flutter 1.22..6
这个项目,所以我不得不使用旧firebase_messageing
版本7.0.3
我的AndroidManifest.xml中有这些行:
<!-- Note i have changed MainActitvy to Application based on documutions -->
<application
android:name=".Application"
android:label="DR Vendor"
android:requestLegacyExternalStorage="true"
android:usesCleartextTraffic="true"
android:icon="@mipmap/launcher_icon">
....
<intent-filter>
<action android:name="FLUTTER_NOTIFICATION_CLICK" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
.....
</application>
我有Application.java就像:
package Here I have my package name;
import io.flutter.app.FlutterApplication;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback;
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) {
FirebaseCloudMessagingPluginRegistrant.registerWith(registry);
}
}
并将此文件添加到同一文件夹FirebaseCloudMessagingPluginRegistrant.java中:
package my bundle name here;
import io.flutter.plugin.common.PluginRegistry;
import io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin;
public final class FirebaseCloudMessagingPluginRegistrant {
public static void registerWith(PluginRegistry registry) {
if (alreadyRegisteredWith(registry)) {
return;
}
FirebaseMessagingPlugin.registerWith(registry.registrarFor("io.flutter.plugins.firebasemessaging.FirebaseMessagingPlugin"));
}
private static boolean alreadyRegisteredWith(PluginRegistry registry) {
final String key = FirebaseCloudMessagingPluginRegistrant.class.getCanonicalName();
if (registry.hasPlugin(key)) {
return true;
}
registry.registrarFor(key);
return false;
}
}
这就是我如何将我的后台处理程序方法添加为静态顶级方法
主要.dart
Future<dynamic> myBackgroundMessageHandler(Map<String, dynamic> message) async {
if (message.containsKey('data')) {
// Handle data message
final dynamic data = message['data'];
}
if (message.containsKey('notification')) {
// Handle notification message
final dynamic notification = message['notification'];
print("got notification");
print(message);
}
print("reached here");
// Or do other work.
}
Future<void> main() async {
....
await Firebase.initializeApp();
PushNotificationsManager().init();
...
这就是我在呼叫线路时初始化 FCMPushNotificationsManager().init();
的方式main.dart
Future<void> init() async {
if (!_initialized) {
// For iOS request permission first.
_firebaseMessaging.requestNotificationPermissions();
_firebaseMessaging.configure();
var initializationSettingsAndroid =
new AndroidInitializationSettings('@mipmap/launcher_icon');
var initializationSettingsIOS = new IOSInitializationSettings();
var initializationSettings = new InitializationSettings(
android: initializationSettingsAndroid, iOS: initializationSettingsIOS);
flutterLocalNotificationsPlugin.initialize(initializationSettings,
onSelectNotification: onSelectNotification);
configureNotifications();
// For testing purposes print the Firebase Messaging token
String token = await _firebaseMessaging.getToken();
print("FirebaseMessaging token: $token");
_initialized = true;
}
}
configureNotifications() {
final FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
_firebaseMessaging.configure(
onMessage: (Map<String, dynamic> message) async {
print("onMessage: $message");
_showNotification(
1234,
"${message['notification']['title']}",
"${message['notification']['body']}",
"${message['data']['order_id']}");
return;
},
onBackgroundMessage: myBackgroundMessageHandler,
onLaunch: (Map<String, dynamic> message) async {
print("onLaunch: $message");
return;
},
onResume: (Map<String, dynamic> message) async {
print("onResume: $message");
onSelectNotification("${message['data']['order_id']}");
},
);
_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);
});
}
解决方案
第一个问题是在main中的初始化
PushNotificationsManager().init();
至
await Firebase.initializeApp();
并使用此代码打开活动或屏幕。
FirebaseMessaging.onMessageOpenedApp.listen((RemoteMessage message) {
print('A new onMessageOpenedApp event was published!');
Navigator.pushNamed(context, '/message',
arguments: MessageArguments(message, true));
});
谢谢
推荐阅读
- python - 如何像在 Python 中一样在 C++ 中重新创建默认参数?
- javascript - Next-Auth:如何使用电子邮件 + 密码凭据提供程序处理注册?
- postgresql - 重复对 PostgreSQL 数据库的耗时查询
- amazon-web-services - AWS 批处理无法运行 Fargate 容器
- spring - 在 Spring Boot 中通过 NTLM 和 Feign Client 进行身份验证
- mysql - AWS EC2 问题:mysql 无法与我的烧瓶应用程序上的 sqlalchemy 连接
- google-apps-script - 尽管触发器已被删除,但 Apps 脚本触发器功能仍在运行
- python - 我是 tkinter 的新手......为什么当我滚动时这些条目没有移动?
- java - 无法让我的 SQL 更新我通过它传递的更改
- javascript - SVG 上的 D3 突然线性渐变变化在 Chrome 中不起作用