我正在构建一个应用程序,使用FCM接收推送通知。
我想在单击通知时路由到特定屏幕(例如,用户的配置文件)。
在Android系统上,当应用程序刚刚关闭(而不是“终止”)时,它工作得非常好,但当应用程序终止(“终止”)时,它就不工作了。在iOS上,它根本不起作用。
我正在实施它的生活:
通知Shandler:
class NotificationsHandler {
static final NotificationsHandler instance = NotificationsHandler();
final _fcm = FirebaseMessaging();
void onBackgroundNotificationRecevied({Function onReceived}) {
_fcm.configure(
onResume: (message) => onReceived(message),
onLaunch: (message) => onReceived(message),
);
}
}
myMainScreen的初始状态:
@override
void initState() {
NotificationsHandler.instance.onBackgroundNotificationRecevied(
onReceived: (message) async {
final userId = message['data']['userId'];
final user = this.users.firstWhere((currentUser) => currentUser.id == userId);
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => UserProfileScreen(
user,
),
),
);
}
);
super.initState();
}
发送通知的代码(通过外部React管理面板):
const payload = {
notification: {
title: `myTitle`,
body: `My message`,
sound: "default",
badge: "1",
click_action: "FLUTTER_NOTIFICATION_CLICK",
},
data: {
click_action: 'FLUTTER_NOTIFICATION_CLICK',
userId: myUserId,
},
};
const options = {
priority: 'high',
timeToLive: 60 * 60 * 24
};
admin.messaging().sendToTopic('myTopic', payload, options);
有人知道它为什么不起作用吗?
谢谢你!
根据我的经验,我记得onLaunch Callback函数在执行main函数后立即触发,甚至在initstate方法之前。
我所做的是在runApp()
之前在main函数中使用服务定位器(例如get_it)定位服务类,然后在Launch Callback设置初始配置,以便您的应用程序可以使用它的值。
例如
final getIt = GetIt.instance;
Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp();
getIt.registerSingleton<Configurator>(Configurator());///start configuration service
FirebaseMessagingService.initialise()///start firebase messaging service
runApp();
}
...
class FirebaseMessagingService {
final FirebaseMessaging _fcm;
FirebaseMessagingService.initialise() : _fcm = FirebaseMessaging() {
if (Platform.isIOS) {
_fcm.requestNotificationPermissions(IosNotificationSettings());
}
_fcm.configure(
...
onLaunch: _launchMessageHandler,
);
}
}
//top-level function or static method
_launchMessageHandler(Map<String, dynamic> message) async {
//some parsing logic
...
getIt<Configurator>().setInitialConfig(parsed_data);
}
...
//then
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
final config = getIt<Configurator>().config;
//do something
}};
您将不得不实现这些全部设置,但其流程大致如上图所示。
我假设您使用的是firebase\u消息
包。
如果你在模拟器上测试它,它不会工作。文件中规定:
通过APNs的FCM在iOS模拟器上不起作用。接收信息
在Android上,如果用户强制退出应用程序的设备设置,则必须再次手动重新打开应用程序,消息才能开始工作。
更多信息请点击这里。
您可以尝试使用getInitialMessage
而不是onLaunch
。我相信这将满足您的需求,因为文档中显示了以下几行内容:
这应用于确定特定的通知交互是否应以特定目的打开应用程序(例如打开聊天信息、特定屏幕等)。
@override
void initState() {
super.initState();
FirebaseMessaging.instance.getInitialMessage().then((RemoteMessage message) {
if (message != null) {
Navigator.pushNamed(context, '/message', arguments: MessageArguments(message, true));
}
});
}
我的应用程序结构有点乱,但我必须先添加这个补丁,然后我会重新构建整个逻辑。问题是我首先检查是否有Firebase用户,然后如果有,我使用StreamBuilder从FiRecovery获取当前用户配置文件,然后我有_firebaseMessaging.configure方法,因为onLaunch和onResume我使用这个回调: 因为我需要将用户发送到这个屏幕,在那里他从Firebase获取消息。
我想在我的应用程序中制作一个简单的通知功能。我遵循了这个YouTube视频和这两个Firebase留档URL 1和2以及Android Studio中的Firebase工具助手(它说我已连接到Firebase)。出于某种原因,在我的旧应用程序上遵循这些步骤和文档(代码如下所示),它不允许我接收通知。但是,如果我在一个全新的应用程序上遵循相同的步骤,它会完美运行。我在同一物理设备和环境中测试了两个应
通知处理程序 邮递https://fcm.googleapis.com/fcm/send 当我发送通知与有效载荷上面,通知交付到系统托盘,当我点击它,我有以下三种情况: 应用程序处于后台(关闭/终止),显示“数据”并调用onLaunch方法。 问题是,如何接收或处理带有通知的“数据”也发送到系统托盘?任何帮助都将不胜感激。
我正在尝试使用FireBase云消息传递。我正在接收令牌,但它没有从控制台收到任何通知。这是我的舱单: 我的代码与示例中的代码几乎相同: 我在这里检查了一个问题,Firebase云消息通知未被设备接收,但仍然无法工作。
添加了从FCM到Facebook的API密钥 但从FB控制台“推送活动设置验证”到有效的“您的设备令牌”-不工作 错误: 无法验证用于发送消息的发件人帐户。这可能是由于无效的项目号作为密钥发送,或者密钥是有效的,但禁用了FCM服务,或者我们的服务器没有在服务器密钥IP中列入白名单。 是什么导致了这些问题?有什么日志我可以看吗?
我正在尝试让Firebase云消息传递正常工作。我现在只是想做个测试。我所做的就是这篇文章的全部内容: https://firebase.google.com/docs/cloud-messaging/js/client?authuser=0#retrieve-the-current-registration-token 然后在最后你会看到这个: 然后我复制这个,并通过访问Firebase(网站)