当前位置: 首页 > 知识库问答 >
问题:

Flatter-onLaunch中的Firebase云消息导航不起作用

南宫阳冰
2023-03-14

我正在构建一个应用程序,使用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);

有人知道它为什么不起作用吗?

谢谢你!

共有3个答案

彭建业
2023-03-14

根据我的经验,我记得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
    }};

您将不得不实现这些全部设置,但其流程大致如上图所示。

戴树
2023-03-14

我假设您使用的是firebase\u消息包。

如果你在模拟器上测试它,它不会工作。文件中规定:

通过APNs的FCM在iOS模拟器上不起作用。接收信息

在Android上,如果用户强制退出应用程序的设备设置,则必须再次手动重新打开应用程序,消息才能开始工作。

更多信息请点击这里。

苏培
2023-03-14

您可以尝试使用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(网站)