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

android firebase通知不起作用

曹鸿风
2023-03-14

我使用我的应用程序设置了 Firebase 消息,但不幸的是,通知没有出现。

我正确地设置了Firebase,它连接到我的应用程序,我也发送了一些测试消息,在Firebase中它说已完成,但是我没有在我的手机上收到它们。

我的应用程序还没有上市,我正在通过Android Studio开发和测试它。

这是我的MyFirebaseInstanceIDService类

public class MyFirebaseInstanceIDService extends FirebaseInstanceIdService {

private static final String TAG = "MyFirebaseIIDService";

/**
 * Called if InstanceID token is updated. This may occur if the security of
 * the previous token had been compromised. Note that this is called when the InstanceID token
 * is initially generated so this is where you would retrieve the token.
 */
// [START refresh_token]
@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.d(TAG, "Refreshed token: " + refreshedToken);


    // TODO: Implement this method to send any registration to your app's servers.
    sendRegistrationToServer(refreshedToken);
}
// [END refresh_token]

/**
 * Persist token to third-party servers.
 *
 * Modify this method to associate the user's FCM InstanceID token with any server-side account
 * maintained by your application.
 *
 * @param token The new token.
 */
private void sendRegistrationToServer(String token) {
    // Add custom implementation, as needed.
}

}

这里来了我的火库消息服务类:

公共类MyFirebaseMessagingService扩展了FirebaseMessagingService{私有静态最终字符串TAG="MyFirebaseMsgService";

/**
 * Called when message is received.
 *
 * @param remoteMessage Object representing the message received from Firebase Cloud Messaging.
 */
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // [START_EXCLUDE]
    // There are two types of messages data messages and notification messages. Data messages are handled
    // here in onMessageReceived whether the app is in the foreground or background. Data messages are the type
    // traditionally used with GCM. Notification messages are only received here in onMessageReceived when the app
    // is in the foreground. When the app is in the background an automatically generated notification is displayed.
    // When the user taps on the notification they are returned to the app. Messages containing both notification
    // and data payloads are treated as notification messages. The Firebase console always sends notification
    // messages. For more see: https://firebase.google.com/docs/cloud-messaging/concept-options
    // [END_EXCLUDE]


    //"Title","Message","NotyType",   "hotelStatus"

    String title = "";
    if (remoteMessage.getNotification().getTitle() != null){
        title = remoteMessage.getNotification().getTitle();
    }

    String message = "";
    if (remoteMessage.getNotification().getBody() != null){
        message = remoteMessage.getNotification().getBody();
    }

    Log.e("notification","recieved");


    sendNotification(title, message);
    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}
// [END receive_message]


private void sendNotification(String title, String body) {
    Intent i = new Intent(this, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pi = PendingIntent.getActivity(this,
            0 /* Request code */,
            i,
            PendingIntent.FLAG_ONE_SHOT);

    Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this,
            getString(R.string.default_notification_channel_id))
            .setSmallIcon(R.mipmap.ic_launcher)
            .setContentTitle(title)
            .setContentText(body)
            .setAutoCancel(true)
            .setSound(sound)
            .setContentIntent(pi);

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

    assert manager != null;
    manager.notify(0, builder.build());
} }

调试时没有看到任何html" target="_blank">日志,手机上也没有收到任何通知。

我在这里做错了什么吗?你能给点建议吗?谢谢。

共有2个答案

封锐藻
2023-03-14

哦,现在我尝试了一些东西!我更新了我的MyFirebaseMessagingService类,正如你现在在我的问题中看到的,现在它工作了!从Firebase控制台,我只发送消息,没有数据,所有的通知,我收到了我的设备!即使我的应用程序正在运行,即使我关闭了它!我收到的每一份通知。当应用程序运行时,通知有我的自定义图标,当应用程序关闭时,默认的“铃”图标在那里,但在这两种情况下,我收到了通知!不知道怎么可能,但确实有效。

董品
2023-03-14

onMessageReceived不会使用仅带有通知标记的推送发送来调用,并且您的应用程序不在前台。如果它确实在前台,将调用您的onMessageReceived。

如果您想触发onMessageReceived,则需要发送带有附加数据标记或仅带有数据标记的推送。

但是请注意,如果您同时发送通知和数据标记,则只有当应用程序位于前台时,才会触发onMessageReceived。如果应用程序位于后台,则数据标记内的所有内容都将作为附加内容在点击意图内传递

无论应用程序是否在前台,只有Data标记总是调用onMessageReceived。

例如:仅针对数据标记:)

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{ "data": {
    "score": "5x1",
    "time": "15:10"
  },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}
 类似资料:
  • 我正在尝试让Spring WebSocket(Spring 4)在我一直在做的项目中工作。到目前为止,我已经打开了WebSocket,添加了订阅者并发送了消息。 从昨天开始,我一直在试图弄清楚为什么我的endpoint不处理HTML中包含的stomp客户端发送的消息。控制台中实际上也没有错误(好吧,我不完全确定这里的“连接到服务器未定义”是什么意思)。 以下是Chrome控制台的输出: 这是我的代

  • 此代码未生成推送。 //自定义通知视图RemoteViews contentView=新建RemoteViews(getPackageName(),r.layout.custom_push);ContentView.SetImageViewResource(r.id.image,r.mipmap.ic_launcher);contentview.settextviewtext(r.id.title

  • 问题内容: 我在iOS上的FCM通知有问题。 我收到成功通知时,我的应用程序是在前台(回调中被激发),但是当应用程序在后台(我看不出在iOS中的通知栏的任何东西)我没有收到通知。 因此,我认为问题在于FCM发送的消息格式。我的服务器发送到FCM的json格式如下: 如您所见,我的json中有两个块:一个通知块(用于在后台接收通知)和一个数据块(用于在前台接收通知)。 我不明白为什么没有收到后台通知

  • 我无法在iOS设备上进行测试

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

  • 我们一直在通过Amazon SNS和Google Cloud Messaging(GCM)向Android设备发送消息。这是我们正在输入SNS发送消息功能的原始SNS json消息: 由于某种原因,带有和的“通知”部分似乎被忽略了。设备上未显示任何通知。 任何人都可以确认通知可以通过SNS发送,或者(正如我们所怀疑的那样)是否存在一些限制,其中只能理解json的数据部分?