Flutter firebase消息传递未收到通知

Posted

技术标签:

【中文标题】Flutter firebase消息传递未收到通知【英文标题】:Flutter firebase messaging not receiving notifications 【发布时间】:2019-10-08 18:13:05 【问题描述】:

我目前正在使用 firebase 消息处理颤振通知,但我收不到任何通知。我使用curl 通过服务器发送了通知,我可以让它在原生 android 应用程序(Android Studio)中工作,但不能在颤振中工作,任何帮助将不胜感激。下面是我的代码。

Flutter 通知代码

class FirebaseNotifications 
FirebaseMessaging _firebaseMessaging;

void setUpFirebase() 
_firebaseMessaging = FirebaseMessaging();
firebaseCloudMessaging_Listeners();


void firebaseCloudMessaging_Listeners() 
if (Platform.isios) iOS_Permission();

_firebaseMessaging.getToken().then((token) 
  print(token);
);

_firebaseMessaging.configure(
  onMessage: (Map<String, dynamic> message) async 
    print('on message $message');
  ,
  onResume: (Map<String, dynamic> message) async 
    print('on resume $message');
  ,
  onLaunch: (Map<String, dynamic> message) async 
    print('on launch $message');
  ,
);


void iOS_Permission() 
_firebaseMessaging.requestNotificationPermissions(
    IosNotificationSettings(sound: true, badge: true, alert: true));
_firebaseMessaging.onIosSettingsRegistered
    .listen((IosNotificationSettings settings) 
  print("Settings registered: $settings");
);


Android Studio 代码

@Override
public void onMessageReceived(RemoteMessage remoteMessage) 

    Map<String, String> params = remoteMessage.getData();

    JSONObject object = new JSONObject(params);

    showNotification(remoteMessage);


private void showNotification(RemoteMessage remoteMessage)  
Map data = remoteMessage.getData();

String mesg = "New Notification";

Intent intent;
    PendingIntent pendingIntent;
    NotificationCompat.Builder builder;

    Intent i = new Intent(this,MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    NotificationManager mNotificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 
        int importance = NotificationManager.IMPORTANCE_HIGH;
        NotificationChannel mChannel = new NotificationChannel(id, name, importance);
        mChannel.setDescription(description);
        mChannel.enableLights(true);
        mChannel.setLightColor(Color.GREEN);
        mChannel.enableVibration(true);
        mChannel.setVibrationPattern(new long[]0, 250, 250, 250);
        mNotificationManager.createNotificationChannel(mChannel);

        builder = new NotificationCompat.Builder(this, id);

        intent = new Intent(this, MainActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

        builder.setContentTitle(data.get("title").toString())  // required
                //.setStyle(new 
 NotificationCompat.BigTextStyle().bigText(remoteMessage.getNotification()
.getBod 
y().toString()))
                .setStyle(new 
NotificationCompat.BigTextStyle().bigText(mesg)) //custom data
                .setSmallIcon(R.drawable.ic_stat_notification_icon4) // 
required
              
                .setContentText(mesg) // custom data
                .setWhen(System.currentTimeMillis())
                .setDefaults(Notification.DEFAULT_ALL)
                
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
                .setAutoCancel(true)
                .setContentIntent(pendingIntent)
                .setVibrate(new long[]0, 250, 250, 250);
    

服务器端代码

function sendtoUser($sendingTarget, $acc_name, $type_message, 
$type_of_transaction, $check_amount)


#API access key from Google API's Console
$API_ACCESS_KEY = "adazxc";
$registrationIds = $sendingTarget;
#prep the bundle

$fields = array(
    'to'        => $registrationIds,
    'data' => array(
        'title' => 'my title',
        'keyValue' => true,
        'receiverName' => $acc_name,
        'transType' => $type_of_transaction,
        'totalAmount' => $check_amount
    ),
);

$headers = array(
    'Authorization: key=' . $API_ACCESS_KEY,
    'Content-Type: application/json'
);
#Send Reponse To FireBase Server
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://fcm.googleapis.com/fcm/send');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
$result = curl_exec($ch);
curl_close($ch);

编辑

我以某种方式可以收到通知,但我注意到我的状态栏没有收到通知,但它打印在控制台中,但是,当我关闭应用程序时,我可以收到通知。那么如何在这两种情况下接收通知呢?

【问题讨论】:

@androidnewbielearner我也有同样的问题,你看到解决了吗? 【参考方案1】:

data 标签仅用于将更多信息传输到应用程序,例如它必须重定向的位置、图像等。您必须添加notification 标签才能在状态栏上显示通知。

好像你没有添加通知内容,请参考下面的示例消息并进行相同的配置,它会起作用


   "notification": 
      "body": "body",
      "title": "title"
   ,
   "priority": "high",
   "data": 
      "click_action": "FLUTTER_NOTIFICATION_CLICK",
      "id": "1",
      "status": "done",
      "image": "https://ibin.co/2t1lLdpfS06F.png",
   ,
   "to": <fcm_token>

【讨论】:

【参考方案2】:

一些检查(版本号可能会改变):

将 google-services.json(从 firebase 控制台下载)添加到 安卓/应用/

在 android/build.gradle 中:

将 google() 添加到存储库 将类路径“com.google.gms:google-services:4.2.0”添加到依赖项

在android/app/build.gradle:

将实现“com.google.firebase:firebase-messaging:18.0.0”添加到 依赖关系 在末尾添加应用插件:'com.google.gms.google-services' 使 applicationId 与 package_name 中的相同 google-services.jon

【讨论】:

我不知何故可以收到通知,但我注意到我的状态栏没有收到通知,但它打印在控制台中,但是,当我关闭应用程序时,我可以收到通知。那么在这两种情况下我如何才能收到通知呢? 我遇到了同样的问题,你是怎么解决的。 androidnewbielearner 和 kenn,在颤振中,不会显示前台通知。您的应用状态必须为“已终止”或“已暂停”才能接收通知。但是,您必须在前台接收有效负载。如果需要,您可以将该数据显示为本地通知或警报【参考方案3】:

不管怎样,我今天收到onMessage 通知时遇到了问题(没有尝试onResumeonLaunch),而昨天它工作正常。 Functions 日志和令牌中没有错误都是一样的。

尝试重新启动您的设备 - 如果您的功能之前正常工作,这似乎是解决此问题的最一致的方法。

此外,如果一开始消息传递似乎很慢,这可能是由于您有一段时间不使用这些功能时冷启动所致(有关更多信息,请参阅此SO question)。

【讨论】:

【参考方案4】:

来自docs:

根据设备状态,传入消息的处理方式不同。

State Description
Foreground When the application is open, in view & in use.
Background When the application is open, however in the background (minimised). This typically occurs when the user has pressed the "home" button on the device, has switched to another app via the app switcher or has the application open on a different tab (web).
Terminated When the device is locked or the application is not running. The user can terminate an app by "swiping it away" via the app switcher UI on the device or closing a tab (web).

还有this:

默认情况下,当应用程序处于前台时到达的通知消息不会显示可见通知。

如果您的应用当前已打开并在前台,即使发送成功,通知也不会显示。您可以通过在通知事件处理程序中打开快餐栏来确认这一点,如下所示:

FirebaseMessaging.onMessage.listen((message) 
  print('Got a message whilst in the foreground!');

  if (message.notification != null) 
    final snackBar = SnackBar(
      content: Text(message.notification?.title ?? '', maxLines: 2),
    );
    ScaffoldMessenger.of(context).showSnackBar(snackBar);
  
);

如果您正在使用 android 并且希望在前台显示通知,您可以按照 FCM 文档 here 的建议使用 flutter_local_notifications 包。

【讨论】:

【参考方案5】:

这里已经提到了大部分场景。但是,除了@Zerj 提到的清单之外,我还想补充一点。

检查您的项目是否具有 dev、staging、prod 等环境风格。在这种情况下,google-services.json 文件将位于相应的文件夹(android/app/development 等)中,而不是位于 android/app 级别。 如果上述方法也给您带来了一些问题,您可以使用FirebaseOptions 类对风味的MainActivity 文件中的凭据进行硬编码。你可以找到用法here

更多关于口味的信息 - https://firebase.google.com/docs/projects/multiprojects

【讨论】:

【参考方案6】:

您可能会错过 android 的手动配置(以及 ios 如果需要),请参阅下面的链接

http://myhexaville.com/2018/04/09/flutter-push-notifications-with-firebase-cloud-messaging/

【讨论】:

此链接已损坏

以上是关于Flutter firebase消息传递未收到通知的主要内容,如果未能解决你的问题,请参考以下文章

Flutter Firebase 消息传递 - 应用打开时未显示推送通知

Flutter Firebase 通知消息传递

iOS 未收到来自 Firebase 云消息传递的通知

Web 应用程序中未收到 Firebase 云消息传递通知

Flutter 和 FCM(Firebase 云消息传递)onMessage、onResume 和 onLaunch 在单击通知时未触发(包:firebase_messaging 7.0.0)

设备未收到Firebase云消息传递通知