Flutter ios 设备不会从 FCM 通知触发 onMessage。实施 APN 时 Sendtodevice 失败

Posted

技术标签:

【中文标题】Flutter ios 设备不会从 FCM 通知触发 onMessage。实施 APN 时 Sendtodevice 失败【英文标题】:Flutter ios device doesn't trigger onMessage from FCM notification. Sendtodevice fails when implementing APNs 【发布时间】:2020-12-18 01:29:03 【问题描述】:

在我的 fcm 云功能中向其他玩家发送通知,当我添加 apns 层时发送失败。移除 apns 层后,通知会出现在 android 上,但对于 ios,通知会在前端收到,但无法触发 onMessage 函数显示警报对话框。

 var payload = 
        data: 
            click_action: "FLUTTER_NOTIFICATION_CLICK",
            notificationType: "friendsRequest",
            fromUsername: fromUsername,
            fromProfilePic: fromProfilePic,
            fromColorIndex: fromColorIndex,
            type: type
        ,
    ;

此有效负载返回“崩溃”的服务器响应

【问题讨论】:

【参考方案1】:

要为 iOS 启用通知,您需要先为 iOS 设置 FCM: 正如您所说,您已经生成了 APN。只需确认您是否将 apn 与 firebase 项目相关联。之后在 Xcode 中打开您的项目 ios 模块并在 AppDelegate 中进行以下更改

if #available(iOS 10.0, *) 
  UNUserNotificationCenter.current().delegate = self as? 
  UNUserNotificationCenterDelegate

在颤振方面进行更改(我在启动画面中使用此代码):

初始化

FirebaseMessaging _firebaseMessaging = FirebaseMessaging();
FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin = new FlutterLocalNotificationsPlugin();

initState() 中的代码

var initializationSettingsAndroid =
    new AndroidInitializationSettings('@mipmap/ic_launcher'); //replace with your app icon file
var initializationSettingsIOS = new IOSInitializationSettings();
var initializationSettings = new InitializationSettings(
    initializationSettingsAndroid, initializationSettingsIOS);
flutterLocalNotificationsPlugin.initialize(initializationSettings,
    onSelectNotification: onSelectNotification);

FirebaseNotifications().setUpFirebase(_firebaseMessaging);
_firebaseMessaging.configure(
  onMessage: (Map<String, dynamic> message) async 
    showNotification(
        message['notification']['title'], message['notification']['body']);
    print("onMessage: $message");
  ,
  onLaunch: (Map<String, dynamic> message) async 
    print("onLaunch: $message");
  ,
  onResume: (Map<String, dynamic> message) async 
    print("onResume: $message");
  ,
);

通知方式:

void showNotification(String title, String body) async 
   await _demoNotification(title, body);


Future<void> _demoNotification(String title, String body) async 
  var androidPlatformChannelSpecifics = AndroidNotificationDetails(
     'channel_ID', 'channel name', 'channel description',
     importance: Importance.Max,
     playSound: true,
     sound: 'sound',
     showProgress: true,
     icon: 'notification_icon',
     color: AppTheme.secondaryaccent,
     priority: Priority.High,
     ticker: 'test ticker');

 var iOSChannelSpecifics = IOSNotificationDetails();
 var platformChannelSpecifics = NotificationDetails(
     androidPlatformChannelSpecifics, iOSChannelSpecifics);
  await flutterLocalNotificationsPlugin
    .show(0, title, body, platformChannelSpecifics, payload: 'test');
 

【讨论】:

我确实设置了这个应用程序。我将包括我采取的其他步骤。希望你能发现我的错误。我也没有使用颤振本地通知。我在 onMessage 中有一个函数,它使用从通知中收到的数据来触发警报对话框。 在这种情况下我的通知发送失败。 您是否从应用订阅以获取通知..? 我获得了应用注册令牌并请求发送通知。

以上是关于Flutter ios 设备不会从 FCM 通知触发 onMessage。实施 APN 时 Sendtodevice 失败的主要内容,如果未能解决你的问题,请参考以下文章

Flutter - 在 IOS 上使用 FCM 的后台通知

Flutter FCM Ios 未在设备上显示

FCM 将消息从 php 复制到 iOS Flutter 应用程序

iOS 上的 Flutter FCM 不调用 onMessage 和 onResume

如何使用 FCM 和 Flutter(一个到另一个设备)发送推送通知?

Flutter iOS 和 Android 中的 FCM 自定义声音