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

FCM和本地通知。安卓能用,iOS不行

庄智
2023-03-14

Im使用具有FCM和本地通知的解决方案来接收通道上的特定推送通知。安卓系统的一切都是可行的。

我通过邮递员将推送通知发送到https://fcm.googleapis.com/fcm/send,这一切都很有效。

但是,当我添加我的iPhone,并完成所有需要的安装步骤时。我唯一收到的是flutter上的控制台打印的信息。我在iPhone上没有收到任何通知。

  final FirebaseMessaging _fcm = FirebaseMessaging();

  FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
      FlutterLocalNotificationsPlugin();

  var initializationSettingsAndroid;
  var initializationSettingsIOS;
  var initializationSettings;

  void _showNotification() async {
    //await _buildNotification();
  }

  Future<dynamic> myBackgroundMessageHandler(Map<String, dynamic> message) {
    if (message.containsKey('data')) {
      // Handle data message
      final dynamic data = message['data'];
    }

    if (message.containsKey('notification')) {
      // Handle notification message

      final dynamic notification = message['notification'];
    }

    // Or do other work.
  }

  Future<void> _createNotificationChannel(
      String id, String name, String description) async {
    final flutterLocalNotificationsPlugin = FlutterLocalNotificationsPlugin();
    var androidNotificationChannel = AndroidNotificationChannel(
      id,
      name,
      description,
      importance: Importance.Max,
      playSound: true,
      sound: RawResourceAndroidNotificationSound('not_kiddin'),
      enableVibration: true,
    );
    await flutterLocalNotificationsPlugin
        .resolvePlatformSpecificImplementation<
            AndroidFlutterLocalNotificationsPlugin>()
        ?.createNotificationChannel(androidNotificationChannel);
  }

  Future<void> _buildNotification(String title, String body) async {
    var androidPlatformChannelSpecifics = AndroidNotificationDetails(
        'my_channel',
        'Channel Name',
        'Channel Description.',
        importance: Importance.Max,
        priority: Priority.High,
        playSound: true,
        enableVibration: true,
        sound: RawResourceAndroidNotificationSound('not_kiddin'),
        ticker: 'noorderlicht');
    var iOSChannelSpecifics = IOSNotificationDetails();
    var platformChannelSpecifics = NotificationDetails(
        androidPlatformChannelSpecifics, iOSChannelSpecifics);

    await flutterLocalNotificationsPlugin.show(
        0, title, body, platformChannelSpecifics,
        payload: 'payload');
  }

  @override
  void initState() {
    super.initState();

    initializationSettingsAndroid =
        AndroidInitializationSettings('ic_launcher');
    initializationSettingsIOS = IOSInitializationSettings(
        onDidReceiveLocalNotification: onDidReceiveLocalNotification);

    initializationSettings = InitializationSettings(
        initializationSettingsAndroid, initializationSettingsIOS);

    _fcm.requestNotificationPermissions();

    _fcm.configure(
      onMessage: (Map<String, dynamic> message) async {
        print(message);
        flutterLocalNotificationsPlugin.initialize(initializationSettings,
            onSelectNotification: onSelectNotification);

        //_showNotification();
        Map.from(message).map((key, value) {
          print(key);
          print(value);
          print(value['title']);
          _buildNotification(value['title'], value['body']);
        });
      },
      onLaunch: (Map<String, dynamic> message) async {
print("onLaunch: $message");
      },
      onResume: (Map<String, dynamic> message) async {
print("onResume: $message");
      },
    );
  }

  Future onDidReceiveLocalNotification(
      int id, String title, String body, String payload) async {
    // display a dialog with the notification details, tap ok to go to another page
    showDialog(
      context: context,
      builder: (BuildContext context) => CupertinoAlertDialog(
        title: Text(title),
        content: Text(body),
        actions: [
          CupertinoDialogAction(
            isDefaultAction: true,
            child: Text('Ok'),
            onPressed: () {},
          )
        ],
      ),
    );
  }

  Future onSelectNotification(String payload) async {
    if (payload != null) {
      debugPrint('Notification payload: $payload');
    }
  }

共有1个答案

颜君浩
2023-03-14

对于IOS,FCM消息以不同的结构出现,在您的情况下,当平台是如下所示的IOS时,删除“数据”。


            if(Platform.isAndroid){
              roomId = message['data']['chatRoomId'];
              senderId = message['data']['senderId'];
            }else if(Platform.isIOS){
              roomId = message['chatRoomId'];
              senderId = message['senderId'];
            }
 类似资料:
  • 问题内容: 我在iOS上的FCM通知有问题。 我收到成功通知时,我的应用程序是在前台(回调中被激发),但是当应用程序在后台(我看不出在iOS中的通知栏的任何东西)我没有收到通知。 因此,我认为问题在于FCM发送的消息格式。我的服务器发送到FCM的json格式如下: 如您所见,我的json中有两个块:一个通知块(用于在后台接收通知)和一个数据块(用于在前台接收通知)。 我不明白为什么没有收到后台通知

  • 您可以看到,我的JSON中有两个块:一个通知块(在后台接收通知),一个数据块(在前台接收通知)。 我不明白为什么没有收到后台通知。我的怀疑是关于块的顺序(如果我把“数据”块放在“通知”块之前会有问题吗?)。 编辑:有关问题的更多信息。 编辑2: 当应用程序在后台时,不会收到通知,但当我打开应用程序时,会立即收到相同的通知(方法didReceiveRemoteNotification被激发)。

  • 问题内容: 我需要处理推送通知,这是通过较低版本的ios完成的,但是在ios 11中,从未收到任何推送通知。我使用Firebase Cloud Messaging。请任何人有解决方案,然后请分享。 问题答案: func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UI

  • 本文向大家介绍iOS推送之本地通知UILocalNotification,包括了iOS推送之本地通知UILocalNotification的使用技巧和注意事项,需要的朋友参考一下 摘要: Notification是智能手机应用编程中非常常用的一种传递信息的机制,而且可以非常好的节省资源,不用消耗资源来不停地检查信息状态(Pooling),在iOS下应用分为两种不同的Notification种类,本

  • 智能通知功能可使您在 Polar 设备上获取有关来电、信息和通知的提醒。您将在您手机屏幕上的 Polar 设备上收到相同的通知。当您利用 A370 进行心率训练时,如果您的手机运行了 Polar Flow 应用程式,您仅能收到关于电话的通知。 确保 A370 具有最新固件版本和最新版本的 Polar Flow 应用程式。 要使用智能通知功能,您需要安装适合 iOS 的 Polar Flow 移动应

  • 当应用程序关闭时,我无法使通知工作。 我从FCM/GCM(python服务器)发送此消息: 所以curl是这样的: curl-头"授权:key=MYKEY"-头"内容类型:应用/json"https://fcm.googleapis.com/fcm/send-d'{"registration_ids":["APA91bEDB9dVf-..."],"collapse_key":空,"content_

  • 我注意到,当我在后台发送FCM负载时,我看到通知消息被显示,这与文档一致,但我看到收到的每个通知消息的本机通知。当我的应用程序在后台时,我收到了3条推送消息(带有通知负载),现在我在通知托盘中看到了3条本机通知。为什么他们没有崩溃?默认情况下,根据FCM文档,所有通知消息都是可折叠的。参考文件:https://firebase.google.com/docs/cloud-messaging/con

  • AIR Native Extension:实现本地按时通知、声音设置和通知内容。 [Code4App.com]